21 #include <sys/syscall.h> 40 DECLARE_ERROR(EThreadQueueBaseError_MultipleReadersNotAllowed);
104 Long int32[
sizeof(pVoid) /
sizeof(Long)];
105 Short int16[
sizeof(pVoid) /
sizeof(Short)];
106 Char int8[
sizeof(pVoid) /
sizeof(Char)];
108 ULong uint32[
sizeof(pVoid) /
sizeof(ULong)];
109 UShort uint16[
sizeof(pVoid) /
sizeof(UShort)];
110 UChar uint8[
sizeof(pVoid) /
sizeof(UChar)];
169 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}} {}
180 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}} {}
186 DataUnion &
data() {
return m_data; }
322 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)
334 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)
375 throw EThreadQueueBaseError_NotOpenForWriting();
377 if (!semFree().Decrement(wait))
383 data()[msgHead()] = msg;
384 data()[msgHead()].data().getTimer().Start();
388 if (msgHead() >= msgCnt())
392 semMsgs().Increment();
404 throw EThreadQueueBaseError_NotOpenForReading();
406 if (!semMsgs().Decrement(wait))
412 if (multipleReaders())
415 msg = data()[msgTail()++];
417 if (msgTail() >= msgCnt())
420 semFree().Increment();
436 virtual Bool isPublic() = 0;
437 virtual Int &msgCnt() = 0;
438 virtual Int &msgHead() = 0;
439 virtual Int &msgTail() = 0;
440 virtual Bool &multipleReaders() = 0;
441 virtual Bool &multipleWriters() = 0;
442 virtual Int &numReaders() = 0;
443 virtual Int &numWriters() = 0;
444 virtual Int &refCnt() = 0;
445 virtual T *data() = 0;
446 virtual Void allocDataSpace(cpStr sFile, Char cId, Int nSize) = 0;
447 virtual Void initMutex() = 0;
448 virtual Void initSemFree(UInt initialCount) = 0;
449 virtual Void initSemMsgs(UInt initialCount) = 0;
455 virtual int *getBumpPipe() = 0;
459 m_initialized =
False;
465 Void init(Int nMsgCnt, Int threadId, Bool bMultipleWriters,
EThreadQueueMode eMode, Bool bMultipleReaders =
False)
474 int nSize =
sizeof(T) * nMsgCnt;
477 allocDataSpace(szName,
'A', nSize);
485 multipleReaders() = bMultipleReaders;
486 multipleWriters() = bMultipleWriters;
493 initSemFree(msgCnt());
499 m_initialized =
True;
506 if (!multipleReaders() && numReaders() > 0 &&
509 throw EThreadQueueBaseError_MultipleReadersNotAllowed();
519 Bool destroyMutex =
False;
532 m_initialized =
False;
550 return push( (
const T &)msg, wait );
591 Void
init(Int nMsgCnt, Int threadId, Bool bMultipleWriters,
599 Void
init(Int nMsgCnt, Int threadId, Bool bMultipleWriters,
605 Bool isPublic() {
return True; }
606 Int &msgCnt() {
return m_pCtrl->m_msgCnt; }
607 Int &msgHead() {
return m_pCtrl->m_head; }
608 Int &msgTail() {
return m_pCtrl->m_tail; }
609 Bool &multipleReaders() {
return m_pCtrl->m_multipleReaders; }
610 Bool &multipleWriters() {
return m_pCtrl->m_multipleWriters; }
611 Int &numReaders() {
return m_pCtrl->m_numReaders; }
612 Int &numWriters() {
return m_pCtrl->m_numWriters; }
613 Int &refCnt() {
return m_pCtrl->m_refCnt; }
614 T *data() {
return m_pData; }
615 Void allocDataSpace(cpStr sFile, Char cId, Int nSize)
617 m_sharedmem.init(sFile, cId, nSize +
sizeof(ethreadmessagequeue_ctrl_t));
618 m_pCtrl = (ethreadmessagequeue_ctrl_t *)m_sharedmem.getDataPtr();
619 m_pData = (T *)(((pChar)m_sharedmem.getDataPtr()) +
sizeof(ethreadmessagequeue_ctrl_t));
624 m_pCtrl->m_mutexid = m.
mutexId();
627 Void initSemFree(UInt initialCount)
630 m_pCtrl->m_freeSemId = s.
semIndex();
633 Void initSemMsgs(UInt initialCount)
636 m_pCtrl->m_msgsSemId = s.
semIndex();
640 EMutexData &mutex() {
return ESynchObjects::getMutex(m_pCtrl->m_mutexid); }
641 ESemaphoreData &semFree() {
return ESynchObjects::getSemaphore(m_pCtrl->m_freeSemId); }
642 ESemaphoreData &semMsgs() {
return ESynchObjects::getSemaphore(m_pCtrl->m_msgsSemId); }
644 int *getBumpPipe() {
return m_pCtrl->m_bumppipe; }
653 Bool m_multipleReaders;
654 Bool m_multipleWriters;
665 } ethreadmessagequeue_ctrl_t;
668 ethreadmessagequeue_ctrl_t *m_pCtrl;
694 m_multipleReaders =
False;
695 m_multipleWriters =
False;
706 if (m_pData && refCnt() == 1)
707 delete[](pChar) m_pData;
718 Void
init(Int nMsgCnt, Int threadId, Bool bMultipleWriters,
726 Void
init(Int nMsgCnt, Int threadId, Bool bMultipleWriters,
732 Bool isPublic() {
return False; }
733 Int &msgCnt() {
return m_msgCnt; }
734 Int &msgHead() {
return m_head; }
735 Int &msgTail() {
return m_tail; }
736 Bool &multipleReaders() {
return m_multipleReaders; }
737 Bool &multipleWriters() {
return m_multipleWriters; }
738 Int &numReaders() {
return m_numReaders; }
739 Int &numWriters() {
return m_numWriters; }
740 Int &refCnt() {
return m_refCnt; }
741 T *data() {
return m_pData; }
742 Void allocDataSpace(cpStr sFile, Char cId, Int nSize)
747 memset((pChar)m_pData, 0, nSize);
754 Void initSemFree(UInt initialCount)
756 m_semFree.init(initialCount);
758 Void initSemMsgs(UInt initialCount)
760 m_semMsgs.init(initialCount);
767 int *getBumpPipe() {
return m_bumppipe; }
774 Bool m_multipleReaders;
775 Bool m_multipleWriters;
801 #define EM_SOCKETSELECT_READ 5 803 #define EM_SOCKETSELECT_WRITE 6 805 #define EM_SOCKETSELECT_ERROR 7 807 #define EM_SOCKETSELECT_EXCEPTION 8 809 #define EM_USER 10000 816 class _EThreadEventNotification
830 friend class EThreadEventTimerHandler;
838 throw EThreadTimerError_AlreadyInitialized();
843 struct sigevent sev = {};
844 sev.sigev_notify = SIGEV_SIGNAL;
845 sev.sigev_signo = SIGRTMIN;
846 sev.sigev_value.sival_ptr =
this;
847 if (timer_create(CLOCK_REALTIME, &sev, &m_timer) == -1)
848 throw EThreadTimerError_UnableToInitialize();
849 m_initialized =
True;
857 m_initialized =
False;
872 m_initialized =
False;
878 m_interval = milliseconds;
894 timer_delete(m_timer);
896 m_initialized =
False;
910 if (!isInitialized())
911 throw EThreadTimerError_NotInitialized();
913 struct itimerspec its;
914 its.it_value.tv_sec = m_interval / 1000;
915 its.it_value.tv_nsec = (m_interval % 1000) * 1000000;
916 its.it_interval.tv_sec = m_oneshot ? 0 : its.it_value.tv_sec;
917 its.it_interval.tv_nsec = m_oneshot ? 0 : its.it_value.tv_nsec;
918 if (timer_settime(m_timer, 0, &its, NULL) == -1)
919 throw EThreadTimerError_UnableToStart();
926 struct itimerspec its;
927 its.it_value.tv_sec = 0;
928 its.it_value.tv_nsec = 0;
929 its.it_interval.tv_sec = its.it_value.tv_sec;
930 its.it_interval.tv_nsec = its.it_value.tv_nsec;
931 timer_settime(m_timer, 0, &its, NULL);
966 static void _timerHandler(
int signo, siginfo_t *pinfo,
void *pcontext)
970 timer->m_notify->_sendTimerExpiration(*timer->m_msg);
975 static Long m_nextid;
979 _EThreadEventNotification *m_notify;
987 class EThreadEventTimerHandler :
EStatic 990 EThreadEventTimerHandler() {}
991 ~EThreadEventTimerHandler() {}
993 virtual Int getInitType() {
return STATIC_INIT_TYPE_THREADS; }
997 sa.sa_flags = SA_SIGINFO;
998 sa.sa_sigaction = EThreadEventTimer::_timerHandler;
999 sigemptyset(&sa.sa_mask);
1000 int signo = SIGRTMIN;
1001 if (sigaction(signo, &sa, NULL) == -1)
1002 throw EThreadTimerError_UnableToRegisterTimerHandler();
1015 #define DECLARE_MESSAGE_MAP() \ 1017 static const msgmap_t *GetThisMessageMap(); \ 1018 virtual const msgmap_t *GetMessageMap() const; 1027 #define BEGIN_MESSAGE_MAP(theClass, baseClass) \ 1028 const theClass::msgmap_t *theClass::GetMessageMap() const \ 1030 return GetThisMessageMap(); \ 1032 const theClass::msgmap_t *theClass::GetThisMessageMap() \ 1034 typedef baseClass TheBaseClass; \ 1035 _Pragma("GCC diagnostic push") \ 1036 _Pragma("GCC diagnostic ignored \"-Wpmf-conversions\"") \ 1037 static const msgentry_t _msgEntries[] = \ 1041 #define ON_MESSAGE(id, memberFxn) \ 1042 {id, (msgfxn_t)&memberFxn}, 1045 #define END_MESSAGE_MAP() \ 1046 {0, (msgfxn_t)NULL} \ 1048 _Pragma("GCC diagnostic pop") \ 1049 static const msgmap_t msgMap = \ 1050 {&TheBaseClass::GetThisMessageMap, &_msgEntries[0]}; \ 1061 template <
class TQueue,
class TMessage>
1075 const msgmap_t *(*pfnGetBaseMap)();
1076 const msgentry_t *lpEntries;
1103 TMessage msg(message);
1104 Bool result = m_queue.push(msg, wait);
1106 onMessageQueued(msg);
1118 TMessage msg(message);
1119 msg.setVoidPtr(voidptr);
1120 Bool result = m_queue.push(msg, wait);
1122 onMessageQueued(msg);
1132 Bool result = m_queue.push(msg, wait);
1134 onMessageQueued(msg);
1146 virtual Void
init(Short appId, UShort threadId, pVoid arg, Int queueSize = 16384, Bool suspended =
False, Dword stackSize = 0)
1149 m_threadId = threadId;
1150 m_queueSize = queueSize;
1151 m_stacksize = stackSize;
1153 long id = m_appId * 100000 + 10000 + m_threadId;
1169 if (!isInitialized())
1187 m_suspendSem.Increment();
1210 TMessage *msg =
new TMessage(
EM_TIMER);
1211 msg->setVoidPtr(&t);
1217 return m_queue.semMsgs();
1222 virtual const msgmap_t *GetMessageMap()
const 1224 return GetThisMessageMap();
1226 static const msgmap_t *GetThisMessageMap()
1232 return m_queue.getBumpPipe();
1236 Bool result = m_queue.push(static_cast<const TMessage &>(msg), wait);
1238 onMessageQueued(static_cast<const TMessage &>(msg));
1243 Bool result = m_queue.push(static_cast<const TMessage &>(msg), wait);
1245 onMessageQueued(static_cast<const TMessage &>(msg));
1271 Bool bMsg = m_queue.pop(msg, wait);
1293 if (pumpMessage(msg))
1295 if (msg.getMessageId() ==
EM_QUIT)
1298 m_suspendSem.Decrement();
1324 m_tid = syscall(SYS_gettid);
1329 Dword threadProc(pVoid arg)
1335 Bool dispatch(TMessage &msg)
1337 Bool keepgoing =
True;
1338 const msgmap_t *pMap;
1339 const msgentry_t *pEntries;
1341 if (msg.getMessageId() >=
EM_USER)
1344 for (pMap = GetMessageMap(); keepgoing && pMap && pMap->pfnGetBaseMap != NULL; pMap = (*pMap->pfnGetBaseMap)())
1347 for (pEntries = pMap->lpEntries; pEntries->nMessage; pEntries++)
1349 if (pEntries->nMessage == msg.getMessageId())
1351 (this->*pEntries->pFn)(msg);
1359 defaultMessageHandler(msg);
1363 switch (msg.getMessageId())
1365 case EM_INIT: { onInit();
break; }
1366 case EM_QUIT: { onQuit();
break; }
1395 class EThreadEventWorkerBase
1399 typedef Void (EThreadEventWorkerBase::*msgfxnvoid_t)();
1409 const msgmap_t *(*pfnGetBaseMap)();
1410 const msgentry_t *lpEntries;
1415 #define BEGIN_MESSAGE_MAP2(theClass, baseClass) \ 1416 virtual const EThreadEventWorkerBase::msgmap_t *GetMessageMap() const \ 1418 return GetThisMessageMap(); \ 1420 static const EThreadEventWorkerBase::msgmap_t *GetThisMessageMap() \ 1422 typedef baseClass TheBaseClass; \ 1423 _Pragma("GCC diagnostic push") \ 1424 _Pragma("GCC diagnostic ignored \"-Wpmf-conversions\"") \ 1425 static const EThreadEventWorkerBase::msgentry_t _msgEntries[] = \ 1429 #define ON_MESSAGE2(id, memberFxn) \ 1430 {id, (EThreadEventWorkerBase::msgfxnvoid_t)&memberFxn}, 1433 #define END_MESSAGE_MAP2() \ 1434 {0, (EThreadEventWorkerBase::msgfxnvoid_t)NULL} \ 1436 _Pragma("GCC diagnostic pop") \ 1437 static const EThreadEventWorkerBase::msgmap_t msgMap = \ 1438 {&TheBaseClass::GetThisMessageMap, &_msgEntries[0]}; \ 1443 template <
class TQueue,
class TMessage>
1469 return m_queue->semMsgs();
1480 TMessage msg(message);
1481 Bool result = m_queue->push(msg, wait);
1495 TMessage msg(message);
1496 msg.setVoidPtr(voidptr);
1497 Bool result = m_queue->push(msg, wait);
1509 Bool result = m_queue->push(msg, wait);
1546 virtual Void
init(TQueue &queue, Int workerid, pVoid arg, Dword stackSize = 0)
1549 m_workerid = workerid;
1550 m_stacksize = stackSize;
1564 virtual const msgmap_t *GetMessageMap()
const 1566 return GetThisMessageMap();
1568 static const msgmap_t *GetThisMessageMap()
1588 Bool bMsg = m_queue->pop(msg, wait);
1610 if (pumpMessage(msg))
1612 if (msg.getMessageId() ==
EM_QUIT)
1639 m_tid = syscall(SYS_gettid);
1644 Dword threadProc(pVoid arg)
1650 Bool dispatch(TMessage &msg)
1652 Bool keepgoing =
True;
1653 const msgmap_t *pMap;
1654 const msgentry_t *pEntries;
1656 if (msg.getMessageId() >=
EM_USER)
1659 for (pMap = (msgmap_t*)GetMessageMap(); keepgoing && pMap && pMap->pfnGetBaseMap != NULL; pMap = (msgmap_t*)(*pMap->pfnGetBaseMap)())
1662 for (pEntries = pMap->lpEntries; pEntries->nMessage; pEntries++)
1664 if (pEntries->nMessage == msg.getMessageId())
1666 (this->*((void(EThreadEventWorkerBase::*)(TMessage&))pEntries->pFn))(msg);
1674 defaultMessageHandler(msg);
1678 switch (msg.getMessageId())
1680 case EM_QUIT: { onQuit();
break; }
1703 template <
class TQueue,
class TMessage,
class TWorker>
1709 : m_initialized(
False),
1723 for (
int i=0; i<m_actvWorkers; i++)
1725 delete m_workers[i];
1726 m_workers[i] =
nullptr;
1742 TMessage msg(message);
1743 Bool result = m_queue.push(msg, wait);
1745 onMessageQueued(msg);
1757 TMessage msg(message);
1758 msg.setVoidPtr(voidptr);
1759 Bool result = m_queue.push(msg, wait);
1761 onMessageQueued(msg);
1771 Bool result = m_queue.push(msg, wait);
1773 onMessageQueued(msg);
1788 virtual Void
init(Short appId, UShort workGroupId, Int minWorkers, Int maxWorkers = -1,
1789 Int queueSize = 16384, pVoid arg =
nullptr, Bool suspended =
False, Dword stackSize = 0)
1792 m_workGroupId = workGroupId;
1794 m_queueSize = queueSize;
1795 m_stacksize = stackSize;
1796 m_minWorkers = minWorkers;
1797 m_maxWorkers = maxWorkers < minWorkers ? minWorkers : maxWorkers;
1799 long id = m_appId * 100000 + 20000 + m_workGroupId;
1810 for (
auto worker : m_workers)
1816 for (
int i=0; i<m_actvWorkers; i++)
1822 if (!isInitialized())
1824 m_workers.resize(m_maxWorkers);
1825 for (Int i=0; i<m_minWorkers; i++)
1827 m_workers[i] =
nullptr;
1828 if (i < m_minWorkers)
1839 if (m_actvWorkers >= m_maxWorkers)
1841 addWorker(m_actvWorkers++);
1850 TMessage *msg =
new TMessage(
EM_TIMER);
1851 msg->setVoidPtr(&t);
1857 return m_queue.semMsgs();
1878 Bool result = m_queue.push(static_cast<const TMessage &>(msg), wait);
1880 onMessageQueued(static_cast<const TMessage &>(msg));
1885 Bool result = m_queue.push(static_cast<const TMessage &>(msg), wait);
1887 onMessageQueued(static_cast<const TMessage &>(msg));
1891 Void addWorker(Int idx)
1893 TWorker *worker =
new TWorker();
1895 m_workers[idx] = worker;
1896 worker->init(m_queue, idx + 1, m_arg, m_stacksize);
1897 onCreateWorker(*worker);
1906 UShort m_workGroupId;
1913 std::vector<TWorker*> m_workers;
1925 #endif // #ifndef __ETEVENT_H #define atomic_inc(a)
atomic increment - increments a by 1
Definition: eatomic.h:27
Bool sendMessage(UInt message, pVoid voidptr, Bool wait=True)
Sends event message to this thread.
Definition: etevent.h:1116
virtual Void onMessageQueued(const TMessage &msg)
Called when an event message is queued.
Definition: etevent.h:1536
Definition of a public event thread message queue.
Definition: etevent.h:566
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:1146
virtual Void onMessageQueued(const TMessage &msg)
Called when an event message is queued.
Definition: etevent.h:1866
~EThreadEvent()
The class destructor.
Definition: etevent.h:1091
#define True
True.
Definition: ebase.h:25
Bool sendMessage(UInt message, Bool wait=True)
Sends event message to this work group.
Definition: etevent.h:1478
EThreadEventMessageBase< EThreadEventMessageData > _EThreadMessage
Definition: etevent.h:259
Bool pumpMessage(TMessage &msg, Bool wait=true)
Dispatches the next thread event message.
Definition: etevent.h:1586
Void init(Int nMsgCnt, Int threadId, Bool bMultipleWriters, EThreadQueueMode eMode)
Initializes this public event thead message queue object.
Definition: etevent.h:591
Work group template definition. The work group contains the event queue that all of the associated wo...
Definition: etevent.h:1704
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:322
EThreadEventMessageDataBase(UInt msgid)
Class constructor.
Definition: etevent.h:65
static ETime Now()
Retrieves the current time.
Definition: etime.cpp:1147
EThreadQueueMode mode()
Retrieves the access mode associated with this queue object.
Definition: etevent.h:431
~EThreadEventTimer()
Class destructor.
Definition: etevent.h:882
EThreadEventMessageData(UInt msgid, Short v1, Short v2, Short v3, Short v4)
Class constructor.
Definition: etevent.h:151
Macros for various standard C library functions and standard includes.
virtual ~_EThreadEventMessageBase()
Virtual class destructor.
Definition: etevent.h:207
EThreadEventMessageData(UInt msgid, UShort v1, UShort v2, UShort v3, UShort v4)
Class constructor.
Definition: etevent.h:158
EThreadMessage(UInt msgid)
Class constructor.
Definition: etevent.h:271
virtual Void onInit()
Called in the context of the thread prior to processing teh first event message.
Definition: etevent.h:1454
Bool sendMessage(UInt message, pVoid voidptr, Bool wait=True)
Sends event message to this work group.
Definition: etevent.h:1493
The event message base class.
Definition: etevent.h:203
EThreadEventMessageData()
Default constructor.
Definition: etevent.h:115
Defines a class for access to shared memory.
EThreadEvent()
Default class constructor.
Definition: etevent.h:1081
base class for EThreadPrivate and EThreadPublic
Definition: etevent.h:1062
Void init(pVoid arg, size_t stackSize=0)
Initialize and start the thread.
Definition: etbasic.cpp:106
EThreadEventMessageBase & setMessageId(UInt msgid)
Sets the event message ID for this event message.
Definition: etevent.h:241
EThreadQueuePublic()
Default constructor.
Definition: etevent.h:573
The shared memory access class.
Definition: eshmem.h:43
virtual ~EThreadMessage()
Class destructor.
Definition: etevent.h:337
EThreadEventMessageData(UInt msgid, UChar v1, UChar v2, UChar v3, UChar v4, UChar v5, UChar v6, UChar v7, UChar v8)
Class constructor.
Definition: etevent.h:180
Void resume()
Resumes a suspended thread.
Definition: etevent.h:1184
Bool pumpMessage(TMessage &msg, Bool wait=true)
Dispatches the next thread event message.
Definition: etevent.h:1269
EThreadQueueMode
Defines how a client can access a thread queue.
Definition: etevent.h:344
Represents a public semaphore, the semaphore data is located in shared memory.
Definition: esynch.h:446
Any EpcTools that needs to have initialization performed as part of EpcTools::Initialize() should der...
Definition: estatic.h:51
EThreadMessage(UInt msgid, pVoid v)
Class constructor.
Definition: etevent.h:279
Bool sendMessage(const TMessage &msg, Bool wait=True)
Sends event message to this work group.
Definition: etevent.h:1507
Definition of a private event thread message queue.
Definition: etevent.h:681
EThreadMessage(UInt msgid, UShort v1, UShort v2=0, UShort v3=0, UShort v4=0)
Class constructor.
Definition: etevent.h:311
Void quit()
Posts the quit message to all of the worker threads.
Definition: etevent.h:1814
virtual Void onMessageQueued(const TMessage &msg)
Called when an event message is queued.
Definition: etevent.h:1254
Manages configuration parameters from a file and the command line.
Allows read or write access.
virtual ~EThreadEventMessageBase()
Class destructor.
Definition: etevent.h:221
virtual Void defaultMessageHandler(TMessage &msg)
The default event message handler.
Definition: etevent.h:1631
Void initTimer(EThreadEventTimer &t)
Intializes an EThreadEvent::Timer object and associates it with this work group.
Definition: etevent.h:1848
Long getId()
Returns the unique timer id.
Definition: etevent.h:957
EThreadMessage()
Default class constructor.
Definition: etevent.h:268
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:334
#define epc_sprintf_s
epc_sprintf_s - sprintf_s
Definition: ebase.h:46
EThreadEventWorker()
Default class constructor.
Definition: etevent.h:1517
virtual Void onQuit()
Called in the context of the thread when the EM_QUIT event is processed.
Definition: etevent.h:1458
EThreadEventMessageDataBase & setMessageId(UInt msgid)
Sets the event message ID.
Definition: etevent.h:75
EThreadEventTimer(Long milliseconds, Bool oneshot=False)
Class constructor with configuration parameters.
Definition: etevent.h:870
Implements a stopwatch style timer.
Definition: etimer.h:26
Contains the data associated with a public or private mutex.
Definition: esynch.h:72
Provides class for manipulating time of day values.
virtual Void onTimer(EThreadEventTimer *ptimer)
Called in the context of the thread when th EM_TIMER event is processed.
Definition: etevent.h:1203
EThreadEventMessageBase()
Default constructor.
Definition: etevent.h:216
Contains the data associated with a public or private semaphore.
Definition: esynch.h:268
virtual Void onTimer(EThreadEventTimer *ptimer)
Called in the context of the thread when th EM_TIMER event is processed.
Definition: etevent.h:1463
Void destroy()
Stops and destroys the underlying timer object.
Definition: etevent.h:889
EThreadEventTimer()
Default class constructor.
Definition: etevent.h:855
Void detach()
Detaches from the semaphore data.
Definition: esynch.cpp:569
virtual Void pumpMessages()
Process event messages.
Definition: etevent.h:1600
Void setVoidPtr(pVoid p)
Sets the void pointer.
Definition: etevent.h:194
Void init(Int nMsgCnt, Int threadId, Bool bMultipleWriters, EThreadQueueMode eMode)
Initializes this public event thead message queue object.
Definition: etevent.h:718
pVoid getVoidPtr()
Retrieves the void pointer.
Definition: etevent.h:190
virtual ~EThreadEventMessageData()
Class destructor.
Definition: etevent.h:182
#define False
False.
Definition: ebase.h:27
UInt getMessageId()
Retrieves the event message ID.
Definition: etevent.h:71
EThreadEventMessageData(UInt msgid, LongLong v)
Class constructor.
Definition: etevent.h:130
Class for manipulating date and time of day values.
Definition: etime.h:199
EThreadEventMessageDataBase()
Default constructor.
Definition: etevent.h:62
Void setInterval(const ETime &t)
sets the timer interval.
Definition: etevent.h:945
#define EM_INIT
thread initialization event
Definition: etevent.h:794
ESemaphoreData & getMsgSemaphore()
Returns the semaphore associated with this thread's event queue.
Definition: etevent.h:1215
A template class that all event message classes should derive from.
Definition: etevent.h:212
A public mutex (the mutex data is located in shared memory).
Definition: esynch.h:223
Represents a worker thread that is part of a work group.
Definition: etevent.h:1444
EThreadMessage(UInt msgid, Long v1, Long v2=0)
Class constructor.
Definition: etevent.h:292
ETimer & getTimer()
Retrieves the timer associated with this event message.
Definition: etevent.h:89
virtual Void setVoidPtr(pVoid p)=0
Sets the void pointer.
virtual Void init(Short appId, UShort workGroupId, Int minWorkers, Int maxWorkers=-1, Int queueSize=16384, pVoid arg=nullptr, Bool suspended=False, Dword stackSize=0)
Initializes the thread object.
Definition: etevent.h:1788
#define EM_USER
beginning of user events
Definition: etevent.h:810
Bool sendMessage(const TMessage &msg, Bool wait=True)
Sends event message to this thread.
Definition: etevent.h:1130
EThreadEventWorkGroup()
Default class constructor.
Definition: etevent.h:1708
virtual Void pumpMessages()
Process event messages.
Definition: etevent.h:1283
~EThreadQueuePublic()
Class destructor.
Definition: etevent.h:579
Void detach()
Detaches from the public mutex object.
Definition: esynch.cpp:432
Thread timer class.
Definition: etevent.h:828
Defines base class for exceptions and declaration helper macros.
Bool push(const T &msg, Bool wait=True)
Adds the specified message to the thread event queue.
Definition: etevent.h:372
DataUnion & data()
Retrieves the data union object.
Definition: etevent.h:186
Void setOneShot(Bool oneshot)
sets the type of timer
Definition: etevent.h:952
#define EM_SUSPEND
thread suspend event
Definition: etevent.h:798
An event message that is to be sent to a thread.
Definition: etevent.h:264
EThreadEventMessageData(UInt msgid, Long v1, Long v2)
Class constructor.
Definition: etevent.h:139
Int & semIndex()
Retrieves the semaphore data index.
Definition: esynch.cpp:555
Bool isInitialized()
Indicates if this timer object has been initialized.
Definition: etevent.h:962
Void setVoidPtr(pVoid p)
Sets the void pointer for this event message.
Definition: etevent.h:248
EThreadEvent< EThreadQueuePrivate< EThreadMessage >, EThreadMessage > EThreadPrivate
Definition: etevent.h:1389
Void initTimer(EThreadEventTimer &t)
Intializes an EThreadEvent::Timer object and associates with this thread.
Definition: etevent.h:1208
Bool isInitialized()
Retrieves indication if this queue object has been initialized.
Definition: etevent.h:428
An abstract class that represents contains the threadProc() that will be run in a separate thread...
Definition: etbasic.h:53
Int mutexId()
Retrieves the mutex ID associated with this public mutex.
Definition: esynch.h:253
virtual Void init(TQueue &queue, Int workerid, pVoid arg, Dword stackSize=0)
Initializes the thread object.
Definition: etevent.h:1546
EThreadMessage(UInt msgid, EThreadEventMessageData &data)
Class constructor.
Definition: etevent.h:275
The base class for exceptions derived from std::exception.
Definition: eerror.h:94
Bool pop(T &msg, Bool wait=True)
Removes the next message from the thread event queue.
Definition: etevent.h:401
Long getInterval()
Returns the timer interval in milliseconds.
Definition: etevent.h:935
Void setInterval(LongLong interval)
sets the timer interval
Definition: etevent.h:938
Void quit()
Posts the quit message to this thread.
Definition: etevent.h:1162
Defines the functionality for the thread queue.
Definition: etevent.h:359
virtual ~EThreadEventMessageDataBase()
Class destructor.
Definition: etevent.h:67
EThreadEventMessageData(UInt msgid, Char v1, Char v2, Char v3, Char v4, Char v5, Char v6, Char v7, Char v8)
Class constructor.
Definition: etevent.h:169
EThreadQueuePrivate()
Default constructor.
Definition: etevent.h:688
virtual Void init(EGetOpt &opt)
Performs class specific initialization.
Definition: estatic.h:61
Void stop()
Stops the timer.
Definition: etevent.h:922
#define EM_QUIT
thread quit event
Definition: etevent.h:796
virtual pVoid getVoidPtr()=0
Retrieves the void pointer.
virtual Void defaultMessageHandler(TMessage &msg)
The default event message handler.
Definition: etevent.h:1316
Bool addWorker()
Creates a new worker thread if the current number of workers is less than the maximum configured...
Definition: etevent.h:1836
Bool sendMessage(UInt message, Bool wait=True)
Sends event message to this work group.
Definition: etevent.h:1740
Void start()
Initializes the thread when it was suspended at init().
Definition: etevent.h:1167
Bool sendMessage(UInt message, Bool wait=True)
Sends event message to this thread.
Definition: etevent.h:1101
virtual Void onCreateWorker(TWorker &worker)
Called when a new worker thread object is created.
Definition: etevent.h:1871
Int workerId() const
Definition: etevent.h:1448
Acquires and holds a lock on the specified mutex.
Definition: esynch.h:133
EThreadEventMessageBase(const T &data)
Copy constructor.
Definition: etevent.h:219
Bool sendMessage(const TMessage &msg, Bool wait=True)
Sends event message to this work group.
Definition: etevent.h:1769
Bool acquire(Bool wait=True)
Manually acquires a lock on the mutex.
Definition: esynch.h:155
ESemaphoreData & getMsgSemaphore()
Returns the semaphore associated with this thread's event queue.
Definition: etevent.h:1855
Void suspend()
Suspends a running thread.
Definition: etevent.h:1178
~EThreadEventWorker()
The class destructor.
Definition: etevent.h:1527
#define DECLARE_ERROR(__e__)
Declares exception class derived from EError with no constructor parameters.
Definition: eerror.h:53
EThreadMessage(UInt msgid, ULong v1, ULong v2=0)
Class constructor.
Definition: etevent.h:297
pid_t getThreadId()
Retrieves the internal thread ID.
Definition: etevent.h:1636
EThreadMessage(UInt msgid, ULongLong v)
Class constructor.
Definition: etevent.h:287
EThreadEventMessageData(UInt msgid, EThreadEventMessageData &data)
Class constructor.
Definition: etevent.h:122
pid_t getThreadId()
Retrieves the internal thread ID.
Definition: etevent.h:1321
virtual Void onInit()
Called in the context of the thread prior to processing teh first event message.
Definition: etevent.h:1190
#define atomic_dec(a)
atomic decrement - decrements a by 1
Definition: eatomic.h:25
~EThreadQueuePrivate()
Class destructor.
Definition: etevent.h:703
T & operator=(const T &data)
Assignment operator.
Definition: etevent.h:224
#define EPC_FILENAME_MAX
maximum file name length
Definition: ebase.h:37
Int queueSize() const
Returns the maximum number of events that can be present in the event queue.
Definition: etevent.h:364
Bool sendMessage(UInt message, pVoid voidptr, Bool wait=True)
Sends event message to this work group.
Definition: etevent.h:1755
EThreadEvent< EThreadQueuePublic< EThreadMessage >, EThreadMessage > EThreadPublic
Definition: etevent.h:1388
EThreadEventMessageData(UInt msgid, ULongLong v)
Class constructor.
Definition: etevent.h:134
Represents a private semaphore, the semaphore data is allocated from either the stack or heap...
Definition: esynch.h:382
The base class that all event message data objects should be derived from.
Definition: etevent.h:58
A private mutex (the mutex data is allocated from either the heap or stack).
Definition: esynch.h:175
EThreadMessage(UInt msgid, LongLong v)
Class constructor.
Definition: etevent.h:283
virtual Void onSuspend()
Called in the context of the thread when th EM_SUSPEND event is processed.
Definition: etevent.h:1198
ESemaphoreData & getMsgSemaphore()
Returns the semaphore associated with this work groups' event queue.
Definition: etevent.h:1467
Void start()
Starts the timer.
Definition: etevent.h:908
Bool isInitialized()
Retrieves indication if this work group object has been initialized.
Definition: etevent.h:1732
T & data()
Retrieves the data portion of the message.
Definition: etevent.h:231
#define DECLARE_ERROR_ADVANCED(__e__)
Declares exception class derived from EError with no constructor parameters and developer defined con...
Definition: eerror.h:61
EThreadMessage(UInt msgid, Short v1, Short v2=0, Short v3=0, Short v4=0)
Class constructor.
Definition: etevent.h:304
const timeval & getTimeVal() const
Retrieves a reference to the timeval structure.
Definition: etime.h:446
UInt getMessageId()
Retrieves the event message ID associated with this event message.
Definition: etevent.h:237
An event message data object that provides access to a union over 8 bytes of data.
Definition: etevent.h:97
Contains definitions for synchronization objects.
Void start()
Initializes the thread when it was suspended at init().
Definition: etevent.h:1820
EThreadEventMessageData(UInt msgid, ULong v1, ULong v2)
Class constructor.
Definition: etevent.h:144
Void join()
Returns after successfully joining each worker thread.
Definition: etevent.h:1808
#define EM_TIMER
thread timer expiration event
Definition: etevent.h:800
virtual Void onQuit()
Called in the context of the thread when the EM_QUIT event is processed.
Definition: etevent.h:1194
~EThreadEventWorkGroup()
The class destructor.
Definition: etevent.h:1721
pVoid getVoidPtr()
Retrieves the void pointer from the data portion of this event message.
Definition: etevent.h:244
Void start()
Initializes the thread when it was suspended at init().
Definition: etevent.h:1557
EThreadEventMessageData(UInt msgid, pVoid v)
Class constructor.
Definition: etevent.h:126
EThreadEventMessageData(UInt msgid)
Class constructor.
Definition: etevent.h:118
ETimer & getTimer()
Retrieves the timer associated with this event message.
Definition: etevent.h:253