xref: /aoo4110/main/sal/osl/w32/conditn.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/conditn.h>
27*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
28*b1cdbd2cSJim Jagielski #include <osl/time.h>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski /*
31*b1cdbd2cSJim Jagielski 	under WIN32, we use the void* oslCondition
32*b1cdbd2cSJim Jagielski 	as a WIN32 HANDLE (which is also a 32-bit value)
33*b1cdbd2cSJim Jagielski */
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski /*****************************************************************************/
36*b1cdbd2cSJim Jagielski /* osl_createCondition */
37*b1cdbd2cSJim Jagielski /*****************************************************************************/
osl_createCondition(void)38*b1cdbd2cSJim Jagielski oslCondition SAL_CALL osl_createCondition(void)
39*b1cdbd2cSJim Jagielski {
40*b1cdbd2cSJim Jagielski 	oslCondition Condition;
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski 	Condition= (oslCondition)CreateEvent(0,			/* no security */
43*b1cdbd2cSJim Jagielski 										 sal_True,		/* manual reset */
44*b1cdbd2cSJim Jagielski 										 sal_False,		/* initial state not signaled */
45*b1cdbd2cSJim Jagielski 										 0);		/* automatic name */
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski 	return Condition;
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski }
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski /*****************************************************************************/
52*b1cdbd2cSJim Jagielski /* osl_destroyCondition */
53*b1cdbd2cSJim Jagielski /*****************************************************************************/
osl_destroyCondition(oslCondition Condition)54*b1cdbd2cSJim Jagielski void SAL_CALL osl_destroyCondition(oslCondition Condition)
55*b1cdbd2cSJim Jagielski {
56*b1cdbd2cSJim Jagielski 	if(Condition)
57*b1cdbd2cSJim Jagielski 	{
58*b1cdbd2cSJim Jagielski 		OSL_VERIFY(CloseHandle(Condition));
59*b1cdbd2cSJim Jagielski 	}
60*b1cdbd2cSJim Jagielski }
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski /*****************************************************************************/
63*b1cdbd2cSJim Jagielski /* osl_setCondition */
64*b1cdbd2cSJim Jagielski /*****************************************************************************/
osl_setCondition(oslCondition Condition)65*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_setCondition(oslCondition Condition)
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski 	OSL_ASSERT(Condition);
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski 	return (sal_Bool)(SetEvent((HANDLE)Condition) != FALSE);
70*b1cdbd2cSJim Jagielski }
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski /*****************************************************************************/
73*b1cdbd2cSJim Jagielski /* osl_resetCondition */
74*b1cdbd2cSJim Jagielski /*****************************************************************************/
osl_resetCondition(oslCondition Condition)75*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_resetCondition(oslCondition Condition)
76*b1cdbd2cSJim Jagielski {
77*b1cdbd2cSJim Jagielski 	OSL_ASSERT(Condition);
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski 	return (sal_Bool)(ResetEvent((HANDLE)Condition) != FALSE);
80*b1cdbd2cSJim Jagielski }
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski /*****************************************************************************/
83*b1cdbd2cSJim Jagielski /* osl_waitCondition */
84*b1cdbd2cSJim Jagielski /*****************************************************************************/
osl_waitCondition(oslCondition Condition,const TimeValue * pTimeout)85*b1cdbd2cSJim Jagielski oslConditionResult SAL_CALL osl_waitCondition(oslCondition Condition,
86*b1cdbd2cSJim Jagielski 									 const TimeValue* pTimeout)
87*b1cdbd2cSJim Jagielski {
88*b1cdbd2cSJim Jagielski 	DWORD timeout;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski 	OSL_ASSERT(Condition);
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski 	if (pTimeout)
93*b1cdbd2cSJim Jagielski 		timeout = pTimeout->Seconds * 1000 + pTimeout->Nanosec / 1000000L;
94*b1cdbd2cSJim Jagielski 	else
95*b1cdbd2cSJim Jagielski 		timeout = INFINITE;
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski 	/* It's necessary to process SendMessage calls to the current thread to give other threads
98*b1cdbd2cSJim Jagielski 		access to COM objects instatiated in this thread */
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski 	while ( 1 )
101*b1cdbd2cSJim Jagielski 	{
102*b1cdbd2cSJim Jagielski 		/* Only wake up if a SendMessage call to the threads message loop is detected */
103*b1cdbd2cSJim Jagielski         switch( MsgWaitForMultipleObjects( 1, (HANDLE *)(&Condition), FALSE, timeout, QS_SENDMESSAGE ) )
104*b1cdbd2cSJim Jagielski 		{
105*b1cdbd2cSJim Jagielski 			case WAIT_OBJECT_0 + 1:
106*b1cdbd2cSJim Jagielski 				{
107*b1cdbd2cSJim Jagielski 				MSG	msg;
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski 				/* We Must not dispatch the message. PM_NOREMOVE leaves the message queue untouched
110*b1cdbd2cSJim Jagielski 				 but dispatches SendMessage calls automatically */
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 				PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE );
113*b1cdbd2cSJim Jagielski 				}
114*b1cdbd2cSJim Jagielski 				break;
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 			case WAIT_OBJECT_0:
117*b1cdbd2cSJim Jagielski 				return (osl_cond_result_ok);
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski 			case WAIT_TIMEOUT:
120*b1cdbd2cSJim Jagielski 				return (osl_cond_result_timeout);
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski 			default:
123*b1cdbd2cSJim Jagielski 				return (osl_cond_result_error);
124*b1cdbd2cSJim Jagielski 		}
125*b1cdbd2cSJim Jagielski 	}
126*b1cdbd2cSJim Jagielski }
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski /*****************************************************************************/
129*b1cdbd2cSJim Jagielski /* osl_checkCondition */
130*b1cdbd2cSJim Jagielski /*****************************************************************************/
osl_checkCondition(oslCondition Condition)131*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_checkCondition(oslCondition Condition)
132*b1cdbd2cSJim Jagielski {
133*b1cdbd2cSJim Jagielski 	OSL_ASSERT(Condition);
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski 	return (sal_Bool)(WaitForSingleObject((HANDLE)Condition, 0) == WAIT_OBJECT_0);
136*b1cdbd2cSJim Jagielski }
137*b1cdbd2cSJim Jagielski 
138