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 /*****************************************************************************/ 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 /*****************************************************************************/ 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 /*****************************************************************************/ 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 /*****************************************************************************/ 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 /*****************************************************************************/ 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 /*****************************************************************************/ 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