📄 pasync.h.html
字号:
<font CLASS=keytype>int</font> writecnt;<font CLASS=preproc>#else</font> pthread_mutex_t mtx; pthread_cond_t readcond; pthread_cond_t writecond; <font CLASS=keytype>int</font> locks; <font CLASS=keytype>int</font> writers; <font CLASS=keytype>int</font> readers;<font CLASS=preproc>#endif</font> <font CLASS=preproc><font CLASS=keyword>public</font>:</font> rwlock(); ~rwlock(); <font CLASS=keytype>void</font> rdlock(); <font CLASS=keytype>void</font> wrlock(); <font CLASS=keytype>void</font> unlock(); <font CLASS=keytype>void</font> lock() { wrlock(); }};<font CLASS=preproc>#elif</font> defined(__POSIX_RWLOCK__) <font CLASS=keyword>struct</font> rwlock: public noncopyable{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font> pthread_rwlock_t rw;<font CLASS=preproc><font CLASS=keyword>public</font>:</font> rwlock(); ~rwlock() { pthread_rwlock_destroy(&rw); } <font CLASS=keytype>void</font> rdlock() { pthread_rwlock_rdlock(&rw); } <font CLASS=keytype>void</font> wrlock() { pthread_rwlock_wrlock(&rw); } <font CLASS=keytype>void</font> unlock() { pthread_rwlock_unlock(&rw); } <font CLASS=keytype>void</font> lock() { wrlock(); }};<font CLASS=preproc>#endif</font> <font CLASS=preproc>#if</font> defined(__PTYPES_RWLOCK__) <font CLASS=symbols>||</font> defined(__POSIX_RWLOCK__) <font CLASS=comment>//</font><font CLASS=comment>// scoperead & scopewrite</font><font CLASS=comment>//</font><font CLASS=keyword>class</font> scoperead: <font CLASS=keyword>public</font> noncopyable{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font> rwlock* rw;<font CLASS=preproc><font CLASS=keyword>public</font>:</font> scoperead(rwlock& irw): rw(&irw) { rw<font CLASS=symbols>-</font>>rdlock(); } ~scoperead() { rw<font CLASS=symbols>-</font>>unlock(); }};<font CLASS=keyword>class</font> scopewrite: <font CLASS=keyword>public</font> noncopyable{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font> rwlock* rw;<font CLASS=preproc><font CLASS=keyword>public</font>:</font> scopewrite(rwlock& irw): rw(&irw) { rw<font CLASS=symbols>-</font>>wrlock(); } ~scopewrite() { rw<font CLASS=symbols>-</font>>unlock(); }};<font CLASS=preproc>#endif</font> <font CLASS=comment>// -------------------------------------------------------------------- //</font><font CLASS=comment>// --- semaphore ------------------------------------------------------ //</font><font CLASS=comment>// -------------------------------------------------------------------- //</font><font CLASS=preproc>#if</font> defined(WIN32) <font CLASS=symbols>||</font> defined(__DARWIN__) <font CLASS=symbols>||</font> defined(__bsdi__) <font CLASS=preproc>#</font> define __SEM_TO_TIMEDSEM__ <font CLASS=preproc>#endif</font> <font CLASS=preproc>#ifdef</font> __SEM_TO_TIMEDSEM__ <font CLASS=comment>// map ordinary semaphore to timed semaphore</font><font CLASS=keyword>class</font> timedsem;<font CLASS=keyword>typedef</font> timedsem semaphore;<font CLASS=preproc>#else</font> <font CLASS=keyword>class</font> semaphore: public unknown{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font> sem_t handle;<font CLASS=preproc><font CLASS=keyword>public</font>:</font> semaphore(<font CLASS=keytype>int</font> initvalue); <font CLASS=keyword>virtual</font> ~semaphore(); <font CLASS=keytype>void</font> wait(); <font CLASS=keytype>void</font> post(); <font CLASS=keytype>void</font> signal() { post(); }};<font CLASS=preproc>#endif</font> <font CLASS=keyword>class</font> timedsem: public unknown{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font><font CLASS=preproc>#ifdef</font> WIN32 HANDLE handle;<font CLASS=preproc>#else</font> <font CLASS=keytype>int</font> count; pthread_mutex_t mtx; pthread_cond_t cond;<font CLASS=preproc>#endif</font> <font CLASS=preproc><font CLASS=keyword>public</font>:</font> timedsem(<font CLASS=keytype>int</font> initvalue); <font CLASS=keyword>virtual</font> ~timedsem(); <font CLASS=keytype>bool</font> wait(<font CLASS=keytype>int</font> msecs <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>); <font CLASS=keytype>void</font> post(); <font CLASS=keytype>void</font> signal() { post(); }};<font CLASS=preproc>#ifdef</font> PTYPES18_COMPAT <font CLASS=keyword>typedef</font> timedsem tsemaphore;<font CLASS=preproc>#endif</font> <font CLASS=comment>// -------------------------------------------------------------------- //</font><font CLASS=comment>// --- thread --------------------------------------------------------- //</font><font CLASS=comment>// -------------------------------------------------------------------- //</font><font CLASS=keyword>class</font> thread: public unknown{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font><font CLASS=preproc>#ifdef</font> WIN32 <font CLASS=keytype>unsigned</font> id;<font CLASS=preproc>#endif</font> pthread_t handle; <font CLASS=keytype>int</font> autofree; <font CLASS=keytype>int</font> running; <font CLASS=keytype>int</font> signaled; <font CLASS=keytype>int</font> finished; <font CLASS=keytype>int</font> freed; <font CLASS=keytype>int</font> reserved; <font CLASS=comment>// for priorities</font> timedsem relaxsem; <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> execute() <font CLASS=symbols>=</font> <font CLASS=integer>0</font>; <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> cleanup(); <font CLASS=keytype>bool</font> relax(<font CLASS=keytype>int</font> msecs) { <font CLASS=keyword>return</font> relaxsem.wait(msecs); } <font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> _threadepilog(thread* thr);<font CLASS=preproc>#ifdef</font> WIN32 <font CLASS=keyword>friend</font> <font CLASS=keytype>unsigned</font> __stdcall _threadproc(<font CLASS=keytype>void</font>* arg);<font CLASS=preproc>#else</font> <font CLASS=keyword>friend</font> <font CLASS=keytype>void</font>* _threadproc(<font CLASS=keytype>void</font>* arg);<font CLASS=preproc>#endif</font> <font CLASS=preproc><font CLASS=keyword>public</font>:</font> thread(<font CLASS=keytype>bool</font> iautofree); <font CLASS=keyword>virtual</font> ~thread();<font CLASS=preproc>#ifdef</font> WIN32 pthread_id_t get_id() { <font CLASS=keyword>return</font> <font CLASS=keytype>int</font>(id); }<font CLASS=preproc>#else</font> pthread_id_t get_id() { <font CLASS=keyword>return</font> handle; }<font CLASS=preproc>#endif</font> <font CLASS=keytype>bool</font> get_running() { <font CLASS=keyword>return</font> running <font CLASS=symbols>!=</font> <font CLASS=integer>0</font>; } <font CLASS=keytype>bool</font> get_finished() { <font CLASS=keyword>return</font> finished <font CLASS=symbols>!=</font> <font CLASS=integer>0</font>; } <font CLASS=keytype>bool</font> get_signaled() { <font CLASS=keyword>return</font> signaled <font CLASS=symbols>!=</font> <font CLASS=integer>0</font>; } <font CLASS=keytype>void</font> start(); <font CLASS=keytype>void</font> signal(); <font CLASS=keytype>void</font> waitfor();};<font CLASS=comment>// -------------------------------------------------------------------- //</font><font CLASS=comment>// --- jobqueue & msgqueue -------------------------------------------- //</font><font CLASS=comment>// -------------------------------------------------------------------- //</font><font CLASS=keyword>const</font> <font CLASS=keytype>int</font> MSG_USER <font CLASS=symbols>=</font> <font CLASS=integer>0</font>;<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> MSG_QUIT <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>;<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> DEF_QUEUE_LIMIT <font CLASS=symbols>=</font> <font CLASS=integer>5000</font>;<font CLASS=keyword>class</font> message: public unknown{<font CLASS=preproc><font CLASS=keyword>protected</font>:</font> message* next; <font CLASS=comment>// next in the message chain, used internally</font> semaphore* sync; <font CLASS=comment>// used internally by msgqueue::send(), when called from a different thread</font> <font CLASS=keyword>friend</font> <font CLASS=keyword>class</font> jobqueue; <font CLASS=comment>// my friends, job queue and message queue...</font> <font CLASS=keyword>friend</font> <font CLASS=keyword>class</font> msgqueue;<font CLASS=preproc><font CLASS=keyword>public</font>:</font> <font CLASS=keytype>int</font> id; pintptr param; pintptr result; message(<font CLASS=keytype>int</font> iid, pintptr iparam <font CLASS=symbols>=</font> <font CLASS=integer>0</font>); <font CLASS=keyword>virtual</font> ~message();};<font CLASS=keyword>class</font> jobqueue: public noncopyable{<font CLASS=preproc><font CLASS=keyword>private</font>:</font> <font CLASS=keytype>int</font> limit; <font CLASS=comment>// queue limit</font> message* head; <font CLASS=comment>// queue head</font> message* tail; <font CLASS=comment>// queue tail</font> <font CLASS=keytype>int</font> qcount; <font CLASS=comment>// number of items in the queue</font> timedsem sem; <font CLASS=comment>// queue semaphore</font> timedsem ovrsem; <font CLASS=comment>// overflow semaphore</font> mutex qlock; <font CLASS=comment>// critical sections in enqueue and dequeue</font><font CLASS=preproc><font CLASS=keyword>protected</font>:</font> <font CLASS=keytype>bool</font> enqueue(message* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>); <font CLASS=keytype>bool</font> push(message* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>); message* dequeue(<font CLASS=keytype>bool</font> safe <font CLASS=symbols>=</font> <font CLASS=keyword>true</font>, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> -<font CLASS=integer>1</font>); <font CLASS=keytype>void</font> purgequeue();<font CLASS=preproc><font CLASS=keyword>public</font>:</font> jobqueue(<font CLASS=keytype>int</font> ilimit <font CLASS=symbols>=</font> DEF_QUEUE_LIMIT); <font CLASS=keyword>virtual</font> ~jobqueue(); <font CLASS=keytype>int</font> get_count() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> qcount; } <font CLASS=keytype>int</font> get_limit() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> limit; } <font CLASS=keytype>bool</font> post(message* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>); <font CLASS=keytype>bool</font> post(<font CLASS=keytype>int</font> id, pintptr param <font CLASS=symbols>=</font> <font CLASS=integer>0</font>, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> -<font CLASS=integer>1</font>); <font CLASS=keytype>bool</font> posturgent(message* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>); <font CLASS=keytype>bool</font> posturgent(<font CLASS=keytype>int</font> id, pintptr param <font CLASS=symbols>=</font> <font CLASS=integer>0</font>, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> -<font CLASS=integer>1</font>); message* getmessage(<font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>);<font CLASS=preproc>#ifdef</font> PTYPES19_COMPAT <font CLASS=keytype>int</font> msgsavail() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> get_count(); }<font CLASS=preproc>#endif</font> };<font CLASS=keyword>template</font> <<font CLASS=keyword>class</font> T> <font CLASS=keyword>class</font> tjobqueue: <font CLASS=keyword>protected</font> jobqueue{<font CLASS=preproc><font CLASS=keyword>public</font>:</font> tjobqueue(<font CLASS=keytype>int</font> ilimit <font CLASS=symbols>=</font> DEF_QUEUE_LIMIT); <font CLASS=keytype>int</font> get_count() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> jobqueue::get_count(); } <font CLASS=keytype>int</font> get_limit() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> jobqueue::get_limit(); } <font CLASS=keytype>bool</font> post(T* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>) { <font CLASS=keyword>return</font> jobqueue::post(msg, timeout); } <font CLASS=keytype>bool</font> posturgent(T* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>) { <font CLASS=keyword>return</font> jobqueue::posturgent(msg, timeout); } T* getmessage(<font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>) { <font CLASS=keyword>return</font> (T*)jobqueue::getmessage(timeout); }};<font CLASS=keyword>class</font> msgqueue: <font CLASS=keyword>protected</font> jobqueue{<font CLASS=preproc><font CLASS=keyword>private</font>:</font> mutex thrlock; <font CLASS=comment>// lock for the queue processing</font> pthread_id_t owner; <font CLASS=comment>// thread ID of the queue processing thread</font> pintptr finishmsg(message* msg); <font CLASS=keytype>void</font> handlemsg(message* msg); <font CLASS=keytype>void</font> takeownership();<font CLASS=preproc><font CLASS=keyword>protected</font>:</font> <font CLASS=keytype>bool</font> quit; <font CLASS=keytype>void</font> defhandler(message& msg); <font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> msghandler(message& msg) <font CLASS=symbols>=</font> <font CLASS=integer>0</font>;<font CLASS=preproc><font CLASS=keyword>public</font>:</font> msgqueue(<font CLASS=keytype>int</font> ilimit <font CLASS=symbols>=</font> DEF_QUEUE_LIMIT); <font CLASS=keyword>virtual</font> ~msgqueue(); // functions calling from the owner<font CLASS=preproc> thread:</font> <font CLASS=keytype>void</font> processone(); <font CLASS=comment>// process one message, may hang if no msgs in the queue</font> <font CLASS=keytype>void</font> processmsgs(); <font CLASS=comment>// process all available messages and return</font> <font CLASS=keytype>void</font> run(); <font CLASS=comment>// process messages until MSG_QUIT</font> // functions calling from any<font CLASS=preproc> thread:</font> <font CLASS=keytype>int</font> get_count() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> jobqueue::get_count(); } <font CLASS=keytype>int</font> get_limit() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> jobqueue::get_limit(); } <font CLASS=keytype>bool</font> post(message* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>) { <font CLASS=keyword>return</font> jobqueue::post(msg, timeout); } <font CLASS=keytype>bool</font> post(<font CLASS=keytype>int</font> id, pintptr param <font CLASS=symbols>=</font> <font CLASS=integer>0</font>, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> -<font CLASS=integer>1</font>) { <font CLASS=keyword>return</font> jobqueue::post(id, param, timeout); } <font CLASS=keytype>bool</font> posturgent(message* msg, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> <font CLASS=symbols>-</font><font CLASS=integer>1</font>) { <font CLASS=keyword>return</font> jobqueue::posturgent(msg, timeout); } <font CLASS=keytype>bool</font> posturgent(<font CLASS=keytype>int</font> id, pintptr param <font CLASS=symbols>=</font> <font CLASS=integer>0</font>, <font CLASS=keytype>int</font> timeout <font CLASS=symbols>=</font> -<font CLASS=integer>1</font>) { <font CLASS=keyword>return</font> jobqueue::posturgent(id, param, timeout); } pintptr send(message* msg); pintptr send(int id, pintptr param <font CLASS=symbols>=</font> <font CLASS=integer>0</font>);<font CLASS=preproc>#ifdef</font> PTYPES19_COMPAT <font CLASS=keytype>int</font> msgsavail() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> get_count(); }<font CLASS=preproc>#endif</font> };<font CLASS=preproc>#ifdef</font> _MSC_VER <font CLASS=preproc>#pragma</font> pack(pop) <font CLASS=preproc>#endif</font> PTYPES_END<font CLASS=preproc>#endif</font> <font CLASS=comment>// __PASYNC_H__ </font></pre></div><hr noshade></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -