EPICS Controls Argonne National Laboratory

Experimental Physics and
Industrial Control System

2002  2003  2004  2005  2006  <20072008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024  Index 2002  2003  2004  2005  2006  <20072008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: Redundancy Patch: libCom
From: Andrew Johnson <[email protected]>
To: EPICS core-talk <[email protected]>
Date: Thu, 15 Nov 2007 17:36:41 -0600
**************
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  <20072008  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  <20072008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
ANJ, 02 Feb 2012 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·