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