1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 #include "system.h"
25
26 #include <osl/conditn.h>
27 #include <osl/diagnose.h>
28 #include <osl/time.h>
29
30 /*
31 under WIN32, we use the void* oslCondition
32 as a WIN32 HANDLE (which is also a 32-bit value)
33 */
34
35 /*****************************************************************************/
36 /* osl_createCondition */
37 /*****************************************************************************/
osl_createCondition(void)38 oslCondition SAL_CALL osl_createCondition(void)
39 {
40 oslCondition Condition;
41
42 Condition= (oslCondition)CreateEvent(0, /* no security */
43 sal_True, /* manual reset */
44 sal_False, /* initial state not signaled */
45 0); /* automatic name */
46
47 return Condition;
48
49 }
50
51 /*****************************************************************************/
52 /* osl_destroyCondition */
53 /*****************************************************************************/
osl_destroyCondition(oslCondition Condition)54 void SAL_CALL osl_destroyCondition(oslCondition Condition)
55 {
56 if(Condition)
57 {
58 OSL_VERIFY(CloseHandle(Condition));
59 }
60 }
61
62 /*****************************************************************************/
63 /* osl_setCondition */
64 /*****************************************************************************/
osl_setCondition(oslCondition Condition)65 sal_Bool SAL_CALL osl_setCondition(oslCondition Condition)
66 {
67 OSL_ASSERT(Condition);
68
69 return (sal_Bool)(SetEvent((HANDLE)Condition) != FALSE);
70 }
71
72 /*****************************************************************************/
73 /* osl_resetCondition */
74 /*****************************************************************************/
osl_resetCondition(oslCondition Condition)75 sal_Bool SAL_CALL osl_resetCondition(oslCondition Condition)
76 {
77 OSL_ASSERT(Condition);
78
79 return (sal_Bool)(ResetEvent((HANDLE)Condition) != FALSE);
80 }
81
82 /*****************************************************************************/
83 /* osl_waitCondition */
84 /*****************************************************************************/
osl_waitCondition(oslCondition Condition,const TimeValue * pTimeout)85 oslConditionResult SAL_CALL osl_waitCondition(oslCondition Condition,
86 const TimeValue* pTimeout)
87 {
88 DWORD timeout;
89
90 OSL_ASSERT(Condition);
91
92 if (pTimeout)
93 timeout = pTimeout->Seconds * 1000 + pTimeout->Nanosec / 1000000L;
94 else
95 timeout = INFINITE;
96
97 /* It's necessary to process SendMessage calls to the current thread to give other threads
98 access to COM objects instatiated in this thread */
99
100 while ( 1 )
101 {
102 /* Only wake up if a SendMessage call to the threads message loop is detected */
103 switch( MsgWaitForMultipleObjects( 1, (HANDLE *)(&Condition), FALSE, timeout, QS_SENDMESSAGE ) )
104 {
105 case WAIT_OBJECT_0 + 1:
106 {
107 MSG msg;
108
109 /* We Must not dispatch the message. PM_NOREMOVE leaves the message queue untouched
110 but dispatches SendMessage calls automatically */
111
112 PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE );
113 }
114 break;
115
116 case WAIT_OBJECT_0:
117 return (osl_cond_result_ok);
118
119 case WAIT_TIMEOUT:
120 return (osl_cond_result_timeout);
121
122 default:
123 return (osl_cond_result_error);
124 }
125 }
126 }
127
128 /*****************************************************************************/
129 /* osl_checkCondition */
130 /*****************************************************************************/
osl_checkCondition(oslCondition Condition)131 sal_Bool SAL_CALL osl_checkCondition(oslCondition Condition)
132 {
133 OSL_ASSERT(Condition);
134
135 return (sal_Bool)(WaitForSingleObject((HANDLE)Condition, 0) == WAIT_OBJECT_0);
136 }
137
138