1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
#ifndef WIN32COND_H
#define WIN32COND_H
/**
* pthread_cond API for Win32
*
* ACE(TM), TAO(TM), CIAO(TM), DAnCE>(TM), and CoSMIC(TM) (henceforth
* referred to as "DOC software") are copyrighted by Douglas C. Schmidt
* and his research group at Washington University, University of California,
* Irvine, and Vanderbilt University, Copyright (c) 1993-2009, all rights
* reserved.
*
* Since DOC software is open-source, freely available software, you are free
* to use, modify, copy, and distribute--perpetually and irrevocably--the DOC
* software source code and object code produced from the source, as well as
* copy and distribute modified versions of this software. You must, however,
* include this copyright statement along with any code built using DOC
* software that you release.
*
* No copyright statement needs to be provided if you just ship binary
* executables of your software products.
*
* See "Strategies for Implementing POSIX Condition Variables on Win32" at
* http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
*/
#include <windows.h>
typedef struct
{
long waiters_count_;
// Number of waiting threads.
CRITICAL_SECTION waiters_count_lock_;
// Serialize access to <waiters_count_>.
HANDLE sema_;
// Semaphore used to queue up threads waiting for the condition to
// become signaled.
HANDLE waiters_done_;
// An auto-reset event used by the broadcast/signal thread to wait
// for all the waiting thread(s) to wake up and be released from the
// semaphore.
size_t was_broadcast_;
// Keeps track of whether we were broadcasting or signaling. This
// allows us to optimize the code if we're just signaling.
} win32_cond_t;
#ifdef __cplusplus
extern "C" {
#endif
int win32_cond_init(win32_cond_t *cv);
int win32_cond_destroy(win32_cond_t *cv);
int win32_cond_wait(win32_cond_t *cv, HANDLE *external_mutex);
int win32_cond_signal(win32_cond_t *cv);
int win32_cond_broadcast(win32_cond_t *cv);
#ifdef __cplusplus
}
#endif
#endif
|