Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>following is some encapsulation pthread mutex into windows style CRITICAL_SECTION</p> <pre><code>typedef struct tagCRITICAL_SECTION { pthread_mutex_t _mutex; pthread_mutexattr_t _mutexattr; } CRITICAL_SECTION, *LPCRITICAL_SECTION; static inline VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { // printf("[init] %0x\n", (UINT)lpCriticalSection); int ret; ret = pthread_mutexattr_init(&amp;(lpCriticalSection-&gt;_mutexattr)); assert(ret==0); #if defined (__APPLE__) || defined(__linux__) pthread_mutexattr_settype(&amp;lpCriticalSection-&gt;_mutexattr, PTHREAD_MUTEX_RECURSIVE); #elif ANDROID // Do nothing #else lpCriticalSection-&gt;_mutexattr.__mutexkind = PTHREAD_MUTEX_RECURSIVE_NP; #endif ret = pthread_mutex_init(&amp;(lpCriticalSection-&gt;_mutex), &amp;(lpCriticalSection-&gt;_mutexattr)); assert(ret==0); } static inline VOID DeleteCriticalSection (LPCRITICAL_SECTION lpCriticalSection) { int ret; ret = pthread_mutex_destroy (&amp;(lpCriticalSection-&gt;_mutex)); assert(ret==0); ret = pthread_mutexattr_destroy(&amp;(lpCriticalSection-&gt;_mutexattr)); assert(ret==0); } static inline VOID EnterCriticalSection (LPCRITICAL_SECTION lpCriticalSection) { int ret; ret = pthread_mutex_lock(&amp;(lpCriticalSection)-&gt;_mutex); assert(ret==0); } static inline BOOL TryEnterCriticalSection (LPCRITICAL_SECTION lpCriticalSection) { int ret; ret = pthread_mutex_trylock(&amp;(lpCriticalSection)-&gt;_mutex); return ret == 0; } static inline VOID LeaveCriticalSection (LPCRITICAL_SECTION lpCriticalSection) { int ret; ret = pthread_mutex_unlock(&amp;(lpCriticalSection-&gt;_mutex)); // ret==1 means mutex is owned by another thread! } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload