Initial commit - from Precise source
[freerdp-ubuntu-pcb-backport.git] / libfreerdp-utils / semaphore.c
1 /**
2  * FreeRDP: A Remote Desktop Protocol Client
3  * Semaphore Utils
4  *
5  * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 #include <freerdp/utils/memory.h>
21 #include <freerdp/utils/semaphore.h>
22
23 #if defined __APPLE__
24
25 #include <pthread.h>
26 #include <semaphore.h>
27 #include <mach/mach.h>
28 #include <mach/semaphore.h>
29 #include <mach/task.h>
30 #define freerdp_sem_t semaphore_t
31
32 #elif defined _WIN32
33
34 #include <windows.h>
35 #define freerdp_sem_t HANDLE
36
37 #else
38
39 #include <pthread.h>
40 #include <semaphore.h>
41 #define freerdp_sem_t sem_t
42
43 #endif
44
45 freerdp_sem freerdp_sem_new(int iv)
46 {
47         freerdp_sem_t* sem;
48
49         sem = xnew(freerdp_sem_t);
50
51 #if defined __APPLE__
52         semaphore_create(mach_task_self(), sem, SYNC_POLICY_FIFO, iv);
53 #elif defined _WIN32
54         *sem = CreateSemaphore(NULL, 0, iv, NULL);
55 #else
56         sem_init(sem, 0, iv);
57 #endif
58
59         return sem;
60 }
61
62 void freerdp_sem_free(freerdp_sem sem)
63 {
64 #if defined __APPLE__
65         semaphore_destroy(mach_task_self(), *((freerdp_sem_t*)sem));
66 #elif defined _WIN32
67         CloseHandle(*((freerdp_sem_t*)sem));
68 #else
69         sem_destroy((freerdp_sem_t*)sem);
70 #endif
71
72         xfree(sem);
73 }
74
75 void freerdp_sem_signal(freerdp_sem sem)
76 {
77 #if defined __APPLE__
78         semaphore_signal(*((freerdp_sem_t*)sem));
79 #elif defined _WIN32
80         ReleaseSemaphore(*((freerdp_sem_t*)sem), 1, NULL);
81 #else
82         sem_post((freerdp_sem_t*)sem);
83 #endif
84 }
85
86 void freerdp_sem_wait(freerdp_sem sem)
87 {
88 #if defined __APPLE__
89         semaphore_wait(*((freerdp_sem_t*)sem));
90 #elif defined _WIN32
91         WaitForSingleObject(*((freerdp_sem_t*)sem), INFINITE);
92 #else
93         sem_wait((freerdp_sem_t*)sem);
94 #endif
95 }
96