FARGOS/VISTA Object Management Environment Core  ..
FARGOS/VISTA Object Management Environment Core Table of Contents
timed_mutex.hpp
Go to the documentation of this file.
1 #ifndef _TIMED_MUTEX_HPP_
2 #define _TIMED_MUTEX_HPP_ "$Id: timed_mutex.hpp 454 2020-07-23 20:22:23Z geoff $"
4 /* Copyright (C) 2010 - 2019 FARGOS Development, LLC */
6 
7 #include <string>
8 #include <stdint.h>
9 
10 #ifdef _WIN32
11 #include <winsock2.h>
12 #include <windows.h>
13 #define OME_MUTEX_TYPE CRITICAL_SECTION
14 #define OME_CONDITION_TYPE HANDLE
15 #else
16 #include <pthread.h>
17 #define OME_MUTEX_TYPE pthread_mutex_t
18 #define OME_CONDITION_TYPE pthread_cond_t
19 #endif /* _WIN32 */
20 
23 
34 #define _TOKEN_TO_STRING(x) #x
36 #define _EXPAND_TOKEN_TO_STRING(x) _TOKEN_TO_STRING(x)
37 #define THIS_FILE_AND_LINE(f,l) f ":" _EXPAND_TOKEN_TO_STRING(l)
38 
39 #ifndef HIDE_TIMED_MUTEX_STATISTICS
40  #if BLDFLAG_optimized == 1
41  /* hide when optimized */
42  #define HIDE_TIMED_MUTEX_STATISTICS 1
43  #else
44  #define HIDE_TIMED_MUTEX_STATISTICS 0
45  #endif
46 #endif
47 
51 class TimedMutex {
52 friend class TimedCondition; // expose statistics
53 protected:
56  public:
57 #if HIDE_TIMED_MUTEX_STATISTICS == 0
67 #else
68  uint64_t lockRequestedAt;
69  uint64_t totalDelayTicks;
70  uint64_t lockObtainedAt;
71  uint64_t totalHeldTicks;
72  uint64_t lockHeldBy;
73  uint32_t locksWanted;
74  uint32_t locksObtained;
75  const char *lockLocation;
76 #endif
77  TimedMutexStatistics(const char *name, SharedMemoryVariableNode *parentNode);
78 
79  TimedMutexStatistics(const char *name, SharedMemoryVariableManager *mgr);
80 
82 
83  }; // end internal class TimedMutexStatistics
84 
86  uint64_t obtainedAt;
88 
89  int64_t acquireLock();
90 
91 public:
100  explicit TimedMutex(const char *lockName, SharedMemoryVariableNode *parentNode,
101  bool recursive=false);
102 
111  explicit TimedMutex(const char *lockName=nullptr,
113  bool recursive=false);
114 
115  ~TimedMutex();
116 
129  int64_t lock(const char *place=nullptr) OME_ALWAYS_INLINE {
130  int64_t result = acquireLock();
131 #if HIDE_TIMED_MUTEX_STATISTICS == 0
132  if ((statistics != nullptr) && (place != nullptr)) {
133  statistics->lockLocation = place;
134  }
135 #endif
136  return (result);
137  }
138 
144  inline int64_t untimedLock() OME_ALWAYS_INLINE {
145 #ifdef _WIN32
146  EnterCriticalSection(&mutex);
147 #else
148  pthread_mutex_lock(&mutex);
149 #endif
150  return (0);
151  }
152 
162  int64_t unlock();
163 
169  inline int64_t untimedUnlock() OME_ALWAYS_INLINE {
170 #ifdef _WIN32
171  LeaveCriticalSection(&mutex);
172 #else
173  pthread_mutex_unlock(&mutex);
174 #endif
175  return (0);
176  }
177 
181  return (&mutex);
182  }
183 
189  const char *getMutexName() const NONNULL_RETURN {
190 #if HIDE_TIMED_MUTEX_STATISTICS == 0
191  if (statistics != nullptr) {
192  return (statistics->namingNode.getName());
193  }
194 #endif
195  return ("TimedMutex");
196  }
197 
204 #if HIDE_TIMED_MUTEX_STATISTICS == 0
205  if (statistics != nullptr) {
206  return (statistics->lockHeldBy);
207  }
208 #endif
209  return (0);
210  }
211 }; // end class TimedMutex
212 
213 
217 protected:
220  public:
221 #if HIDE_TIMED_MUTEX_STATISTICS == 0
230 #else
231  uint64_t waitStartedAt;
232  uint64_t waitCompletedAt;
233  uint64_t totalWaitTicks;
234  uint64_t totalPostEvents;
235  uint32_t waitsStarted;
236  uint32_t waitsCompleted;
237  const char *waitLocation;
238 #endif
239  TimedConditionStatistics(const char *name, SharedMemoryVariableNode *parentNode);
240 
242 
244 
245  }; // end internal class TimedConditionStatistics
246 
247 
249  uint64_t startedAt;
252  bool active;
253 public:
264  explicit TimedCondition(TimedMutex *m, const char *conditionName,
266 
277  explicit TimedCondition(TimedMutex *m, const char *conditionName=nullptr,
279 
280  ~TimedCondition();
281 
286  return (mutex);
287  }
288 
292  return (&condition);
293  }
294 
305  int64_t waitForCondition(const char *waitingHere=nullptr);
306 
321  int64_t waitForConditionOrUntil(const struct timespec *timeout,
322  const char *waitingHere=nullptr) NONNULL_CLASS_PARAMETERS(2);
323 
333  int postCondition();
334 
338  inline bool isSleeping() const OME_ALWAYS_INLINE {
339  return (active);
340  }
341 
348  const char *getConditionName() const NONNULL_RETURN {
349 #if HIDE_TIMED_MUTEX_STATISTICS == 0
350  if (statistics != nullptr) {
351  return (statistics->namingNode.getName());
352  }
353 #endif
354  return ("TimedCondition");
355  }
356 
366  int64_t lock(const char *place=nullptr) OME_ALWAYS_INLINE {
367  return (mutex->lock(place));
368  }
369 
375  inline int64_t untimedLock() OME_ALWAYS_INLINE {
376  return (mutex->untimedLock());
377  }
378 
386  return (mutex->unlock());
387  }
388 
394  inline int64_t untimedUnlock() OME_ALWAYS_INLINE {
395  return (mutex->untimedLock());
396  }
397 
402  return (mutex->mutex_address());
403  }
404 }; // end class TimedCondition
405 
409 #define LOCK_HERE() lock(THIS_FILE_AND_LINE(__FILE__,__LINE__))
410 
414 #define WAIT_HERE() waitForCondition(THIS_FILE_AND_LINE(__FILE__,__LINE__))
415 
419 #define WAIT_HERE_UNTIL(timeout) waitForConditionOrUntil(timeout, THIS_FILE_AND_LINE(__FILE__,__LINE__))
420 
424 #endif
425 
426 /* vim: set expandtab shiftwidth=4 tabstop=4: */
clock_gettime_via_tick
int clock_gettime_via_tick(struct timespec *result, bool force) OME_ALWAYS_INLINE OME_ALWAYS_OPTIMIZE("-O3")
Definition: tick_time.h:290
TimedMutex::mutex
OME_MUTEX_TYPE mutex
Definition: timed_mutex.hpp:87
SharedMemoryVariable::getName
const char * getName(uint_fast32_t *retNameLen=nullptr) const OME_ALWAYS_INLINE
Get variable name.
Definition: shared_variable.hpp:135
TimedMutex::obtainedAt
uint64_t obtainedAt
Definition: timed_mutex.hpp:86
TimedMutex::TimedMutex
TimedMutex(const char *lockName, SharedMemoryVariableNode *parentNode, bool recursive=false)
Implements generic mutex with performance counters.
Definition: timed_mutex.cpp:55
TimedCondition::lock
int64_t lock(const char *place=nullptr) OME_ALWAYS_INLINE
Convenience routine to lock the associated mutex.
Definition: timed_mutex.hpp:366
TimedMutex::untimedUnlock
int64_t untimedUnlock() OME_ALWAYS_INLINE
Unlock the mutex, but maintain neither usage nor timing statistics.
Definition: timed_mutex.hpp:169
TimedMutex::unlock
int64_t unlock()
Release a previously locked mutex.
Definition: timed_mutex.cpp:156
TimedCondition::waitForConditionOrUntil
int64_t waitForConditionOrUntil(const struct timespec *timeout, const char *waitingHere=nullptr) NONNULL_CLASS_PARAMETERS(2)
Wait for the condition to be posted or until a specified point in time.
Definition: timed_mutex.cpp:309
SMV_StandaloneNumeric< uint64_t >
TimedMutex::getThreadIdOfCurrentOwner
uint64_t getThreadIdOfCurrentOwner() const OME_ALWAYS_INLINE
Return thread id of thread holding lock.
Definition: timed_mutex.hpp:203
TimedMutex::~TimedMutex
~TimedMutex()
Definition: timed_mutex.cpp:108
TimedMutex::TimedMutexStatistics::totalDelayTicks
SMV_StandaloneNumeric< uint64_t > totalDelayTicks
Definition: timed_mutex.hpp:60
TimedMutex::TimedMutexStatistics::namingNode
SharedMemoryVariableNode namingNode
Definition: timed_mutex.hpp:58
TimedMutex::TimedMutexStatistics::~TimedMutexStatistics
~TimedMutexStatistics()
Definition: timed_mutex.hpp:81
TimedCondition::unlock
int64_t unlock() OME_ALWAYS_INLINE
Convenience routine to release previously locked mutex associated with the condition variable.
Definition: timed_mutex.hpp:385
TimedCondition::statistics
TimedConditionStatistics * statistics
Definition: timed_mutex.hpp:248
SharedMemoryVariableNode
Intermediate naming node for supporting variable naming hierarchies.
Definition: shared_variable.hpp:318
TimedMutex::TimedMutexStatistics::lockHeldBy
SMV_StandaloneNumeric< uint64_t > lockHeldBy
Definition: timed_mutex.hpp:63
NONNULL_CLASS_PARAMETERS
#define NONNULL_CLASS_PARAMETERS(...)
Mark a function as never returning a null pointer.
Definition: compiler_hints.h:337
TimedCondition::TimedCondition
TimedCondition(TimedMutex *m, const char *conditionName, SharedMemoryVariableNode *parentNode) NONNULL_CLASS_PARAMETERS(2)
Implements generic condition variable with performance counters.
Definition: timed_mutex.cpp:218
TimedCondition::TimedConditionStatistics::waitsCompleted
SMV_StandaloneNumeric< int32_t > waitsCompleted
Definition: timed_mutex.hpp:228
SMV_StandaloneString< 128 >
TimedCondition::postCondition
int postCondition()
Notify any sleeping threads that the condition has occurred.
Definition: timed_mutex.cpp:358
TimedMutex::getMutexName
const char * getMutexName() const NONNULL_RETURN
Return name of mutex.
Definition: timed_mutex.hpp:189
TimedMutex::lock
int64_t lock(const char *place=nullptr) OME_ALWAYS_INLINE
Lock the mutex.
Definition: timed_mutex.hpp:129
TimedCondition::untimedLock
int64_t untimedLock() OME_ALWAYS_INLINE
Convenience routine to lock the associated mutex, but maintain neither usage nor timing statistics.
Definition: timed_mutex.hpp:375
TimedMutex::TimedMutexStatistics::totalHeldTicks
SMV_StandaloneNumeric< uint64_t > totalHeldTicks
Definition: timed_mutex.hpp:62
TimedMutex::acquireLock
int64_t acquireLock()
Definition: timed_mutex.cpp:118
TimedMutex::TimedMutexStatistics::TimedMutexStatistics
TimedMutexStatistics(const char *name, SharedMemoryVariableNode *parentNode)
Definition: timed_mutex.cpp:12
TimedCondition::TimedConditionStatistics::waitLocation
SMV_StandaloneString< 128 > waitLocation
Definition: timed_mutex.hpp:229
TimedCondition::startedAt
uint64_t startedAt
Definition: timed_mutex.hpp:249
TimedCondition::TimedConditionStatistics::waitsStarted
SMV_StandaloneNumeric< int32_t > waitsStarted
Definition: timed_mutex.hpp:227
srcID
const char srcID[]
Definition: catSym.c:17
timed_mutex.hpp
TimedMutex::statistics
TimedMutexStatistics * statistics
Definition: timed_mutex.hpp:85
DEFAULT_sharedMemoryVariableManager
SharedMemoryVariableManager DEFAULT_sharedMemoryVariableManager
Default shared memory variable manager.
TimedCondition::TimedConditionStatistics::TimedConditionStatistics
TimedConditionStatistics(const char *name, SharedMemoryVariableNode *parentNode)
Definition: timed_mutex.cpp:180
TimedMutex::TimedMutexStatistics
Statistics for a TimedMutex object.
Definition: timed_mutex.hpp:55
OME_MUTEX_TYPE
#define OME_MUTEX_TYPE
Definition: timed_mutex.hpp:17
OME_EXPECT_TRUE
#define OME_EXPECT_TRUE(expr)
Annotation macro for conditional expression expected to be true.
Definition: compiler_hints.h:541
TimedCondition::getMutex
TimedMutex * getMutex() const OME_ALWAYS_INLINE NONNULL_RETURN
Return address of mutex object associated with the condition variable.
Definition: timed_mutex.hpp:285
TimedCondition::active
bool active
Definition: timed_mutex.hpp:252
TimedMutex::TimedMutexStatistics::lockRequestedAt
SMV_StandaloneNumeric< uint64_t > lockRequestedAt
Definition: timed_mutex.hpp:59
TimedMutex
Generic mutex implementation that supports timing statistics.
Definition: timed_mutex.hpp:51
TimedCondition::isSleeping
bool isSleeping() const OME_ALWAYS_INLINE
Return a Boolean indication of whether or not a thread is sleeping.
Definition: timed_mutex.hpp:338
NULL
#define NULL
Definition: tmp.o.cpp:327
OME_CONDITION_TYPE
#define OME_CONDITION_TYPE
Definition: timed_mutex.hpp:18
TimedCondition::~TimedCondition
~TimedCondition()
Definition: timed_mutex.cpp:262
PTHREAD_MUTEX_RECURSIVE
#define PTHREAD_MUTEX_RECURSIVE
Definition: tmp.o.cpp:437
TimedCondition
Generic condition variable for use with the TimedMutex class.
Definition: timed_mutex.hpp:216
TimedCondition::TimedConditionStatistics::~TimedConditionStatistics
~TimedConditionStatistics()
Definition: timed_mutex.hpp:243
shared_variable.hpp
FARGOS Shared Memory Variable routines.
OME_USED
const char srcID[] OME_USED
Definition: tick_time.cpp:24
TimedMutex::untimedLock
int64_t untimedLock() OME_ALWAYS_INLINE
Lock the mutex, but maintain neither usage nor timing statistics.
Definition: timed_mutex.hpp:144
TimedMutex::TimedMutexStatistics::locksWanted
SMV_StandaloneNumeric< int32_t > locksWanted
Definition: timed_mutex.hpp:64
TimedCondition::untimedUnlock
int64_t untimedUnlock() OME_ALWAYS_INLINE
Convenience routine to unlock the mutex associated with the condition variable, but maintain neither ...
Definition: timed_mutex.hpp:394
SharedMemoryVariableManager
Manager for collection of shared memory variables.
Definition: shared_variable.hpp:193
compiler_hints.h
Compiler-specific macros to provide performance-related hints.
TimedMutex::mutex_address
OME_MUTEX_TYPE * mutex_address() OME_ALWAYS_INLINE NONNULL_RETURN
Get address of underlying native mutex.
Definition: timed_mutex.hpp:180
OME_ALWAYS_INLINE
#define OME_ALWAYS_INLINE
Tell the compiler to alway inline a function, regardless of optimization level.
Definition: compiler_hints.h:364
TimedMutex::TimedMutexStatistics::locksObtained
SMV_StandaloneNumeric< int32_t > locksObtained
Definition: timed_mutex.hpp:65
TimedCondition::getConditionName
const char * getConditionName() const NONNULL_RETURN
Return name of condition variable.
Definition: timed_mutex.hpp:348
get_CPU_ticks
uint64_t get_CPU_ticks() OME_ALWAYS_INLINE OME_ALWAYS_OPTIMIZE("-O3")
Return value of CPU tick register.
Definition: tick_time.h:141
TimedCondition::mutex
TimedMutex * mutex
Definition: timed_mutex.hpp:250
tick_time.h
FARGOS CPU tick routines.
TimedCondition::condition
OME_CONDITION_TYPE condition
Definition: timed_mutex.hpp:251
TimedCondition::waitForCondition
int64_t waitForCondition(const char *waitingHere=nullptr)
Wait indefinitely for the condition to be posted.
Definition: timed_mutex.cpp:272
TimedCondition::TimedConditionStatistics::totalPostEvents
SMV_StandaloneNumeric< uint64_t > totalPostEvents
Definition: timed_mutex.hpp:226
TimedMutex::TimedMutexStatistics::lockLocation
SMV_StandaloneString< 128 > lockLocation
Definition: timed_mutex.hpp:66
TimedCondition::mutex_address
OME_MUTEX_TYPE * mutex_address() OME_ALWAYS_INLINE NONNULL_RETURN
Convenience routine to get address of underlying native mutex that is associated with the condition v...
Definition: timed_mutex.hpp:401
TimedCondition::condition_address
OME_CONDITION_TYPE * condition_address() OME_ALWAYS_INLINE NONNULL_RETURN
Get address of underlying native condition variable.
Definition: timed_mutex.hpp:291
TimedCondition::TimedConditionStatistics::namingNode
SharedMemoryVariableNode namingNode
Definition: timed_mutex.hpp:222
TimedCondition::TimedConditionStatistics::waitStartedAt
SMV_StandaloneNumeric< uint64_t > waitStartedAt
Definition: timed_mutex.hpp:223
TimedCondition::TimedConditionStatistics::waitCompletedAt
SMV_StandaloneNumeric< uint64_t > waitCompletedAt
Definition: timed_mutex.hpp:224
TimedCondition::TimedConditionStatistics::totalWaitTicks
SMV_StandaloneNumeric< uint64_t > totalWaitTicks
Definition: timed_mutex.hpp:225
NONNULL_RETURN
char NONNULL_RETURN
Definition: compiler_hints.h:745
TimedMutex::TimedMutexStatistics::lockObtainedAt
SMV_StandaloneNumeric< uint64_t > lockObtainedAt
Definition: timed_mutex.hpp:61
TimedCondition::TimedConditionStatistics
Statistics for a TimedCondition object.
Definition: timed_mutex.hpp:219
Generated: Tue Jul 28 2020 16:03:26
Support Information