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
|
/*--------------------------------------------------------------------*/
/* S e m . c */
/* */
/* Part of BinkD project */
/* Semaphore support (OS/2) for bsy.c module */
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* Copyright (c) 1996 by 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. */
/*--------------------------------------------------------------------*/
#include "../sys.h"
#include "../readcfg.h"
#include "../tools.h"
#define INCL_DOS
#include <os2.h>
#define hmtx (*(HMTX*)vpSem)
#define hevt (*(HEV*)vpSem)
/*--------------------------------------------------------------------*/
/* int InitSem(void *) */
/* */
/* Initialise Mutex Semaphore. */
/*--------------------------------------------------------------------*/
int _InitSem(void *vpSem) {
ULONG rc;
if ((rc = DosCreateMutexSem (0, &hmtx, 0, FALSE)) != 0) {
Log (0, "DosCreateMutexSem: error 0x%lx", rc);
return(-1);
}
return(0);
}
/*--------------------------------------------------------------------*/
/* int InitEventSem(void *) */
/* */
/* Initialise Event Semaphore. */
/*--------------------------------------------------------------------*/
int _InitEventSem(void *vpSem) {
ULONG rc;
if ((rc = DosCreateEventSem (NULL, &hevt, 0, FALSE)) != 0) {
Log (0, "DosCreateEventSem: error 0x%lx", rc);
return(-1);
}
return(0);
}
/*--------------------------------------------------------------------*/
/* int CleanSem(void *) */
/* */
/* Clean Mutex Semaphore. */
/*--------------------------------------------------------------------*/
int _CleanSem(void *vpSem) {
if (hmtx)
{ DosCloseMutexSem (hmtx);
hmtx = 0;
}
return (0);
}
/*--------------------------------------------------------------------*/
/* int LockSem(void *) */
/* */
/* Wait & lock semaphore */
/*--------------------------------------------------------------------*/
int _LockSem(void *vpSem) {
ULONG rc;
if (hmtx == 0) return (-1);
if ((rc = DosRequestMutexSem (hmtx, SEM_INDEFINITE_WAIT)) != 0) {
_CleanSem (vpSem);
Log (0, "DosRequestMutexSem retcode 0x%lx", rc);
}
return (0);
}
/*--------------------------------------------------------------------*/
/* int ReleaseSem(void *) */
/* */
/* Release Semaphore. */
/*--------------------------------------------------------------------*/
int _ReleaseSem(void *vpSem) {
if (hmtx == 0) return (-1);
DosReleaseMutexSem (hmtx);
return (0);
}
/*--------------------------------------------------------------------*/
/* int PostSem(void *) */
/* */
/* Post Event Semaphore. */
/*--------------------------------------------------------------------*/
int _PostSem(void *vpSem) {
if (hmtx == 0) return (-1);
DosPostEventSem (hevt);
return (0);
}
/*--------------------------------------------------------------------*/
/* int WaitSem(void *, int) */
/* */
/* Wait Event Semaphore. */
/*--------------------------------------------------------------------*/
int _WaitSem(void *vpSem, int timeout) {
ULONG semcount;
if (hmtx == 0) return (-1);
if (DosWaitEventSem (hevt, timeout * 1000ul))
return -1;
DosResetEventSem (hevt, &semcount);
return 0;
}
/*--------------------------------------------------------------------*/
/* int CleanEventSem(void *) */
/* */
/* Clean Semaphores. */
/*--------------------------------------------------------------------*/
int _CleanEventSem(void *vpSem) {
if (hevt)
{ DosCloseEventSem (hevt);
hevt = 0;
}
return 0;
}
|