1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski #include "system.h"
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
27*b1cdbd2cSJim Jagielski #include <osl/semaphor.h>
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski /*
30*b1cdbd2cSJim Jagielski Implemetation notes:
31*b1cdbd2cSJim Jagielski The void* represented by oslSemaphore is used
32*b1cdbd2cSJim Jagielski to store a OS/2 HANDLE.
33*b1cdbd2cSJim Jagielski */
34*b1cdbd2cSJim Jagielski
35*b1cdbd2cSJim Jagielski typedef struct _oslSemaphoreImpl
36*b1cdbd2cSJim Jagielski {
37*b1cdbd2cSJim Jagielski HEV hevReachedZero;
38*b1cdbd2cSJim Jagielski int nCount;
39*b1cdbd2cSJim Jagielski } oslSemaphoreImpl;
40*b1cdbd2cSJim Jagielski
41*b1cdbd2cSJim Jagielski // static mutex to control access to private members of oslMutexImpl
42*b1cdbd2cSJim Jagielski static HMTX MutexLock = NULL;
43*b1cdbd2cSJim Jagielski
44*b1cdbd2cSJim Jagielski /*****************************************************************************/
45*b1cdbd2cSJim Jagielski /* osl_createSemaphore */
46*b1cdbd2cSJim Jagielski /*****************************************************************************/
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski /*
49*b1cdbd2cSJim Jagielski - Erzeugen der Semaphore
50*b1cdbd2cSJim Jagielski - Z�hler auf initialCount setzen
51*b1cdbd2cSJim Jagielski */
osl_createSemaphore(sal_uInt32 initialCount)52*b1cdbd2cSJim Jagielski oslSemaphore SAL_CALL osl_createSemaphore(sal_uInt32 initialCount)
53*b1cdbd2cSJim Jagielski {
54*b1cdbd2cSJim Jagielski APIRET rc;
55*b1cdbd2cSJim Jagielski oslSemaphoreImpl * pSemaphoreImpl;
56*b1cdbd2cSJim Jagielski
57*b1cdbd2cSJim Jagielski /* alloc mem. for our internal data structure */
58*b1cdbd2cSJim Jagielski pSemaphoreImpl = (oslSemaphoreImpl *) malloc(sizeof(oslSemaphoreImpl));
59*b1cdbd2cSJim Jagielski if( pSemaphoreImpl == NULL )
60*b1cdbd2cSJim Jagielski return NULL;
61*b1cdbd2cSJim Jagielski
62*b1cdbd2cSJim Jagielski /* create semaphore */
63*b1cdbd2cSJim Jagielski rc = DosCreateEventSem( NULL,
64*b1cdbd2cSJim Jagielski &pSemaphoreImpl->hevReachedZero,
65*b1cdbd2cSJim Jagielski DC_SEM_SHARED,
66*b1cdbd2cSJim Jagielski FALSE );
67*b1cdbd2cSJim Jagielski if( rc != NO_ERROR )
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski free( pSemaphoreImpl );
70*b1cdbd2cSJim Jagielski return NULL;
71*b1cdbd2cSJim Jagielski }
72*b1cdbd2cSJim Jagielski
73*b1cdbd2cSJim Jagielski pSemaphoreImpl->nCount = initialCount;
74*b1cdbd2cSJim Jagielski
75*b1cdbd2cSJim Jagielski // create static mutex for private members
76*b1cdbd2cSJim Jagielski if (MutexLock == NULL)
77*b1cdbd2cSJim Jagielski DosCreateMutexSem( NULL, &MutexLock, 0, FALSE );
78*b1cdbd2cSJim Jagielski
79*b1cdbd2cSJim Jagielski return (oslSemaphore) pSemaphoreImpl;
80*b1cdbd2cSJim Jagielski }
81*b1cdbd2cSJim Jagielski
82*b1cdbd2cSJim Jagielski /*****************************************************************************/
83*b1cdbd2cSJim Jagielski /* osl_destroySemaphore */
84*b1cdbd2cSJim Jagielski /*****************************************************************************/
85*b1cdbd2cSJim Jagielski
86*b1cdbd2cSJim Jagielski /*
87*b1cdbd2cSJim Jagielski - Semaphore l�schen
88*b1cdbd2cSJim Jagielski */
89*b1cdbd2cSJim Jagielski
osl_destroySemaphore(oslSemaphore Semaphore)90*b1cdbd2cSJim Jagielski void SAL_CALL osl_destroySemaphore(oslSemaphore Semaphore)
91*b1cdbd2cSJim Jagielski {
92*b1cdbd2cSJim Jagielski oslSemaphoreImpl* pSemaphoreImpl = (oslSemaphoreImpl*)Semaphore;
93*b1cdbd2cSJim Jagielski OSL_ASSERT(Semaphore != 0);
94*b1cdbd2cSJim Jagielski
95*b1cdbd2cSJim Jagielski DosCloseEventSem( pSemaphoreImpl->hevReachedZero );
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielski free( pSemaphoreImpl );
98*b1cdbd2cSJim Jagielski }
99*b1cdbd2cSJim Jagielski
100*b1cdbd2cSJim Jagielski /*****************************************************************************/
101*b1cdbd2cSJim Jagielski /* osl_acquireSemaphore */
102*b1cdbd2cSJim Jagielski /*****************************************************************************/
103*b1cdbd2cSJim Jagielski /*
104*b1cdbd2cSJim Jagielski - Z�hler -1
105*b1cdbd2cSJim Jagielski - wenn Z�hler < 0: blockieren
106*b1cdbd2cSJim Jagielski */
107*b1cdbd2cSJim Jagielski
osl_acquireSemaphore(oslSemaphore Semaphore)108*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_acquireSemaphore(oslSemaphore Semaphore)
109*b1cdbd2cSJim Jagielski {
110*b1cdbd2cSJim Jagielski APIRET rc;
111*b1cdbd2cSJim Jagielski oslSemaphoreImpl* pSemaphoreImpl = (oslSemaphoreImpl*)Semaphore;
112*b1cdbd2cSJim Jagielski int nCount;
113*b1cdbd2cSJim Jagielski OSL_ASSERT(Semaphore != 0);
114*b1cdbd2cSJim Jagielski
115*b1cdbd2cSJim Jagielski DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
116*b1cdbd2cSJim Jagielski
117*b1cdbd2cSJim Jagielski while( pSemaphoreImpl->nCount < 1 )
118*b1cdbd2cSJim Jagielski {
119*b1cdbd2cSJim Jagielski sal_uInt32 nPostCount;
120*b1cdbd2cSJim Jagielski
121*b1cdbd2cSJim Jagielski DosReleaseMutexSem( MutexLock);
122*b1cdbd2cSJim Jagielski
123*b1cdbd2cSJim Jagielski rc = DosWaitEventSem(pSemaphoreImpl->hevReachedZero, SEM_INDEFINITE_WAIT );
124*b1cdbd2cSJim Jagielski DosResetEventSem(pSemaphoreImpl->hevReachedZero, &nPostCount);
125*b1cdbd2cSJim Jagielski
126*b1cdbd2cSJim Jagielski DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski
129*b1cdbd2cSJim Jagielski pSemaphoreImpl->nCount--;
130*b1cdbd2cSJim Jagielski DosReleaseMutexSem( MutexLock);
131*b1cdbd2cSJim Jagielski
132*b1cdbd2cSJim Jagielski return( rc == NO_ERROR );
133*b1cdbd2cSJim Jagielski }
134*b1cdbd2cSJim Jagielski
135*b1cdbd2cSJim Jagielski /*****************************************************************************/
136*b1cdbd2cSJim Jagielski /* osl_tryToAcquireSemaphore */
137*b1cdbd2cSJim Jagielski /*****************************************************************************/
138*b1cdbd2cSJim Jagielski /*
139*b1cdbd2cSJim Jagielski - Z�hler -1, wenn vorher > 0
140*b1cdbd2cSJim Jagielski - wenn Z�hler < 0: mit FALSE zurueck
141*b1cdbd2cSJim Jagielski */
osl_tryToAcquireSemaphore(oslSemaphore Semaphore)142*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_tryToAcquireSemaphore(oslSemaphore Semaphore)
143*b1cdbd2cSJim Jagielski {
144*b1cdbd2cSJim Jagielski APIRET rc;
145*b1cdbd2cSJim Jagielski oslSemaphoreImpl* pSemaphoreImpl = (oslSemaphoreImpl*)Semaphore;
146*b1cdbd2cSJim Jagielski int nCount;
147*b1cdbd2cSJim Jagielski OSL_ASSERT(Semaphore != 0);
148*b1cdbd2cSJim Jagielski
149*b1cdbd2cSJim Jagielski DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
150*b1cdbd2cSJim Jagielski
151*b1cdbd2cSJim Jagielski nCount = pSemaphoreImpl->nCount;
152*b1cdbd2cSJim Jagielski if( pSemaphoreImpl->nCount > 0 )
153*b1cdbd2cSJim Jagielski pSemaphoreImpl->nCount--;
154*b1cdbd2cSJim Jagielski
155*b1cdbd2cSJim Jagielski DosReleaseMutexSem( MutexLock);
156*b1cdbd2cSJim Jagielski
157*b1cdbd2cSJim Jagielski return( nCount > 0 );
158*b1cdbd2cSJim Jagielski }
159*b1cdbd2cSJim Jagielski
160*b1cdbd2cSJim Jagielski /*****************************************************************************/
161*b1cdbd2cSJim Jagielski /* osl_releaseSemaphore */
162*b1cdbd2cSJim Jagielski /*****************************************************************************/
163*b1cdbd2cSJim Jagielski /*
164*b1cdbd2cSJim Jagielski - Z�hler +1
165*b1cdbd2cSJim Jagielski */
osl_releaseSemaphore(oslSemaphore Semaphore)166*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_releaseSemaphore(oslSemaphore Semaphore)
167*b1cdbd2cSJim Jagielski {
168*b1cdbd2cSJim Jagielski APIRET rc;
169*b1cdbd2cSJim Jagielski oslSemaphoreImpl* pSemaphoreImpl = (oslSemaphoreImpl*)Semaphore;
170*b1cdbd2cSJim Jagielski int nCount;
171*b1cdbd2cSJim Jagielski OSL_ASSERT(Semaphore != 0);
172*b1cdbd2cSJim Jagielski
173*b1cdbd2cSJim Jagielski DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
174*b1cdbd2cSJim Jagielski
175*b1cdbd2cSJim Jagielski nCount = pSemaphoreImpl->nCount;
176*b1cdbd2cSJim Jagielski pSemaphoreImpl->nCount++;
177*b1cdbd2cSJim Jagielski
178*b1cdbd2cSJim Jagielski DosReleaseMutexSem( MutexLock);
179*b1cdbd2cSJim Jagielski
180*b1cdbd2cSJim Jagielski if( nCount == 0 )
181*b1cdbd2cSJim Jagielski DosPostEventSem(pSemaphoreImpl->hevReachedZero);
182*b1cdbd2cSJim Jagielski
183*b1cdbd2cSJim Jagielski return( rc == NO_ERROR );
184*b1cdbd2cSJim Jagielski }
185*b1cdbd2cSJim Jagielski
186*b1cdbd2cSJim Jagielski
187