cwThread.h/cpp : Added cycle count limit to 'unpause'.
This commit is contained in:
parent
07b736daae
commit
10b5e88b0e
17
cwThread.cpp
17
cwThread.cpp
@ -37,6 +37,8 @@ namespace cw
|
|||||||
char* label;
|
char* label;
|
||||||
|
|
||||||
mutex::handle_t mutexH;
|
mutex::handle_t mutexH;
|
||||||
|
unsigned cycleIdx;
|
||||||
|
unsigned cycleCnt;
|
||||||
|
|
||||||
} thread_t;
|
} thread_t;
|
||||||
|
|
||||||
@ -122,6 +124,7 @@ namespace cw
|
|||||||
// check if we have been requested to leave the pause state
|
// check if we have been requested to leave the pause state
|
||||||
if( cwIsFlag(curDoFlags,kDoRunThFl) )
|
if( cwIsFlag(curDoFlags,kDoRunThFl) )
|
||||||
{
|
{
|
||||||
|
p->cycleIdx = 0;
|
||||||
p->stateId.store(kRunningThId,std::memory_order_release);
|
p->stateId.store(kRunningThId,std::memory_order_release);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -132,10 +135,15 @@ namespace cw
|
|||||||
if( p->func(p->funcArg)==false )
|
if( p->func(p->funcArg)==false )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
p->cycleIdx += 1;
|
||||||
|
|
||||||
|
// if a cycle limit was set then check if the limit was reached
|
||||||
|
bool cycles_done_fl = p->cycleCnt > 0 && p->cycleIdx >= p->cycleCnt;
|
||||||
|
|
||||||
curDoFlags = p->doFlags.load(std::memory_order_acquire);
|
curDoFlags = p->doFlags.load(std::memory_order_acquire);
|
||||||
|
|
||||||
// check if we have been requested to enter the pause state
|
// check if we have been requested to enter the pause state
|
||||||
if( cwIsFlag(curDoFlags,kDoPauseThFl) )
|
if( cwIsNotFlag(curDoFlags,kDoExitThFl) && (cwIsFlag(curDoFlags,kDoPauseThFl) || cycles_done_fl) )
|
||||||
{
|
{
|
||||||
p->stateId.store(kPausedThId,std::memory_order_release);
|
p->stateId.store(kPausedThId,std::memory_order_release);
|
||||||
}
|
}
|
||||||
@ -276,7 +284,7 @@ cw::rc_t cw::thread::destroy( handle_t& hRef )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
cw::rc_t cw::thread::pause( handle_t h, unsigned cmdFlags )
|
cw::rc_t cw::thread::pause( handle_t h, unsigned cmdFlags, unsigned cycleCnt )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
bool pauseFl = cwIsFlag(cmdFlags,kPauseFl);
|
bool pauseFl = cwIsFlag(cmdFlags,kPauseFl);
|
||||||
@ -296,6 +304,7 @@ cw::rc_t cw::thread::pause( handle_t h, unsigned cmdFlags )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
p->cycleCnt = cycleCnt;
|
||||||
p->doFlags.store(kDoRunThFl,std::memory_order_release);
|
p->doFlags.store(kDoRunThFl,std::memory_order_release);
|
||||||
waitId = kRunningThId;
|
waitId = kRunningThId;
|
||||||
if((rc = signalCondVar(p->mutexH)) != kOkRC )
|
if((rc = signalCondVar(p->mutexH)) != kOkRC )
|
||||||
@ -316,8 +325,8 @@ errLabel:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cw::rc_t cw::thread::unpause( handle_t h )
|
cw::rc_t cw::thread::unpause( handle_t h, unsigned cycleCnt )
|
||||||
{ return pause( h, kWaitFl); }
|
{ return pause( h, kWaitFl, cycleCnt); }
|
||||||
|
|
||||||
cw::thread::stateId_t cw::thread::state( handle_t h )
|
cw::thread::stateId_t cw::thread::state( handle_t h )
|
||||||
{
|
{
|
||||||
|
@ -35,9 +35,11 @@ namespace cw
|
|||||||
rc_t destroy( handle_t& hRef );
|
rc_t destroy( handle_t& hRef );
|
||||||
|
|
||||||
|
|
||||||
|
// 'cycleCnt' gives a limit on the count of time the thread function should be called
|
||||||
|
// when the thread exits the pause state. It is ignored if kPauseFl is set in 'cmdFlags'
|
||||||
enum { kPauseFl=0x01, kWaitFl=0x02 };
|
enum { kPauseFl=0x01, kWaitFl=0x02 };
|
||||||
rc_t pause( handle_t h, unsigned cmdFlags = kWaitFl );
|
rc_t pause( handle_t h, unsigned cmdFlags = kWaitFl, unsigned cycleCnt=0 );
|
||||||
rc_t unpause( handle_t h ); // same as threadPause(h,kWaitFl)
|
rc_t unpause( handle_t h, unsigned cycleCnt=0 ); // same as threadPause(h,kWaitFl)
|
||||||
|
|
||||||
stateId_t state( handle_t h );
|
stateId_t state( handle_t h );
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user