ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ARDroneLib / VP_SDK / VP_Os / win32 / vp_os_signal.c
1 /**
2  * @file signal.c
3  * @author aurelien.morelle@parrot.fr
4  * @date 2006/12/15
5  */
6
7 #include "VP_Os/vp_os_signal.h"
8
9         #if defined USE_WINDOWS_CONDITION_VARIABLES
10         #elif defined USE_PTHREAD_FOR_WIN32
11         #else
12         #endif
13
14 void
15 vp_os_mutex_init(vp_os_mutex_t *mutex)
16 {
17         #if defined USE_WINDOWS_CONDITION_VARIABLES
18                 InitializeCriticalSection((CRITICAL_SECTION *)mutex);
19         #elif defined USE_PTHREAD_FOR_WIN32
20                 pthread_mutex_init((pthread_mutex_t *)mutex, NULL);
21         #else
22         #endif  
23 }
24
25
26 void
27 vp_os_mutex_destroy(vp_os_mutex_t *mutex)
28 {
29         #if defined USE_WINDOWS_CONDITION_VARIABLES
30                 DeleteCriticalSection((CRITICAL_SECTION *)mutex);
31         #elif defined USE_PTHREAD_FOR_WIN32
32                 pthread_mutex_destroy((pthread_mutex_t *)mutex);
33         #else
34         #endif 
35 }
36
37
38 void
39 vp_os_mutex_lock(vp_os_mutex_t *mutex)
40 {
41         #if defined USE_WINDOWS_CONDITION_VARIABLES
42                 EnterCriticalSection((CRITICAL_SECTION *)mutex);
43         #elif defined USE_PTHREAD_FOR_WIN32
44                 pthread_mutex_lock((pthread_mutex_t *)mutex);
45         #else
46         #endif  
47 }
48
49
50 void
51 vp_os_mutex_unlock(vp_os_mutex_t *mutex)
52 {
53         #if defined USE_WINDOWS_CONDITION_VARIABLES
54                 LeaveCriticalSection((CRITICAL_SECTION *)mutex);
55         #elif defined USE_PTHREAD_FOR_WIN32
56                 pthread_mutex_unlock((pthread_mutex_t *)mutex);
57         #else
58         #endif
59         
60 }
61
62
63 void
64 vp_os_cond_init(vp_os_cond_t *cond, vp_os_mutex_t *mutex)
65 {
66         #if defined USE_WINDOWS_CONDITION_VARIABLES
67                 InitializeConditionVariable(&cond->cond);
68                 cond->mutex = mutex;
69         #elif defined USE_PTHREAD_FOR_WIN32
70                   pthread_cond_init(&cond->cond, NULL);
71                   cond->mutex = mutex;
72         #else
73                 /**/
74         #endif
75 }
76
77
78 void
79 vp_os_cond_destroy(vp_os_cond_t *cond)
80 {
81         #if defined USE_WINDOWS_CONDITION_VARIABLES
82                 /**/
83         #elif defined USE_PTHREAD_FOR_WIN32
84                  pthread_cond_destroy(&cond->cond);
85         #else
86                 /**/
87         #endif
88         
89 }
90
91
92 void
93 vp_os_cond_wait(vp_os_cond_t *cond)
94 {
95         #if defined USE_WINDOWS_CONDITION_VARIABLES
96                 SleepConditionVariableCS(&cond->cond, (CRITICAL_SECTION *)cond->mutex, INFINITE);
97         #elif defined USE_PTHREAD_FOR_WIN32
98                 pthread_cond_wait(&cond->cond, (pthread_mutex_t *)cond->mutex);
99         #else
100                 WaitForSingleObject(cond->LockSemaphore,INFINITE); // TODO: to test
101         #endif
102 }
103
104
105 int gettimeofday(struct timeval *tv, struct timezone *tz); 
106
107 C_RESULT
108 vp_os_cond_timed_wait(vp_os_cond_t *cond, uint32_t ms)
109 {
110         #if defined USE_WINDOWS_CONDITION_VARIABLES
111                 return  SleepConditionVariableCS(&cond->cond, (CRITICAL_SECTION *)cond->mutex, ms) == WAIT_TIMEOUT ? VP_FAILURE : VP_SUCCESS;
112         #elif defined USE_PTHREAD_FOR_WIN32
113                   struct timespec ts;
114                   struct timeval tv;
115                   gettimeofday(&tv, NULL);
116                   ts.tv_sec = tv.tv_sec + ms/1000;
117                   ts.tv_nsec = (tv.tv_usec + (ms%1000))*1000;
118                   return ( pthread_cond_timedwait(&cond->cond, (pthread_mutex_t *)cond->mutex, &ts) == ETIMEDOUT ? VP_FAILURE : VP_SUCCESS );
119         #else
120                 return WaitForSingleObject(cond->LockSemaphore, ms) == WAIT_TIMEOUT ? VP_FAILURE : VP_SUCCESS; // TODO: to test
121         #endif
122 }
123
124 void
125 vp_os_cond_signal(vp_os_cond_t *cond)
126 {
127         #if defined USE_WINDOWS_CONDITION_VARIABLES
128                 WakeConditionVariable(&cond->cond);
129         #elif defined USE_PTHREAD_FOR_WIN32
130                 pthread_cond_signal(&cond->cond);
131         #endif
132 }
133
134
135 void
136 vp_os_cond_broadcast(vp_os_cond_t *cond)
137 {
138         #if defined USE_WINDOWS_CONDITION_VARIABLES
139                 /**/
140         #elif defined USE_PTHREAD_FOR_WIN32
141                 pthread_cond_broadcast(&cond->cond);
142         #endif
143         
144 }
145