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
|