Experimental Physics and Industrial Control System
**************
Modified
**************
# source files
(6) base-3.14.9/src/libCom/osi/epicsMutex.cpp
The function epicsMutexLockWithTimeout() is added.
(7) base-3.14.9/src/libCom/osi/epicsMutex.h
The constant LOG_LAST_OWNER is defined. The function
epicsMutexLockWithTimeout and epicsMutexOsdLockWithTimeout are
declared.
(8) base-3.14.9/src/libCom/osi/epicsThread.h
The function epicsThreadDelete is declared.
(9) base-3.14.9/src/libCom/osi/epicsTime.h
The function epicsTimeGetTicks is declared.
(10) base-3.14.9/src/libCom/osi/os/posix/osdMutex.c
The structure epicsMutexOSD is extended and the function
epicsMutexOsdLockWithTimeout is implemented.
(11) base-3.14.9/src/libCom/osi/os/posix/osdThread.c
The function epicsThreadDelete is implemented.
(12) base-3.14.9/src/libCom/osi/os/posix/osdTime.cpp
The function epicsTimeGetTicks is implemented.
(13) base-3.14.9/src/libCom/osi/os/vxWorks/iocClock.c
The function epicsTimeGetTicks is implemented.
(14) base-3.14.9/src/libCom/osi/os/vxWorks/osdMutex.c
The function epicsMutexOsdLockWithTimeout is implemented.
(15) base-3.14.9/src/libCom/osi/os/vxWorks/osdThread.c
The function epicsThreadDelete is implemented.
**************
Added
**************
(3) base-3.14.9/src/libCom/osi/os/Linux/osdFindSymbol.c
Implement the function epicsFindSymbol for Linux.
(4) base-3.14.9/src/libCom/osi/os/posix/osdFindSymbol.c
Implement the function epicsFindSymbol for posix.
Index: src/libCom/osi/epicsMutex.cpp
===================================================================
RCS file: /net/phoebus/epicsmgr/cvsroot/epics/base/src/libCom/osi/epicsMutex.cpp,v
retrieving revision 1.15.2.3
diff -u -b -r1.15.2.3 epicsMutex.cpp
--- src/libCom/osi/epicsMutex.cpp 27 Aug 2004 16:04:26 -0000 1.15.2.3
+++ src/libCom/osi/epicsMutex.cpp 12 Nov 2007 18:22:33 -0000
@@ -18,6 +18,12 @@
* the thread may have exited making the thread id invalid.
*/
+/************************************************************************
+modification history
+----------------------
+Jul.~Aug.,2007,A.Kazakov the function epicsMutexLockWithTimeout() is added.
+************************************************************************/
+
#include <new>
#include <stddef.h>
@@ -124,6 +130,20 @@
return status;
}
+epicsMutexLockStatus epicsShareAPI epicsMutexLockWithTimeout(
+ epicsMutexId pmutexNode, double timeout)
+{
+ epicsMutexLockStatus status =
+ epicsMutexOsdLockWithTimeout(pmutexNode->id, timeout);
+# ifdef LOG_LAST_OWNER
+ if ( status == epicsMutexLockOK ) {
+ pmutexNode->lastOwner = epicsThreadGetIdSelf();
+ }
+# endif
+ return status;
+}
+
+
epicsMutexLockStatus epicsShareAPI epicsMutexTryLock(
epicsMutexId pmutexNode)
{
@@ -143,7 +163,7 @@
# ifdef LOG_LAST_OWNER
char threadName [255];
if ( pmutexNode->lastOwner ) {
-# error currently not safe to fetch name for stale thread
+//# error currently not safe to fetch name for stale thread
epicsThreadGetName ( pmutexNode->lastOwner,
threadName, sizeof ( threadName ) );
}
Index: src/libCom/osi/epicsMutex.h
===================================================================
RCS file: /net/phoebus/epicsmgr/cvsroot/epics/base/src/libCom/osi/epicsMutex.h,v
retrieving revision 1.26.2.1
diff -u -b -r1.26.2.1 epicsMutex.h
--- src/libCom/osi/epicsMutex.h 17 Sep 2003 19:25:30 -0000 1.26.2.1
+++ src/libCom/osi/epicsMutex.h 12 Nov 2007 18:22:33 -0000
@@ -10,6 +10,17 @@
#ifndef epicsMutexh
#define epicsMutexh
+/************************************************************************
+modification history
+----------------------
+Jul.~Aug.,2007,A.Kazakov (1)the constants LOG_LAST_OWNER is defined.
+ (2)the function epicsMutexLockWithTimeout is declared.
+ (3)the function epicsMutexOsdLockWithTimeout is declared.
+************************************************************************/
+
+/* added by A.Kazakov */
+#define LOG_LAST_OWNER
+
#include "epicsAssert.h"
#include "shareLib.h"
@@ -72,6 +83,11 @@
epicsShareFunc void epicsShareAPI epicsMutexUnlock(epicsMutexId id);
epicsShareFunc epicsMutexLockStatus epicsShareAPI epicsMutexLock(
epicsMutexId id);
+
+/* added by A.Kazakov */
+epicsShareFunc epicsMutexLockStatus epicsShareAPI epicsMutexLockWithTimeout(
+ epicsMutexId id, double timeout);
+
#define epicsMutexMustLock(ID) assert((epicsMutexLock((ID))==epicsMutexLockOK))
epicsShareFunc epicsMutexLockStatus epicsShareAPI epicsMutexTryLock(
epicsMutexId id);
@@ -94,6 +110,10 @@
void epicsMutexOsdDestroy(struct epicsMutexOSD *);
void epicsMutexOsdUnlock(struct epicsMutexOSD *);
epicsMutexLockStatus epicsMutexOsdLock(struct epicsMutexOSD *);
+
+/* added by A.Kazakov */
+epicsMutexLockStatus epicsMutexOsdLockWithTimeout(struct epicsMutexOSD *, double);
+
epicsMutexLockStatus epicsMutexOsdTryLock(struct epicsMutexOSD *);
void epicsMutexOsdShow(struct epicsMutexOSD *,unsigned int level);
Index: src/libCom/osi/epicsThread.h
===================================================================
RCS file: /net/phoebus/epicsmgr/cvsroot/epics/base/src/libCom/osi/epicsThread.h,v
retrieving revision 1.17.2.12
diff -u -b -r1.17.2.12 epicsThread.h
--- src/libCom/osi/epicsThread.h 28 Nov 2006 21:23:25 -0000 1.17.2.12
+++ src/libCom/osi/epicsThread.h 12 Nov 2007 18:22:33 -0000
@@ -7,6 +7,13 @@
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
+
+/************************************************************************
+modification history
+----------------------
+Jul.~Aug.,2007,A.Kazakov the function epicsThreadDelete is declared.
+************************************************************************/
+
#ifndef epicsThreadh
#define epicsThreadh
@@ -72,6 +79,10 @@
const char * name, unsigned int priority, unsigned int stackSize,
EPICSTHREADFUNC funptr,void * parm );
epicsShareFunc void epicsShareAPI epicsThreadSuspendSelf(void);
+
+/* added by A.Kazakov */
+epicsShareFunc int epicsShareAPI epicsThreadDelete(epicsThreadId id);
+
epicsShareFunc void epicsShareAPI epicsThreadResume(epicsThreadId id);
epicsShareFunc unsigned int epicsShareAPI epicsThreadGetPriority(
epicsThreadId id);
Index: src/libCom/osi/epicsTime.h
===================================================================
RCS file: /net/phoebus/epicsmgr/cvsroot/epics/base/src/libCom/osi/epicsTime.h,v
retrieving revision 1.14.2.3
diff -u -b -r1.14.2.3 epicsTime.h
--- src/libCom/osi/epicsTime.h 29 Jun 2006 15:28:36 -0000 1.14.2.3
+++ src/libCom/osi/epicsTime.h 12 Nov 2007 18:22:33 -0000
@@ -10,6 +10,12 @@
/* epicsTime.h */
/* Author Jeffrey O. Hill */
+/************************************************************************
+modification history
+----------------------
+Jul.~Aug.,2007,A.Kazakov the function epicsTimeGetTicks is declared.
+************************************************************************/
+
#ifndef epicsTimehInclude
#define epicsTimehInclude
@@ -183,6 +189,10 @@
#define epicsTimeEventDeviceTime -2
epicsShareFunc int epicsShareAPI epicsTimeGetCurrent ( epicsTimeStamp * pDest );
+
+/* added by A.Kazakov */
+epicsShareFunc clock_t epicsShareAPI epicsTimeGetTicks ();
+
epicsShareFunc int epicsShareAPI epicsTimeGetEvent (
epicsTimeStamp *pDest, int eventNumber);
Index: src/libCom/osi/os/Linux/osdFindSymbol.c
===================================================================
--- /dev/null 2007-11-05 13:05:14.280278523 -0600
+++ src/libCom/osi/os/Linux/osdFindSymbol.c 2007-11-01 08:20:40.000000000 -0500
@@ -0,0 +1,17 @@
+/* osi/os/Linux/osdFindSymbol.c */
+
+/*
+ * Author: A.Kazakov
+ * Date: Jul.~Aug. 2007
+ *
+ */
+
+#include <dlfcn.h>
+#include "epicsFindSymbol.h"
+epicsShareFunc void * epicsShareAPI epicsFindSymbol(const char *name)
+{
+ void *ptr;
+ ptr = dlopen(0,RTLD_LOCAL | RTLD_LAZY);
+ return dlsym(ptr, name);
+}
+
Index: src/libCom/osi/os/posix/osdFindSymbol.c
===================================================================
--- /dev/null 2007-11-05 13:05:14.280278523 -0600
+++ src/libCom/osi/os/posix/osdFindSymbol.c 2007-11-01 08:20:40.000000000 -0500
@@ -0,0 +1,16 @@
+/* osi/os/posix/osdFindSymbol.c */
+
+/*
+ * Author: A.Kazakov
+ * Date: Jul.~Aug. 2007
+ *
+ */
+
+#include <dlfcn.h>
+#include "epicsFindSymbol.h"
+epicsShareFunc void * epicsShareAPI epicsFindSymbol(const char *name)
+{
+ return dlsym(RTLD_DEFAULT, name);
+}
+
+
Index: src/libCom/osi/os/posix/osdMutex.c
===================================================================
RCS file: /net/phoebus/epicsmgr/cvsroot/epics/base/src/libCom/osi/os/posix/osdMutex.c,v
retrieving revision 1.18.2.4
diff -u -b -r1.18.2.4 osdMutex.c
--- src/libCom/osi/os/posix/osdMutex.c 21 Mar 2005 14:44:00 -0000 1.18.2.4
+++ src/libCom/osi/os/posix/osdMutex.c 12 Nov 2007 18:22:33 -0000
@@ -11,6 +11,13 @@
/* Author: Marty Kraimer Date: 13AUG1999 */
+/************************************************************************
+modification history
+----------------------
+Jul.~Aug.,2007,A.Kazakov the structure epicsMutexOSD is extended and the
+ function epicsMutexOsdLockWithTimeout is implemented.
+************************************************************************/
+
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
@@ -20,6 +27,9 @@
#include <unistd.h>
#include <pthread.h>
+/* added by A.Kazakov */
+#include "epicsThread.h"
+
#include "epicsMutex.h"
#include "cantProceed.h"
#include "epicsTime.h"
@@ -68,11 +78,19 @@
* a much more complicated solution is required
*/
+/* #if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE)>=500 */
+/* changed by A.Kazakov */
+#if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE)>=500 || defined(darwin)
-#if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE)>=500
typedef struct epicsMutexOSD {
pthread_mutexattr_t mutexAttr;
pthread_mutex_t lock;
+
+ /*** cond and timeLock are used for "timed" mutex lock, by A.Kazakov */
+ /*------------------------------------------------------------------*/
+ pthread_cond_t cond;
+ pthread_mutex_t timeLock;
+ /*------------------------------------------------------------------*/
}epicsMutexOSD;
epicsMutexOSD * epicsMutexOsdCreate(void) {
@@ -91,6 +109,15 @@
if(errVerbose) checkStatus(status,"pthread_mutexattr_settype");
status = pthread_mutex_init(&pmutex->lock,&pmutex->mutexAttr);
checkStatusQuit(status,"pthread_mutex_init","epicsMutexOsdCreate");
+
+ /* added by A.Kazakov */
+ /*------------------------------------------------------------------*/
+ status = pthread_mutex_init(&pmutex->timeLock,0);
+ checkStatusQuit(status,"pthread_mutex_init","epicsMutexOsdCreate");
+ status = pthread_cond_init(&pmutex->cond,0);
+ checkStatusQuit(status,"pthread_cond_init","epicsMutexOsdCreate");
+ /*------------------------------------------------------------------*/
+
return(pmutex);
}
@@ -111,6 +138,12 @@
status = pthread_mutex_unlock(&pmutex->lock);
checkStatusQuit(status,"pthread_mutex_unlock","epicsMutexOsdUnlock");
+
+ /* added by A.Kazakov */
+ /*------------------------------------------------------------------*/
+ status = pthread_cond_signal(&pmutex->cond);
+ checkStatusQuit(status,"pthread_cond_signal","epicsMutexOsdUnlock");
+ /*------------------------------------------------------------------*/
}
epicsMutexLockStatus epicsMutexOsdLock(struct epicsMutexOSD * pmutex)
@@ -123,6 +156,33 @@
return(epicsMutexLockOK);
}
+/* added by A.Kazakov */
+/*----------------------------------------------------------------------------------------------*/
+epicsMutexLockStatus epicsMutexOsdLockWithTimeout(struct epicsMutexOSD *pmutex, double timeout)
+{
+ int status, unlockStatus;
+ pthread_mutex_t *id = &pmutex->lock;
+ struct timespec wakeTime,now;
+ convertDoubleToWakeTime(timeout,&wakeTime);
+
+ while(1) {
+ status = pthread_mutex_trylock(id);
+ if (status == 0) return (epicsMutexLockOK);
+ if (status == EBUSY) {
+ status = mutexLock(&pmutex->timeLock);
+ checkStatusQuit(status,"phtread_mutex_lock","epictMutexOsdLockWithTimeout");
+ status = pthread_cond_timedwait(&pmutex->cond,&pmutex->timeLock,&wakeTime);
+ unlockStatus = pthread_mutex_unlock(&pmutex->timeLock);
+ checkStatusQuit(unlockStatus,"pthread_mutex_unlock", "epicsMutexOsdLockWithTimeout");
+ if (status == ETIMEDOUT) break;
+ checkStatusQuit(status,"pthread_cond_timedwait", "epicsMutexOsdLockWithTimeout");
+ } else
+ checkStatusQuit(status,"pthread_mutex_trylock", "epicsMutexOsdLockWithTimeout");
+ }
+ return epicsMutexLockTimeout;
+}
+/*----------------------------------------------------------------------------------------------*/
+
epicsMutexLockStatus epicsMutexOsdTryLock(struct epicsMutexOSD * pmutex)
{
int pthreadStatus;
Index: src/libCom/osi/os/posix/osdThread.c
===================================================================
RCS file: /net/phoebus/epicsmgr/cvsroot/epics/base/src/libCom/osi/os/posix/osdThread.c,v
retrieving revision 1.67.2.30
diff -u -b -r1.67.2.30 osdThread.c
--- src/libCom/osi/os/posix/osdThread.c 7 Dec 2006 00:48:53 -0000 1.67.2.30
+++ src/libCom/osi/os/posix/osdThread.c 12 Nov 2007 18:22:33 -0000
@@ -12,6 +12,13 @@
/* Author: Marty Kraimer Date: 18JAN2000 */
/* This is a posix implementation of epicsThread */
+
+/************************************************************************
+modification history
+----------------------
+Jul.~Aug.,2007,A.Kazakov the function epicsThreadDelete is implemented.
+************************************************************************/
+
#include <stddef.h>
#include <stdlib.h>
#include <stddef.h>
@@ -488,6 +495,14 @@
epicsEventMustWait(pthreadInfo->suspendEvent);
}
+/* added by A.Kazakov */
+/*--------------------------------------*/
+int epicsThreadDelete(epicsThreadId id)
+{
+ return pthread_cancel(id->tid);
+}
+/*--------------------------------------*/
+
void epicsThreadResume(epicsThreadOSD *pthreadInfo)
{
assert(epicsThreadOnceCalled);
Index: src/libCom/osi/os/posix/osdTime.cpp
===================================================================
RCS file: /net/phoebus/epicsmgr/cvsroot/epics/base/src/libCom/osi/os/posix/osdTime.cpp,v
retrieving revision 1.15.2.2
diff -u -b -r1.15.2.2 osdTime.cpp
--- src/libCom/osi/os/posix/osdTime.cpp 25 Oct 2004 14:50:18 -0000 1.15.2.2
+++ src/libCom/osi/os/posix/osdTime.cpp 12 Nov 2007 18:22:33 -0000
@@ -13,11 +13,20 @@
// into a different header
//
+/************************************************************************
+modification history
+----------------------
+Jul.~Aug.,2007,A.Kazakov the function epicsTimeGetTicks is implemented.
+************************************************************************/
+
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+// added by A.Kazakov
+#include <sys/times.h>
+
#include "osiSock.h"
#include "cantProceed.h"
@@ -55,6 +64,16 @@
# endif
}
+/* get system time in Ticks, added by A.Kazakov */
+/*----------------------------------------------------------------*/
+extern "C" epicsShareFunc clock_t epicsShareAPI epicsTimeGetTicks ()
+{
+ struct tms tp;
+ return (times(&tp));
+}
+/*----------------------------------------------------------------*/
+
+
//
// epicsTimeGetEvent ()
//
Index: src/libCom/osi/os/vxWorks/iocClock.c
===================================================================
RCS file: /net/phoebus/epicsmgr/cvsroot/epics/base/src/libCom/osi/os/vxWorks/iocClock.c,v
retrieving revision 1.10.2.2
diff -u -b -r1.10.2.2 iocClock.c
--- src/libCom/osi/os/vxWorks/iocClock.c 23 Apr 2004 17:56:07 -0000 1.10.2.2
+++ src/libCom/osi/os/vxWorks/iocClock.c 12 Nov 2007 18:22:33 -0000
@@ -11,6 +11,12 @@
/* Author: Marty Kraimer Date: 16JUN2000 */
+/************************************************************************
+modification history
+----------------------
+Jul.~Aug.,2007,A.Kazakov the function epicsTimeGetTicks is implemented.
+************************************************************************/
+
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
@@ -238,3 +244,14 @@
"%Y/%m/%d %H:%M:%S.%06f",&now);
printf("%s\n",nowText);
}
+
+
+/* get system time in Ticks, added by A.Kazakov */
+/*---------------------------------------------------------*/
+epicsShareFunc clock_t epicsShareAPI epicsTimeGetTicks ()
+{
+ return (tickGet());
+}
+/*---------------------------------------------------------*/
+
+
Index: src/libCom/osi/os/vxWorks/osdMutex.c
===================================================================
RCS file: /net/phoebus/epicsmgr/cvsroot/epics/base/src/libCom/osi/os/vxWorks/osdMutex.c,v
retrieving revision 1.9
diff -u -b -r1.9 osdMutex.c
--- src/libCom/osi/os/vxWorks/osdMutex.c 11 Dec 2002 23:21:29 -0000 1.9
+++ src/libCom/osi/os/vxWorks/osdMutex.c 12 Nov 2007 18:22:33 -0000
@@ -11,6 +11,12 @@
/* Author: Marty Kraimer Date: 25AUG99 */
+/************************************************************************
+modification history
+----------------------
+Jul.~Aug.,2007,A.Kazakov the function epicsMutexOsdLockWithTimeout is implemented.
+************************************************************************/
+
#include <vxWorks.h>
#include <semLib.h>
#include <time.h>
@@ -47,3 +53,17 @@
{
semShow((SEM_ID)id,level);
}
+
+/* added by A.Kazakov */
+/*------------------------------------------------------------------------*/
+epicsMutexLockStatus epicsMutexOsdLockWithTimeout(struct epicsMutexOSD * id,
+ double timeout)
+{
+ int status;
+ status = semTake((SEM_ID)id, timeout*sysClkRateGet());
+ if(status==OK) return (epicsMutexLockOK);
+ if(errno==S_objLib_OBJ_UNAVAILABLE) return(epicsMutexLockTimeout);
+ return(epicsMutexLockError);
+}
+/*------------------------------------------------------------------------*/
+
Index: src/libCom/osi/os/vxWorks/osdThread.c
===================================================================
RCS file: /net/phoebus/epicsmgr/cvsroot/epics/base/src/libCom/osi/os/vxWorks/osdThread.c,v
retrieving revision 1.35.2.11
diff -u -b -r1.35.2.11 osdThread.c
--- src/libCom/osi/os/vxWorks/osdThread.c 7 Dec 2006 00:49:10 -0000 1.35.2.11
+++ src/libCom/osi/os/vxWorks/osdThread.c 12 Nov 2007 18:22:33 -0000
@@ -11,6 +11,12 @@
/* Author: Marty Kraimer Date: 25AUG99 */
+/************************************************************************
+modification history
+----------------------
+Jul.~Aug.,2007,A.Kazakov the function epicsThreadDelete is implemented.
+************************************************************************/
+
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
@@ -379,3 +385,11 @@
double HZ = sysClkRateGet ();
return 1.0 / HZ;
}
+
+/* added by A.Kazakov */
+/*------------------------------------------------------------------------*/
+epicsShareFunc int epicsShareAPI epicsThreadDelete(epicsThreadId id)
+{
+ return (taskDelete(id));
+}
+/*------------------------------------------------------------------------*/
- Replies:
- Re: Redundancy Patch: libCom Andrew Johnson
- Navigate by Date:
- Prev:
Redundancy Patch: configure Andrew Johnson
- Next:
Redundancy Patch: db Andrew Johnson
- Index:
2002
2003
2004
2005
2006
<2007>
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
- Navigate by Thread:
- Prev:
Re: Redundancy Patch: configure Liu, Gongfa
- Next:
Re: Redundancy Patch: libCom Andrew Johnson
- Index:
2002
2003
2004
2005
2006
<2007>
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024