forked from pgul/binkd
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsem.h
162 lines (130 loc) · 3.59 KB
/
sem.h
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/*
* sem.h -- semaphores for multithreaded version
*
* sem.h is a part of binkd project
*
* Copyright (C) 1996 Fydodor Ustinov, FIDONet 2:5020/79
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. See COPYING.
*/
#ifndef _SEM_H_
#define _SEM_H_
#if defined(WIN32)
#include <windows.h>
typedef HANDLE MUTEXSEM;
typedef HANDLE EVENTSEM;
#elif defined(OS2)
#define INCL_DOS
#include <os2.h>
typedef HMTX MUTEXSEM;
typedef HEV EVENTSEM;
#elif defined(AMIGA)
#include <exec/exec.h>
typedef struct SignalSemaphore MUTEXSEM;
#elif defined(WITH_PTHREADS)
#include <pthread.h>
typedef pthread_mutex_t MUTEXSEM;
typedef struct { pthread_cond_t cond;
pthread_mutex_t mutex;
} EVENTSEM;
#endif
/*
* Initialise Semaphores.
*/
int _InitSem (void *);
/*
* Clean Semaphores.
*/
int _CleanSem (void *);
/*
* Wait & lock semaphore
*/
int _LockSem (void *);
/*
* Release Semaphore.
*/
int _ReleaseSem (void *);
/*
* Initialise Event Semaphores.
*/
int _InitEventSem (void *);
/*
* Post Semaphore.
*/
int _PostSem (void *);
/*
* Wait Semaphore.
*/
int _WaitSem (void *, int);
/*
* Clean Event Semaphores.
*/
int _CleanEventSem (void *);
#if defined(WITH_PTHREADS)
#define InitSem(sem) pthread_mutex_init(sem, NULL)
#define CleanSem(sem) pthread_mutex_destroy(sem)
#define LockSem(sem) pthread_mutex_lock(sem)
#define ReleaseSem(sem) pthread_mutex_unlock(sem)
#define InitEventSem(sem) (pthread_cond_init(&((sem)->cond), NULL), pthread_mutex_init(&((sem)->mutex), NULL))
#define PostSem(sem) (LockSem(&((sem)->mutex)), pthread_cond_signal(&((sem)->cond)), ReleaseSem(&((sem)->mutex)))
#define WaitSem(sem, sec) _WaitSem(sem, sec)
#define CleanEventSem(sem) (pthread_cond_destroy(&((sem)->cond)), pthread_mutex_destroy(&((sem)->mutex)))
#elif defined(HAVE_THREADS) || defined(AMIGA)
#define InitSem(vpSem) _InitSem(vpSem)
#define CleanSem(vpSem) _CleanSem(vpSem)
#define LockSem(vpSem) _LockSem(vpSem)
#define ReleaseSem(vpSem) _ReleaseSem(vpSem)
#define InitEventSem(vpSem) _InitEventSem(vpSem)
#define PostSem(vpSem) _PostSem(vpSem)
#define WaitSem(vpSem, sec) _WaitSem(vpSem, sec)
#define CleanEventSem(vpSem) _CleanEventSem(vpSem)
#else /* Do nothing */
#define InitSem(vpSem)
#define CleanSem(vpSem)
#define LockSem(vpSem)
#define ReleaseSem(vpSem)
#define InitEventSem(vpSem)
#define PostSem(vpSem)
#define WaitSem(vpSem, sec)
#define CleanEventSem(vpSem)
#endif
#ifdef HAVE_THREADS
extern MUTEXSEM hostsem;
extern MUTEXSEM resolvsem;
extern MUTEXSEM lsem;
extern MUTEXSEM blsem;
extern MUTEXSEM varsem;
extern MUTEXSEM config_sem;
extern EVENTSEM eothread;
extern EVENTSEM wakecmgr;
#define lockhostsem() LockSem(&hostsem)
#define releasehostsem() ReleaseSem(&hostsem)
#define lockresolvsem() LockSem(&resolvsem)
#define releaseresolvsem() ReleaseSem(&resolvsem)
#define threadsafe(exp) LockSem(&varsem); exp; ReleaseSem(&varsem)
#if defined(PERL_MULTITHREAD)
#define lockperlsem() LockSem(&perlsem);
#define releaseperlsem() ReleaseSem(&perlsem);
#else
#define lockperlsem()
#define releaseperlsem()
#endif
#ifdef OS2
extern MUTEXSEM fhsem;
#endif
#ifdef WIN32
extern MUTEXSEM iconsem;
#endif
#else
#define lockhostsem()
#define releasehostsem()
#define lockresolvsem()
#define releaseresolvsem()
#define lockperlsem()
#define releaseperlsem()
#define threadsafe(exp) exp
#endif
#endif