EpcTools
An event based multi-threaded C++ development framework.
etevent.h
Go to the documentation of this file.
1 /*
2 * Copyright (c) 2019 Sprint
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 
17 #ifndef __ETEVENT_H
18 #define __ETEVENT_H
19 
20 #include <unistd.h>
21 #include <sys/syscall.h>
22 
23 #include "ebase.h"
24 #include "etbasic.h"
25 #include "eerror.h"
26 #include "egetopt.h"
27 #include "eshmem.h"
28 #include "esynch.h"
29 #include "esynch2.h"
30 #include "etimer.h"
31 
34 
36 
37 DECLARE_ERROR(EThreadQueueBaseError_NotOpenForWriting);
38 DECLARE_ERROR(EThreadQueueBaseError_NotOpenForReading);
39 DECLARE_ERROR(EThreadQueueBaseError_MultipleReadersNotAllowed);
40 DECLARE_ERROR(EThreadQueuePublicError_UnInitialized);
41 
42 DECLARE_ERROR_ADVANCED(EThreadTimerError_UnableToInitialize);
43 DECLARE_ERROR_ADVANCED(EThreadTimerError_NotInitialized);
44 DECLARE_ERROR_ADVANCED(EThreadTimerError_UnableToStart);
45 DECLARE_ERROR_ADVANCED(EThreadTimerError_UnableToRegisterTimerHandler);
46 
48 
51 
57 {
58 public:
60  EThreadEventMessageDataBase() : m_msgid() {}
63  EThreadEventMessageDataBase(UInt msgid) : m_msgid(msgid) {}
64 
67  UInt getMessageId() { return m_msgid; }
71  EThreadEventMessageDataBase &setMessageId(UInt msgid) { m_msgid = msgid; return *this; }
75  virtual pVoid getVoidPtr() = 0;
79  virtual Void setVoidPtr(pVoid p) = 0;
80 
85  ETimer &getTimer() { return m_timer; }
86 
87 private:
88  ETimer m_timer;
89  UInt m_msgid;
90 };
91 
94 {
95 public:
97  typedef union {
98  pVoid voidptr;
99  LongLong int64;
100  Long int32[sizeof(pVoid) / sizeof(Long)];
101  Short int16[sizeof(pVoid) / sizeof(Short)];
102  Char int8[sizeof(pVoid) / sizeof(Char)];
103  ULongLong uint64;
104  ULong uint32[sizeof(pVoid) / sizeof(ULong)];
105  UShort uint16[sizeof(pVoid) / sizeof(UShort)];
106  UChar uint8[sizeof(pVoid) / sizeof(UChar)];
107  } DataUnion;
109 
114  EThreadEventMessageData(UInt msgid) : EThreadEventMessageDataBase(msgid), m_data() {}
122  EThreadEventMessageData(UInt msgid, pVoid v) : EThreadEventMessageDataBase(msgid), m_data{.voidptr=v} {}
126  EThreadEventMessageData(UInt msgid, LongLong v) : EThreadEventMessageDataBase(msgid), m_data{.int64=v} {}
130  EThreadEventMessageData(UInt msgid, ULongLong v) : EThreadEventMessageDataBase(msgid), m_data{.uint64=v} {}
135  EThreadEventMessageData(UInt msgid, Long v1, Long v2) : EThreadEventMessageDataBase(msgid), m_data{.int32={v1,v2}} {}
140  EThreadEventMessageData(UInt msgid, ULong v1, ULong v2) : EThreadEventMessageDataBase(msgid), m_data{.uint32={v1,v2}} {}
147  EThreadEventMessageData(UInt msgid, Short v1, Short v2, Short v3, Short v4) : EThreadEventMessageDataBase(msgid), m_data{.int16={v1,v2,v3,v4}} {}
154  EThreadEventMessageData(UInt msgid, UShort v1, UShort v2, UShort v3, UShort v4) : EThreadEventMessageDataBase(msgid), m_data{.uint16={v1,v2,v3,v4}} {}
165  EThreadEventMessageData(UInt msgid, Char v1, Char v2, Char v3, Char v4, Char v5, Char v6, Char v7, Char v8) : EThreadEventMessageDataBase(msgid), m_data{.int8={v1,v2,v3,v4,v5,v6,v7,v8}} {}
176  EThreadEventMessageData(UInt msgid, UChar v1, UChar v2, UChar v3, UChar v4, UChar v5, UChar v6, UChar v7, UChar v8) : EThreadEventMessageDataBase(msgid), m_data{.uint8={v1,v2,v3,v4,v5,v6,v7,v8}} {}
177 
180  DataUnion &data() { return m_data; }
181 
184  pVoid getVoidPtr() { return m_data.voidptr; }
188  Void setVoidPtr(pVoid p) { m_data.voidptr = p; }
189 
190 private:
191  DataUnion m_data;
192 };
193 
198 {
199 public:
202 };
203 
205 template <class T>
207 {
208 public:
211  : m_data()
212  {
213  }
217  : m_data( data )
218  {
219  }
222  {
223  }
226  T &operator=(const T &data)
227  {
228  m_data = data;
229  return *this;
230  }
233  T &data()
234  {
235  return m_data;
236  }
239  UInt getMessageId() { return m_data.getMessageId(); }
243  EThreadEventMessageBase &setMessageId(UInt msgid) { m_data.setMessageid( msgid ); return *this; }
246  pVoid getVoidPtr() { return m_data.getVoidPtr(); }
250  Void setVoidPtr(pVoid p) { m_data.setVoidPtr(p); }
255  ETimer &getTimer() { return m_data.getTimer(); }
256 
257 private:
258  T m_data;
259 };
260 
262 
267 {
268 public:
281  EThreadMessage(UInt msgid, pVoid v) : _EThreadMessage(EThreadEventMessageData(msgid, v)) {}
285  EThreadMessage(UInt msgid, LongLong v) : _EThreadMessage(EThreadEventMessageData(msgid, v)) {}
289  EThreadMessage(UInt msgid, ULongLong v) : _EThreadMessage(EThreadEventMessageData(msgid, v)) {}
294  EThreadMessage(UInt msgid, Long v1, Long v2=0) : _EThreadMessage(EThreadEventMessageData(msgid, v1, v2)) {}
299  EThreadMessage(UInt msgid, ULong v1, ULong v2=0) : _EThreadMessage(EThreadEventMessageData(msgid, v1, v2)) {}
306  EThreadMessage(UInt msgid, Short v1, Short v2=0, Short v3=0, Short v4=0) : _EThreadMessage(EThreadEventMessageData(msgid, v1, v2, v3, v4)) {}
313  EThreadMessage(UInt msgid, UShort v1, UShort v2=0, UShort v3=0, UShort v4=0) : _EThreadMessage(EThreadEventMessageData(msgid, v1, v2, v3, v4)) {}
324  EThreadMessage(UInt msgid, Char v1, Char v2=0, Char v3=0, Char v4=0, Char v5=0, Char v6=0, Char v7=0, Char v8=0)
325  : _EThreadMessage(EThreadEventMessageData(msgid, v1, v2, v3, v4, v5, v6, v7, v8)) {}
336  EThreadMessage(UInt msgid, UChar v1, UChar v2=0, UChar v3=0, UChar v4=0, UChar v5=0, UChar v6=0, UChar v7=0, UChar v8=0)
337  : _EThreadMessage(EThreadEventMessageData(msgid, v1, v2, v3, v4, v5, v6, v7, v8)) {}
338 };
339 
342 
345 {
347  ReadOnly,
349  WriteOnly,
351  ReadWrite
352 };
353 
358 template <class T>
360 {
361 public:
362 
369  Bool push(const T &msg, Bool wait = True)
370  {
371  if (m_mode == EThreadQueueMode::ReadOnly)
372  throw EThreadQueueBaseError_NotOpenForWriting();
373 
374  if (semFree().Decrement(wait) < 0)
375  return False;
376 
377  {
378  EMutexLock l(mutex());
379 
380  data()[msgHead()] = msg;
381  data()[msgHead()].data().getTimer().Start();
382 
383  msgHead()++;
384 
385  if (msgHead() >= msgCnt())
386  msgHead() = 0;
387  }
388 
389  semMsgs().Increment();
390 
391  return True;
392  }
398  Bool pop(T &msg, Bool wait = True)
399  {
400  if (m_mode == EThreadQueueMode::WriteOnly)
401  throw EThreadQueueBaseError_NotOpenForReading();
402 
403  if (!semMsgs().Decrement(wait))
404  return False;
405 
406  msg = data()[msgTail()++];
407 
408  if (msgTail() >= msgCnt())
409  msgTail() = 0;
410 
411  semFree().Increment();
412 
413  return True;
414  }
421  Bool peek(T &msg, Bool wait = True)
422  {
423  if (m_mode == EThreadQueueMode::WriteOnly)
424  throw EThreadQueueBaseError_NotOpenForReading();
425 
426  if (!semMsgs().Decrement(wait))
427  return False;
428 
429  msg = data()[msgTail()];
430 
431  // since we are not pulling the message off, we need to increment
432  // the semaphore to put it back where it was
433  semMsgs().Increment();
434 
435  return True;
436  }
437 
440  Bool isInitialized() { return m_initialized; }
443  EThreadQueueMode mode() { return m_mode; }
444 
445 protected:
447 
448  virtual Bool isPublic() = 0;
449  virtual Int &msgCnt() = 0;
450  virtual Int &msgHead() = 0;
451  virtual Int &msgTail() = 0;
452  virtual Bool &multipleWriters() = 0;
453  virtual Int &numReaders() = 0;
454  virtual Int &numWriters() = 0;
455  virtual Int &refCnt() = 0;
456  virtual T *data() = 0;
457  virtual Void allocDataSpace(cpStr sFile, Char cId, Int nSize) = 0;
458  virtual Void initMutex() = 0;
459  virtual Void initSemFree(UInt initialCount) = 0;
460  virtual Void initSemMsgs(UInt initialCount) = 0;
461 
462  virtual EMutexData &mutex() = 0;
463  virtual ESemaphoreData &semMsgs() = 0;
464  virtual ESemaphoreData &semFree() = 0;
465 
466  virtual int *getBumpPipe() = 0;
467 
469  {
470  m_initialized = False;
471  }
473  {
474  }
475 
476  Void init(Int nMsgCnt, Int threadId, Bool bMultipleWriters, EThreadQueueMode eMode)
477  {
478  m_mode = eMode;
479 
480  // construct the shared memory name
481  Char szName[EPC_FILENAME_MAX];
482  epc_sprintf_s(szName, sizeof(szName), "%d", threadId);
483 
484  // calcuate the space required
485  int nSize = sizeof(T) * nMsgCnt;
486 
487  // initialize the shared memory
488  allocDataSpace(szName, 'A', nSize);
489 
490  // initialize the control block values
491  if (refCnt() == 0)
492  {
493  refCnt() = 0;
494  numReaders() = 0;
495  numWriters() = 0;
496  multipleWriters() = bMultipleWriters;
497  msgCnt() = nMsgCnt;
498  msgHead() = 0;
499  msgTail() = 0;
500 
501  // initialize the control mutex and semaphores
502  initMutex();
503  initSemFree(msgCnt());
504  initSemMsgs(0);
505  }
506  else
507  {
508  }
509 
510  EMutexLock l(mutex());
511 
512  if ((eMode == EThreadQueueMode::ReadOnly || eMode == EThreadQueueMode::ReadWrite) && numReaders() > 0)
513  {
514  throw EThreadQueueBaseError_MultipleReadersNotAllowed();
515  }
516 
517  refCnt()++;
518  numReaders() += (eMode == EThreadQueueMode::ReadOnly || eMode == EThreadQueueMode::ReadWrite) ? 1 : 0;
519  numWriters() += (eMode == EThreadQueueMode::WriteOnly || eMode == EThreadQueueMode::ReadWrite) ? 1 : 0;
520 
521  m_initialized = True;
522  }
523 
524  Void destroy()
525  {
526  Bool destroyMutex = False;
527 
528  if (m_initialized)
529  {
530  EMutexLock l(mutex());
531 
532  if (refCnt() == 1)
533  {
534  semFree().destroy();
535  semMsgs().destroy();
536 
537  destroyMutex = True;
538  }
539  else
540  {
541  refCnt()--;
542  numReaders() -= (m_mode == EThreadQueueMode::ReadOnly || m_mode == EThreadQueueMode::ReadWrite) ? 1 : 0;
543  numWriters() -= (m_mode == EThreadQueueMode::WriteOnly || m_mode == EThreadQueueMode::ReadWrite) ? 1 : 0;
544  }
545  }
546 
547  if (destroyMutex)
548  mutex().destroy();
549  }
551 
552 private:
553  Bool m_initialized;
554  EThreadQueueMode m_mode;
555 };
556 
559 
565 template <class T>
567 {
568  template <class TQueue, class TMessage> friend class EThreadEvent;
569 public:
572  {
573  m_pCtrl = NULL;
574  m_pData = NULL;
575  }
578  {
579  }
588  Void init(Int nMsgCnt, Int threadId, Bool bMultipleWriters,
589  EThreadQueueMode eMode)
590  {
591  EThreadQueueBase<T>::init(nMsgCnt, threadId, bMultipleWriters, eMode);
592  }
593 
594 protected:
596  Bool isPublic() { return True; }
597  Int &msgCnt() { return m_pCtrl->m_msgCnt; }
598  Int &msgHead() { return m_pCtrl->m_head; }
599  Int &msgTail() { return m_pCtrl->m_tail; }
600  Bool &multipleWriters() { return m_pCtrl->m_multipleWriters; }
601  Int &numReaders() { return m_pCtrl->m_numReaders; }
602  Int &numWriters() { return m_pCtrl->m_numWriters; }
603  Int &refCnt() { return m_pCtrl->m_refCnt; }
604  T *data() { return m_pData; }
605  Void allocDataSpace(cpStr sFile, Char cId, Int nSize)
606  {
607  m_sharedmem.init(sFile, cId, nSize + sizeof(ethreadmessagequeue_ctrl_t));
608  m_pCtrl = (ethreadmessagequeue_ctrl_t *)m_sharedmem.getDataPtr();
609  m_pData = (T *)(((pChar)m_sharedmem.getDataPtr()) + sizeof(ethreadmessagequeue_ctrl_t));
610  }
611  Void initMutex()
612  {
613  EMutexPublic m;
614  m_pCtrl->m_mutexid = m.mutexId();
615  m.detach();
616  }
617  Void initSemFree(UInt initialCount)
618  {
619  ESemaphorePublic s(initialCount);
620  m_pCtrl->m_freeSemId = s.semIndex();
621  s.detach();
622  }
623  Void initSemMsgs(UInt initialCount)
624  {
625  ESemaphorePublic s(initialCount);
626  m_pCtrl->m_msgsSemId = s.semIndex();
627  s.detach();
628  }
629 
630  EMutexData &mutex() { return ESynchObjects::getMutex(m_pCtrl->m_mutexid); }
631  ESemaphoreData &semFree() { return ESynchObjects::getSemaphore(m_pCtrl->m_freeSemId); }
632  ESemaphoreData &semMsgs() { return ESynchObjects::getSemaphore(m_pCtrl->m_msgsSemId); }
633 
634  int *getBumpPipe() { return m_pCtrl->m_bumppipe; }
636 
637 private:
638  typedef struct
639  {
640  Int m_refCnt;
641  Int m_numReaders;
642  Int m_numWriters;
643  Bool m_multipleWriters;
644 
645  Int m_msgCnt;
646  Int m_head; // next location to write
647  Int m_tail; // next location to read
648 
649  Int m_mutexid;
650  Int m_freeSemId;
651  Int m_msgsSemId;
652 
653  int m_bumppipe[2];
654  } ethreadmessagequeue_ctrl_t;
655 
656  ESharedMemory m_sharedmem;
657  ethreadmessagequeue_ctrl_t *m_pCtrl;
658  T *m_pData;
659 };
660 
663 
669 template <class T>
671 {
672  template <class TQueue, class TMessage> friend class EThreadEvent;
673 public:
676  : m_mutex(False), m_semFree(0, False), m_semMsgs(0, False)
677  {
678  m_refCnt = 0;
679  m_numReaders = 0;
680  m_numWriters = 0;
681  m_multipleWriters = False;
682 
683  m_msgCnt = 0;
684  m_head = 0; // next location to write
685  m_tail = 0; // next location to read
686  m_pData = NULL;
687  }
690  {
691  if (m_pData)
692  {
693  delete[](pChar) m_pData;
694  m_pData = NULL;
695  }
696  }
705  Void init(Int nMsgCnt, Int threadId, Bool bMultipleWriters,
706  EThreadQueueMode eMode)
707  {
708  EThreadQueueBase<T>::init(nMsgCnt, threadId, bMultipleWriters, eMode);
709  }
710 
711 protected:
713  Bool isPublic() { return False; }
714  Int &msgCnt() { return m_msgCnt; }
715  Int &msgHead() { return m_head; }
716  Int &msgTail() { return m_tail; }
717  Bool &multipleWriters() { return m_multipleWriters; }
718  Int &numReaders() { return m_numReaders; }
719  Int &numWriters() { return m_numWriters; }
720  Int &refCnt() { return m_refCnt; }
721  T *data() { return m_pData; }
722  Void allocDataSpace(cpStr sFile, Char cId, Int nSize)
723  {
724  m_pData = (EThreadMessage *)new Char[nSize];
725  memset((pChar)m_pData, 0, nSize);
726  }
727  Void initMutex()
728  {
729  m_mutex.init();
730  }
731  Void initSemFree(UInt initialCount)
732  {
733  m_semFree.init(initialCount);
734  }
735  Void initSemMsgs(UInt initialCount)
736  {
737  m_semMsgs.init(initialCount);
738  }
739 
740  EMutexData &mutex() { return m_mutex; }
741  ESemaphoreData &semFree() { return m_semFree; }
742  ESemaphoreData &semMsgs() { return m_semMsgs; }
743 
744  int *getBumpPipe() { return m_bumppipe; }
746 
747 private:
748  Int m_refCnt;
749  Int m_numReaders;
750  Int m_numWriters;
751  Bool m_multipleWriters;
752 
753  Int m_msgCnt;
754  Int m_head; // next location to write
755  Int m_tail; // next location to read
756 
757  EMutexPrivate m_mutex;
758  ESemaphorePrivate m_semFree;
759  ESemaphorePrivate m_semMsgs;
760 
761  int m_bumppipe[2];
762 
763  T *m_pData;
764 };
765 
768 
770 #define EM_INIT 1
771 #define EM_QUIT 2
773 #define EM_SUSPEND 3
775 #define EM_TIMER 4
777 #define EM_SOCKETSELECT_READ 5
779 #define EM_SOCKETSELECT_WRITE 6
781 #define EM_SOCKETSELECT_ERROR 7
783 #define EM_SOCKETSELECT_EXCEPTION 8
785 #define EM_USER 10000
787 
790 
793 #define DECLARE_MESSAGE_MAP() \
794 protected: \
795  static const msgmap_t *GetThisMessageMap(); \
796  virtual const msgmap_t *GetMessageMap() const;
797 
803 #define BEGIN_MESSAGE_MAP(theClass, baseClass) \
804  const theClass::msgmap_t *theClass::GetMessageMap() const \
805  { \
806  return GetThisMessageMap(); \
807  } \
808  const theClass::msgmap_t *theClass::GetThisMessageMap() \
809  { \
810  typedef baseClass TheBaseClass; \
811  _Pragma("GCC diagnostic push") \
812  _Pragma("GCC diagnostic ignored \"-Wpmf-conversions\"") \
813  static const msgentry_t _msgEntries[] = \
814  {
815 
817 #define ON_MESSAGE(id, memberFxn) \
818  {id, (msgfxn_t)&memberFxn},
819 
821 #define END_MESSAGE_MAP() \
822  {0, (msgfxn_t)NULL} \
823  }; \
824  _Pragma("GCC diagnostic pop") \
825  static const msgmap_t msgMap = \
826  {&TheBaseClass::GetThisMessageMap, &_msgEntries[0]}; \
827  return &msgMap; \
828  }
829 
832 
834 {
835 public:
836  virtual Bool _sendMessage(const _EThreadEventMessageBase &msg, Bool wait = True)
837  {
838  return False;
839  }
841  {
842  delete msg;
843  }
844 };
845 
853 {
855  template <class TQueue, class TMessage> friend class EThreadEvent;
856 
858 protected:
860  {
861  m_thread = thread;
862  m_msg = msg;
863 
864  struct sigevent sev = {};
865  sev.sigev_notify = SIGEV_SIGNAL;
866  sev.sigev_signo = SIGRTMIN;
867  sev.sigev_value.sival_ptr = this;
868  if (timer_create(CLOCK_REALTIME, &sev, &m_timer) == -1)
869  throw EThreadTimerError_UnableToInitialize();
870  }
872 
873 public:
876  {
877  // assign the id
878  m_id = atomic_inc(m_nextid);
879  m_thread = NULL;
880  m_msg = NULL;
881  m_interval = 0;
882  m_oneshot = True;
883  m_timer = NULL;
884  }
890  EThreadEventTimer(Long milliseconds, Bool oneshot = False)
891  {
892  // assign the id
893  m_id = atomic_inc(m_nextid);
894  m_thread = NULL;
895  m_msg = NULL;
896  m_interval = milliseconds;
897  m_oneshot = oneshot;
898  m_timer = NULL;
899  }
901  {
902  destroy();
903  }
909  Void destroy()
910  {
911  if (m_timer != NULL)
912  {
913  stop();
914  timer_delete(m_timer);
915  m_timer = NULL;
916  }
917  if (m_msg)
918  {
919  if (m_thread)
920  m_thread->_destroyMessage(m_msg);
921  else
922  delete m_msg;
923  m_msg = NULL;
924  }
925  m_thread = NULL;
926  }
932  Void start()
933  {
934  if (m_timer == NULL)
935  throw EThreadTimerError_NotInitialized();
936 
937  struct itimerspec its;
938  its.it_value.tv_sec = m_interval / 1000; // seconds
939  its.it_value.tv_nsec = (m_interval % 1000) * 1000000; // nano-seconds
940  its.it_interval.tv_sec = m_oneshot ? 0 : its.it_value.tv_sec;
941  its.it_interval.tv_nsec = m_oneshot ? 0 : its.it_value.tv_nsec;
942  if (timer_settime(m_timer, 0, &its, NULL) == -1)
943  throw EThreadTimerError_UnableToStart();
944  }
946  Void stop()
947  {
948  if (m_timer != NULL)
949  {
950  struct itimerspec its;
951  its.it_value.tv_sec = 0; // seconds
952  its.it_value.tv_nsec = 0; // nano-seconds
953  its.it_interval.tv_sec = its.it_value.tv_sec;
954  its.it_interval.tv_nsec = its.it_value.tv_nsec;
955  timer_settime(m_timer, 0, &its, NULL);
956  }
957  }
959  Long getInterval() { return m_interval; }
964  Void setInterval(Long interval) { m_interval = interval; }
969  Void setOneShot(Bool oneshot) { m_oneshot = oneshot; }
976  Long getId() { return m_id; }
983  Bool isInitialized() { return m_timer != NULL; }
984 
985 protected:
987  static void _timerHandler(int signo, siginfo_t *pinfo, void *pcontext)
988  {
989  EThreadEventTimer *timer = (EThreadEventTimer*)pinfo->si_value.sival_ptr;
990  if (timer)
991  {
992  timer->m_thread->_sendMessage(*timer->m_msg);
993  }
994  }
996 
997 private:
998  static Long m_nextid;
999 
1000  Long m_id;
1001  _EThreadEventBase *m_thread;
1002  _EThreadEventMessageBase *m_msg;
1003  Bool m_oneshot;
1004  Long m_interval;
1005  timer_t m_timer;
1006 };
1007 
1009 class EThreadEventTimerHandler : EStatic
1010 {
1011 public:
1012  EThreadEventTimerHandler() {}
1013  ~EThreadEventTimerHandler() {}
1014 
1015  virtual Int getInitType() { return STATIC_INIT_TYPE_THREADS; }
1016  Void init(EGetOpt &options)
1017  {
1018  struct sigaction sa;
1019  sa.sa_flags = SA_SIGINFO;
1020  sa.sa_sigaction = EThreadEventTimer::_timerHandler;
1021  sigemptyset(&sa.sa_mask);
1022  int signo = SIGRTMIN;
1023  if (sigaction(signo, &sa, NULL) == -1)
1024  throw EThreadTimerError_UnableToRegisterTimerHandler();
1025  }
1026  Void uninit()
1027  {
1028  }
1029 };
1031 
1039 template <class TQueue, class TMessage>
1041 {
1042 public:
1044  typedef Void (EThreadEvent::*msgfxn_t)(TMessage &);
1045  typedef struct
1046  {
1047  UInt nMessage; // message
1048  msgfxn_t pFn; // routine to call (or special value)
1049  } msgentry_t;
1050 
1051  struct msgmap_t
1052  {
1053  const msgmap_t *(*pfnGetBaseMap)();
1054  const msgentry_t *lpEntries;
1055  };
1057 
1060  : EThreadBasic(),
1061  m_tid(-1),
1062  m_arg(NULL),
1063  m_stacksize(0),
1064  m_suspendCnt(0),
1065  m_suspendSem(0)
1066  {
1067  }
1070  {
1071  }
1072 
1082  Bool sendMessage(UInt message, Bool wait = True)
1083  {
1084  TMessage msg(message);
1085  Bool result = m_queue.push(msg, wait);
1086  if (result)
1087  messageQueued();
1088  return result;
1089  }
1100  Bool sendMessage(UInt message, pVoid voidptr, Bool wait = True)
1101  {
1102  TMessage msg(message);
1103  msg.setVoidPtr(voidptr);
1104  Bool result = m_queue.push(msg, wait);
1105  if (result)
1106  messageQueued();
1107  return result;
1108  }
1117  Bool sendMessage(const TMessage &msg, Bool wait = True)
1118  {
1119  Bool result = m_queue.push(msg, wait);
1120  if (result)
1121  messageQueued();
1122  return result;
1123  }
1124 
1133  virtual Void init(Short appId, UShort threadId, pVoid arg, Int queueSize = 16384, Bool suspended = False, Dword stackSize = 0)
1134  {
1135  m_appId = appId;
1136  m_threadId = threadId;
1137  m_queueSize = queueSize;
1138  m_stacksize = stackSize;
1139 
1140  long id = m_appId * 10000 + m_threadId;
1141 
1142  m_queue.init(m_queueSize, id, True, EThreadQueueMode::ReadWrite);
1143 
1144  if (!suspended)
1145  start();
1146  }
1147 
1149  Void quit()
1150  {
1152  }
1154  Void start()
1155  {
1156  if (!isInitialized())
1157  {
1158  EThreadBasic::init(m_arg, m_stacksize);
1160  }
1161  }
1170  Void suspend()
1171  {
1172  if (atomic_inc(m_suspendCnt) == 1)
1174  }
1176  Void resume()
1177  {
1178  if (atomic_dec(m_suspendCnt) == 0)
1179  m_suspendSem.Increment();
1180  }
1182  virtual Void onInit()
1183  {
1184  }
1186  virtual Void onQuit()
1187  {
1188  }
1190  virtual Void onSuspend()
1191  {
1192  }
1197  virtual Void onTimer(EThreadEventTimer *ptimer)
1198  {
1199  }
1204  {
1205  TMessage *msg = new TMessage(EM_TIMER);
1206  msg->setVoidPtr(&t);
1207  t.init(this, msg);
1208  }
1211  {
1212  return m_queue.semMsgs();
1213  }
1214 
1215 protected:
1217  virtual const msgmap_t *GetMessageMap() const
1218  {
1219  return GetThisMessageMap();
1220  }
1221  static const msgmap_t *GetThisMessageMap()
1222  {
1223  return NULL;
1224  }
1225  int *getBumpPipe()
1226  {
1227  return m_queue.getBumpPipe();
1228  }
1230 
1236  virtual Void messageQueued()
1237  {
1238  }
1253  Bool pumpMessage(TMessage &msg, Bool wait = true)
1254  {
1255  Bool bMsg = m_queue.pop(msg, wait);
1256  if (bMsg)
1257  dispatch(msg);
1258 
1259  return bMsg;
1260  }
1269  virtual Void pumpMessages()
1270  {
1271  TMessage msg;
1272 
1273  try
1274  {
1275  while (True)
1276  {
1277  if (pumpMessage(msg))
1278  {
1279  if (msg.getMessageId() == EM_QUIT)
1280  break;
1281  if (msg.getMessageId() == EM_SUSPEND)
1282  m_suspendSem.Decrement();
1283  }
1284  }
1285  }
1286  catch (EError &e)
1287  {
1288  //std::cout << "t1 - " << e.Name() << std::endl;
1289  throw;
1290  }
1291  catch (...)
1292  {
1293  throw;
1294  }
1295  }
1303  virtual Void defaultMessageHandler(TMessage &msg)
1304  {
1305  }
1308  pid_t getThreadId()
1309  {
1310  if (m_tid == -1)
1311  m_tid = syscall(SYS_gettid);
1312  return m_tid;
1313  }
1314 
1315 private:
1316  Dword threadProc(pVoid arg)
1317  {
1318  pumpMessages();
1319  return 0;
1320  }
1321 
1322  Bool dispatch(TMessage &msg)
1323  {
1324  Bool keepgoing = True;
1325  const msgmap_t *pMap;
1326  const msgentry_t *pEntries;
1327 
1328  if (msg.getMessageId() >= EM_USER)
1329  {
1330  // interate through each map
1331  for (pMap = GetMessageMap(); keepgoing && pMap && pMap->pfnGetBaseMap != NULL; pMap = (*pMap->pfnGetBaseMap)())
1332  {
1333  // interate through each entry for the map
1334  for (pEntries = pMap->lpEntries; pEntries->nMessage; pEntries++)
1335  {
1336  if (pEntries->nMessage == msg.getMessageId())
1337  {
1338  (this->*pEntries->pFn)(msg);
1339  keepgoing = False;
1340  break;
1341  }
1342  }
1343  }
1344 
1345  if (pMap == NULL)
1346  defaultMessageHandler(msg);
1347  }
1348  else
1349  {
1350  switch (msg.getMessageId())
1351  {
1352  case EM_INIT:
1353  {
1354  onInit();
1355  break;
1356  }
1357  case EM_QUIT:
1358  {
1359  onQuit();
1360  break;
1361  }
1362  case EM_SUSPEND:
1363  {
1364  onSuspend();
1365  break;
1366  }
1367  case EM_TIMER:
1368  {
1369  onTimer( (EThreadEventTimer*)msg.getVoidPtr() );
1370  break;
1371  }
1372  default:
1373  {
1374  break;
1375  }
1376  }
1377  }
1378 
1379  return keepgoing;
1380  }
1381 
1382  Bool _sendMessage(const _EThreadEventMessageBase &msg, Bool wait)
1383  {
1384  return sendMessage( (const TMessage &)msg, wait );
1385  }
1386 
1387  Void _destroyMessage(_EThreadEventMessageBase *msg)
1388  {
1389  delete (TMessage*)msg;
1390  }
1391 
1392  pid_t m_tid;
1393  pVoid m_arg;
1394  size_t m_stacksize;
1395  Int m_suspendCnt;
1396  ESemaphorePrivate m_suspendSem;
1397 
1398  Short m_appId;
1399  UShort m_threadId;
1400  Int m_queueSize;
1401  TQueue m_queue;
1402 };
1403 
1406 
1409 
1410 #endif // #ifndef __ETEVENT_H
EThreadMessage::EThreadMessage
EThreadMessage()
Default class constructor.
Definition: etevent.h:270
EThreadEventTimer
Thread timer class.
Definition: etevent.h:852
EThreadEvent::onInit
virtual Void onInit()
Called in the context of the thread when the EM_INIT event is processed.
Definition: etevent.h:1182
EThreadEventMessageDataBase::getTimer
ETimer & getTimer()
Retrieves the timer associated with this event message.
Definition: etevent.h:85
EThreadEventMessageBase::data
T & data()
Retrieves the data portion of the message.
Definition: etevent.h:233
DECLARE_ERROR
#define DECLARE_ERROR(__e__)
Declares exception class derived from EError with no constructor parameters.
Definition: eerror.h:53
EThreadQueuePublic
Definition of a public event thread message queue.
Definition: etevent.h:566
EThreadEventMessageData::EThreadEventMessageData
EThreadEventMessageData(UInt msgid, Short v1, Short v2, Short v3, Short v4)
Class constructor.
Definition: etevent.h:147
atomic_inc
#define atomic_inc(a)
atomic increment - increments a by 1
Definition: eatomic.h:27
_EThreadEventBase::_sendMessage
virtual Bool _sendMessage(const _EThreadEventMessageBase &msg, Bool wait=True)
Definition: etevent.h:836
EThreadEventMessageBase::getMessageId
UInt getMessageId()
Retrieves the event message ID associated with this event message.
Definition: etevent.h:239
eerror.h
Defines base class for exceptions and declaration helper macros.
EThreadEventMessageDataBase::getMessageId
UInt getMessageId()
Retrieves the event message ID.
Definition: etevent.h:67
ESemaphoreData
Contains the data associated with a public or private semaphore.
Definition: esynch.h:268
EThreadEventMessageData::EThreadEventMessageData
EThreadEventMessageData(UInt msgid, ULong v1, ULong v2)
Class constructor.
Definition: etevent.h:140
EMutexPublic::detach
Void detach()
Detaches from the public mutex object.
Definition: esynch.cpp:432
EThreadEventMessageBase::~EThreadEventMessageBase
virtual ~EThreadEventMessageBase()
Class destructor.
Definition: etevent.h:221
EThreadMessage::EThreadMessage
EThreadMessage(UInt msgid, Char v1, Char v2=0, Char v3=0, Char v4=0, Char v5=0, Char v6=0, Char v7=0, Char v8=0)
Class constructor.
Definition: etevent.h:324
_EThreadMessage
EThreadEventMessageBase< EThreadEventMessageData > _EThreadMessage
Definition: etevent.h:261
EThreadEvent::pumpMessages
virtual Void pumpMessages()
Process event messages.
Definition: etevent.h:1269
EThreadQueueBase
Defines the functionality for the thread queue.
Definition: etevent.h:359
EThreadQueueMode
EThreadQueueMode
Defines how a client can access a thread queue.
Definition: etevent.h:344
EThreadMessage::EThreadMessage
EThreadMessage(UInt msgid, UChar v1, UChar v2=0, UChar v3=0, UChar v4=0, UChar v5=0, UChar v6=0, UChar v7=0, UChar v8=0)
Class constructor.
Definition: etevent.h:336
EThreadEvent::initTimer
Void initTimer(EThreadEventTimer &t)
Intializes an EThreadEvent::Timer object and associates with this thread.
Definition: etevent.h:1203
EThreadEventTimer::~EThreadEventTimer
~EThreadEventTimer()
Class destructor.
Definition: etevent.h:900
True
#define True
True.
Definition: ebase.h:25
EThreadEventMessageData::EThreadEventMessageData
EThreadEventMessageData()
Default constructor.
Definition: etevent.h:111
EThreadEventMessageDataBase::EThreadEventMessageDataBase
EThreadEventMessageDataBase()
Default constructor.
Definition: etevent.h:60
EThreadMessage
An event message that is to be sent to a thread.
Definition: etevent.h:266
EThreadEventMessageDataBase::EThreadEventMessageDataBase
EThreadEventMessageDataBase(UInt msgid)
Class constructor.
Definition: etevent.h:63
EThreadEventTimer::getId
Long getId()
Returns the unique timer id.
Definition: etevent.h:976
EThreadEventMessageData::setVoidPtr
Void setVoidPtr(pVoid p)
Sets the void pointer.
Definition: etevent.h:188
EStatic::uninit
virtual Void uninit()
Performs uninitialization at system shutdown.
Definition: estatic.h:63
EThreadEventMessageData::EThreadEventMessageData
EThreadEventMessageData(UInt msgid, UChar v1, UChar v2, UChar v3, UChar v4, UChar v5, UChar v6, UChar v7, UChar v8)
Class constructor.
Definition: etevent.h:176
EThreadEventMessageDataBase::setVoidPtr
virtual Void setVoidPtr(pVoid p)=0
Sets the void pointer.
EThreadQueueBase::pop
Bool pop(T &msg, Bool wait=True)
Removes the next message from the thread event queue.
Definition: etevent.h:398
EThreadEventTimer::EThreadEventTimer
EThreadEventTimer(Long milliseconds, Bool oneshot=False)
Class constructor with configuration parameters.
Definition: etevent.h:890
EThreadEvent::start
Void start()
Initializes the thread when it was suspended at init().
Definition: etevent.h:1154
EThreadMessage::EThreadMessage
EThreadMessage(UInt msgid, UShort v1, UShort v2=0, UShort v3=0, UShort v4=0)
Class constructor.
Definition: etevent.h:313
EThreadEvent::sendMessage
Bool sendMessage(UInt message, Bool wait=True)
Sends event message to this thread.
Definition: etevent.h:1082
eshmem.h
Defines a class for access to shared memory.
ebase.h
Macros for various standard C library functions and standard includes.
EStatic
Any EpcTools that needs to have initialization performed as part of EpcTools::Initialize() should der...
Definition: estatic.h:51
_EThreadEventBase
Definition: etevent.h:833
EThreadEvent::onTimer
virtual Void onTimer(EThreadEventTimer *ptimer)
Called in the context of the thread when th EM_TIMER event is processed.
Definition: etevent.h:1197
EThreadQueuePrivate
Definition of a private event thread message queue.
Definition: etevent.h:670
EMutexPrivate
A private mutex (the mutex data is allocated from either the heap or stack).
Definition: esynch.h:175
EThreadEventTimer::EThreadEventTimer
EThreadEventTimer()
Default class constructor.
Definition: etevent.h:875
EThreadEvent
base class for EThreadPrivate and EThreadPublic
Definition: etevent.h:1040
EThreadQueuePrivate::~EThreadQueuePrivate
~EThreadQueuePrivate()
Class destructor.
Definition: etevent.h:689
ESemaphorePrivate::init
Void init(Long initcnt)
Initializes the data associated with the semaphore.
Definition: esynch.h:402
EThreadQueueBase::push
Bool push(const T &msg, Bool wait=True)
Adds the specified message to the thread event queue.
Definition: etevent.h:369
EThreadEvent::getThreadId
pid_t getThreadId()
Retrieves the internal thread ID.
Definition: etevent.h:1308
EThreadMessage::EThreadMessage
EThreadMessage(UInt msgid, pVoid v)
Class constructor.
Definition: etevent.h:281
EThreadMessage::EThreadMessage
EThreadMessage(UInt msgid, EThreadEventMessageData &data)
Class constructor.
Definition: etevent.h:277
EThreadEventMessageData::getVoidPtr
pVoid getVoidPtr()
Retrieves the void pointer.
Definition: etevent.h:184
EThreadEventMessageBase
A template class that all event message classes should derive from.
Definition: etevent.h:206
esynch.h
Contains definitions for synchronization objects.
EThreadEvent::onQuit
virtual Void onQuit()
Called in the context of the thread when the EM_QUIT event is processed.
Definition: etevent.h:1186
EThreadEvent::resume
Void resume()
Resumes a suspended thread.
Definition: etevent.h:1176
EThreadQueueMode::ReadWrite
Allows read or write access.
EThreadEventMessageBase::EThreadEventMessageBase
EThreadEventMessageBase()
Default constructor.
Definition: etevent.h:210
etimer.h
ESemaphoreBase::Decrement
Bool Decrement(Bool wait=True)
Decrements the semaphore value.
Definition: esynch.h:348
EGetOpt
Definition: egetopt.h:31
EM_INIT
#define EM_INIT
thread initialization event
Definition: etevent.h:770
EThreadEventMessageData::EThreadEventMessageData
EThreadEventMessageData(UInt msgid, Long v1, Long v2)
Class constructor.
Definition: etevent.h:135
ESemaphorePublic
Represents a public semaphore, the semaphore data is located in shared memory.
Definition: esynch.h:446
EThreadEventTimer::setInterval
Void setInterval(Long interval)
sets the timer interval
Definition: etevent.h:964
esynch2.h
EThreadEvent::sendMessage
Bool sendMessage(UInt message, pVoid voidptr, Bool wait=True)
Sends event message to this thread.
Definition: etevent.h:1100
EMutexPublic
A public mutex (the mutex data is located in shared memory).
Definition: esynch.h:223
ETimer
Implements a stopwatch style timer.
Definition: etimer.h:26
EThreadQueueBase::mode
EThreadQueueMode mode()
Retrieves the access mode associated with this queue object.
Definition: etevent.h:443
ESharedMemory::getDataPtr
pVoid getDataPtr()
Retrieves a pointer to the first location of the shated memory.
Definition: eshmem.h:65
ESharedMemory::init
Void init(cpStr file, Int id, Int size)
Initializes this shared memory object. This method is called by the parameterized constructor.
Definition: eshmem.cpp:109
EMutexPublic::mutexId
Int mutexId()
Retrieves the mutex ID associated with this public mutex.
Definition: esynch.h:253
EThreadEvent::sendMessage
Bool sendMessage(const TMessage &msg, Bool wait=True)
Sends event message to this thread.
Definition: etevent.h:1117
False
#define False
False.
Definition: ebase.h:27
EThreadEventTimer::setOneShot
Void setOneShot(Bool oneshot)
sets the type of timer
Definition: etevent.h:969
EThreadEventTimer::destroy
Void destroy()
Stops and destroys the underlying timer object.
Definition: etevent.h:909
EThreadQueuePublic::init
Void init(Int nMsgCnt, Int threadId, Bool bMultipleWriters, EThreadQueueMode eMode)
Initializes this public event thead message queue object.
Definition: etevent.h:588
EThreadBasic::isInitialized
Bool isInitialized()
Returns the thread initialization state.
Definition: etbasic.cpp:133
EThreadMessage::EThreadMessage
EThreadMessage(UInt msgid, ULong v1, ULong v2=0)
Class constructor.
Definition: etevent.h:299
EThreadPrivate
EThreadEvent< EThreadQueuePrivate< EThreadMessage >, EThreadMessage > EThreadPrivate
Definition: etevent.h:1405
EThreadEvent::~EThreadEvent
~EThreadEvent()
Rhe class destructor.
Definition: etevent.h:1069
EThreadQueueMode::ReadOnly
Allows read only access.
EM_USER
#define EM_USER
beginning of user events
Definition: etevent.h:786
EThreadEventMessageDataBase::setMessageId
EThreadEventMessageDataBase & setMessageId(UInt msgid)
Sets the event message ID.
Definition: etevent.h:71
EM_QUIT
#define EM_QUIT
thread quit event
Definition: etevent.h:772
EThreadEventTimer::stop
Void stop()
Stops the timer.
Definition: etevent.h:946
EThreadEventMessageData::EThreadEventMessageData
EThreadEventMessageData(UInt msgid, LongLong v)
Class constructor.
Definition: etevent.h:126
ESemaphorePrivate
Represents a private semaphore, the semaphore data is allocated from either the stack or heap.
Definition: esynch.h:382
EThreadQueueBase::isInitialized
Bool isInitialized()
Retrieves indication if this queue object has been initialized.
Definition: etevent.h:440
EThreadEvent::init
virtual Void init(Short appId, UShort threadId, pVoid arg, Int queueSize=16384, Bool suspended=False, Dword stackSize=0)
Initializes the thread object.
Definition: etevent.h:1133
EM_SUSPEND
#define EM_SUSPEND
thread suspend event
Definition: etevent.h:774
DECLARE_ERROR_ADVANCED
#define DECLARE_ERROR_ADVANCED(__e__)
Declares exception class derived from EError with no constructor parameters and developer defined con...
Definition: eerror.h:59
ESemaphoreBase::Increment
Bool Increment()
Increments the semaphore value.
Definition: esynch.h:351
EThreadEvent::onSuspend
virtual Void onSuspend()
Called in the context of the thread when th EM_SUSPEND event is processed.
Definition: etevent.h:1190
EThreadQueuePrivate::init
Void init(Int nMsgCnt, Int threadId, Bool bMultipleWriters, EThreadQueueMode eMode)
Initializes this public event thead message queue object.
Definition: etevent.h:705
EThreadQueueBase::peek
Bool peek(T &msg, Bool wait=True)
Retrievees the next message from the thread event queue without removing the message from the queue.
Definition: etevent.h:421
EThreadQueuePublic::~EThreadQueuePublic
~EThreadQueuePublic()
Class destructor.
Definition: etevent.h:577
EThreadEventMessageBase::operator=
T & operator=(const T &data)
Assignment operator.
Definition: etevent.h:226
EThreadEventMessageData::EThreadEventMessageData
EThreadEventMessageData(UInt msgid, ULongLong v)
Class constructor.
Definition: etevent.h:130
EThreadEvent::suspend
Void suspend()
Suspends a running thread.
Definition: etevent.h:1170
EThreadEventMessageDataBase
The base class that all event message data objects should be derived from.
Definition: etevent.h:56
EThreadEventMessageData::data
DataUnion & data()
Retrieves the data union object.
Definition: etevent.h:180
ESharedMemory
The shared memory access class.
Definition: eshmem.h:43
EThreadEventMessageDataBase::getVoidPtr
virtual pVoid getVoidPtr()=0
Retrieves the void pointer.
EThreadBasic::init
Void init(pVoid arg, size_t stackSize=0)
Initialize and start the thread.
Definition: etbasic.cpp:106
EThreadEvent::messageQueued
virtual Void messageQueued()
Called when an event message is queued.
Definition: etevent.h:1236
EThreadEventMessageBase::setVoidPtr
Void setVoidPtr(pVoid p)
Sets the void pointer for this event message.
Definition: etevent.h:250
_EThreadEventMessageBase
The event message base class.
Definition: etevent.h:197
EThreadEventTimer::isInitialized
Bool isInitialized()
Indicates if this timer object has been initialized.
Definition: etevent.h:983
EThreadEventTimer::start
Void start()
Starts the timer.
Definition: etevent.h:932
EThreadBasic
An abstract class that represents contains the threadProc() that will be run in a separate thread.
Definition: etbasic.h:53
_EThreadEventBase::_destroyMessage
virtual Void _destroyMessage(_EThreadEventMessageBase *msg)
Definition: etevent.h:840
_EThreadEventMessageBase::~_EThreadEventMessageBase
virtual ~_EThreadEventMessageBase()
Virtual class destructor.
Definition: etevent.h:201
EThreadMessage::EThreadMessage
EThreadMessage(UInt msgid, Long v1, Long v2=0)
Class constructor.
Definition: etevent.h:294
EThreadEventMessageData::EThreadEventMessageData
EThreadEventMessageData(UInt msgid, EThreadEventMessageData &data)
Class constructor.
Definition: etevent.h:118
egetopt.h
Manages configuration parameters from a file and the command line.
EThreadEventTimer::getInterval
Long getInterval()
Returns the timer interval in milliseconds.
Definition: etevent.h:959
EThreadEventMessageData::EThreadEventMessageData
EThreadEventMessageData(UInt msgid, Char v1, Char v2, Char v3, Char v4, Char v5, Char v6, Char v7, Char v8)
Class constructor.
Definition: etevent.h:165
etbasic.h
EThreadEvent::defaultMessageHandler
virtual Void defaultMessageHandler(TMessage &msg)
The default event message handler.
Definition: etevent.h:1303
EThreadEventTimer::EThreadEventTimerHandler
friend class EThreadEventTimerHandler
Definition: etevent.h:854
EThreadEventMessageData
An event message data object that provides access to a union over 8 bytes of data.
Definition: etevent.h:93
EThreadEvent::quit
Void quit()
Posts the quit message to this thread.
Definition: etevent.h:1149
EThreadEventMessageData::EThreadEventMessageData
EThreadEventMessageData(UInt msgid)
Class constructor.
Definition: etevent.h:114
EPC_FILENAME_MAX
#define EPC_FILENAME_MAX
maximum file name length
Definition: ebase.h:37
EThreadMessage::EThreadMessage
EThreadMessage(UInt msgid, LongLong v)
Class constructor.
Definition: etevent.h:285
EError
The base class for exceptions derived from std::exception.
Definition: eerror.h:92
EThreadMessage::EThreadMessage
EThreadMessage(UInt msgid, Short v1, Short v2=0, Short v3=0, Short v4=0)
Class constructor.
Definition: etevent.h:306
EThreadQueuePrivate::EThreadQueuePrivate
EThreadQueuePrivate()
Default constructor.
Definition: etevent.h:675
EThreadPublic
EThreadEvent< EThreadQueuePublic< EThreadMessage >, EThreadMessage > EThreadPublic
Definition: etevent.h:1404
EThreadEventMessageBase::EThreadEventMessageBase
EThreadEventMessageBase(const T &data)
Copy constructor.
Definition: etevent.h:216
EM_TIMER
#define EM_TIMER
thread timer expiration event
Definition: etevent.h:776
EThreadEventMessageBase::getVoidPtr
pVoid getVoidPtr()
Retrieves the void pointer from the data portion of this event message.
Definition: etevent.h:246
EThreadEventMessageData::EThreadEventMessageData
EThreadEventMessageData(UInt msgid, pVoid v)
Class constructor.
Definition: etevent.h:122
EMutexPrivate::init
Void init()
Definition: esynch.h:195
EThreadEvent::getMsgSemaphore
ESemaphoreData & getMsgSemaphore()
Returns the semaphore associated with this thread's event queue.
Definition: etevent.h:1210
epc_sprintf_s
#define epc_sprintf_s
epc_sprintf_s - sprintf_s
Definition: ebase.h:46
EMutexLock
Acquires and holds a lock on the specified mutex.
Definition: esynch.h:133
EThreadEventMessageBase::getTimer
ETimer & getTimer()
Retrieves the timer associated with this event message.
Definition: etevent.h:255
EStatic::init
virtual Void init(EGetOpt &opt)
Performs class specific initialization.
Definition: estatic.h:61
EThreadMessage::EThreadMessage
EThreadMessage(UInt msgid, ULongLong v)
Class constructor.
Definition: etevent.h:289
EThreadQueueMode::WriteOnly
Allows read only access.
EThreadEvent::pumpMessage
Bool pumpMessage(TMessage &msg, Bool wait=true)
Dispatches the next thread event message.
Definition: etevent.h:1253
EStatic::getInitType
virtual Int getInitType()
Definition: estatic.h:57
EThreadEventMessageData::EThreadEventMessageData
EThreadEventMessageData(UInt msgid, UShort v1, UShort v2, UShort v3, UShort v4)
Class constructor.
Definition: etevent.h:154
atomic_dec
#define atomic_dec(a)
atomic decrement - decrements a by 1
Definition: eatomic.h:25
EThreadMessage::EThreadMessage
EThreadMessage(UInt msgid)
Class constructor.
Definition: etevent.h:273
EThreadEvent::EThreadEvent
EThreadEvent()
Default class constructor.
Definition: etevent.h:1059
EThreadQueuePublic::EThreadQueuePublic
EThreadQueuePublic()
Default constructor.
Definition: etevent.h:571
EMutexData
Contains the data associated with a public or private mutex.
Definition: esynch.h:72
EThreadEventMessageBase::setMessageId
EThreadEventMessageBase & setMessageId(UInt msgid)
Sets the event message ID for this event message.
Definition: etevent.h:243