xref: /aoo4110/main/sal/osl/os2/semaphor.c (revision b1cdbd2c)
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