1 /*
2 *
3 * C++ Portable Types Library (PTypes)
4 * Version 2.1.1 Released 27-Jun-2007
5 *
6 * Copyright (C) 2001-2007 Hovik Melikyan
7 *
8 * http://www.melikyan.com/ptypes/
9 *
10 */
11
12 #ifdef WIN32
13 # include <windows.h>
14 #else
15 # include <sys/time.h>
16 # include <pthread.h>
17 # include <errno.h>
18 #endif
19
20 #include "pasync.h"
21
22
23 PTYPES_BEGIN
24
25
trig_fail()26 static void trig_fail()
27 {
28 fatal(CRIT_FIRST + 41, "Trigger failed");
29 }
30
31
32
33 #ifdef WIN32
34
35
trigger(bool autoreset,bool state)36 trigger::trigger(bool autoreset, bool state)
37 {
38 handle = CreateEvent(0, !autoreset, state, 0);
39 if (handle == 0)
40 trig_fail();
41 }
42
43
44 #else
45
46
trig_syscheck(int r)47 inline void trig_syscheck(int r)
48 {
49 if (r != 0)
50 trig_fail();
51 }
52
53
trigger(bool iautoreset,bool istate)54 trigger::trigger(bool iautoreset, bool istate)
55 : state(int(istate)), autoreset(iautoreset)
56 {
57 trig_syscheck(pthread_mutex_init(&mtx, 0));
58 trig_syscheck(pthread_cond_init(&cond, 0));
59 }
60
61
~trigger()62 trigger::~trigger()
63 {
64 pthread_cond_destroy(&cond);
65 pthread_mutex_destroy(&mtx);
66 }
67
68
wait()69 void trigger::wait()
70 {
71 pthread_mutex_lock(&mtx);
72 while (state == 0)
73 pthread_cond_wait(&cond, &mtx);
74 if (autoreset)
75 state = 0;
76 pthread_mutex_unlock(&mtx);
77 }
78
79
post()80 void trigger::post()
81 {
82 pthread_mutex_lock(&mtx);
83 state = 1;
84 if (autoreset)
85 pthread_cond_signal(&cond);
86 else
87 pthread_cond_broadcast(&cond);
88 pthread_mutex_unlock(&mtx);
89 }
90
91
reset()92 void trigger::reset()
93 {
94 state = 0;
95 }
96
97
98 #endif
99
100
101 PTYPES_END
102