1 /****************************************************************************** 2 * 3 * Copyright (C) 2012 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 /****************************************************************************** 20 * 21 * Synchronize two or more threads using a condition variable and a mutex. 22 * 23 ******************************************************************************/ 24 #pragma once 25 #include "CondVar.h" 26 #include "Mutex.h" 27 28 class SyncEvent { 29 public: 30 /******************************************************************************* 31 ** 32 ** Function: ~SyncEvent 33 ** 34 ** Description: Cleanup all resources. 35 ** 36 ** Returns: None. 37 ** 38 *******************************************************************************/ ~SyncEvent()39 ~SyncEvent() {} 40 41 /******************************************************************************* 42 ** 43 ** Function: start 44 ** 45 ** Description: Start a synchronization operation. 46 ** 47 ** Returns: None. 48 ** 49 *******************************************************************************/ start()50 void start() { mMutex.lock(); } 51 52 /******************************************************************************* 53 ** 54 ** Function: wait 55 ** 56 ** Description: Block the thread and wait for the event to occur. 57 ** 58 ** Returns: None. 59 ** 60 *******************************************************************************/ wait()61 void wait() { mCondVar.wait(mMutex); } 62 63 /******************************************************************************* 64 ** 65 ** Function: wait 66 ** 67 ** Description: Block the thread and wait for the event to occur. 68 ** millisec: Timeout in milliseconds. 69 ** 70 ** Returns: True if wait is successful; false if timeout occurs. 71 ** 72 *******************************************************************************/ wait(long millisec)73 bool wait(long millisec) { 74 bool retVal = mCondVar.wait(mMutex, millisec); 75 return retVal; 76 } 77 78 /******************************************************************************* 79 ** 80 ** Function: notifyOne 81 ** 82 ** Description: Notify a blocked thread that the event has occured. 83 *Unblocks it. 84 ** 85 ** Returns: None. 86 ** 87 *******************************************************************************/ notifyOne()88 void notifyOne() { mCondVar.notifyOne(); } 89 90 /******************************************************************************* 91 ** 92 ** Function: end 93 ** 94 ** Description: End a synchronization operation. 95 ** 96 ** Returns: None. 97 ** 98 *******************************************************************************/ end()99 void end() { mMutex.unlock(); } 100 101 private: 102 CondVar mCondVar; 103 Mutex mMutex; 104 }; 105 106 /*****************************************************************************/ 107 /*****************************************************************************/ 108 109 /***************************************************************************** 110 ** 111 ** Name: SyncEventGuard 112 ** 113 ** Description: Automatically start and end a synchronization event. 114 ** 115 *****************************************************************************/ 116 class SyncEventGuard { 117 public: 118 /******************************************************************************* 119 ** 120 ** Function: SyncEventGuard 121 ** 122 ** Description: Start a synchronization operation. 123 ** 124 ** Returns: None. 125 ** 126 *******************************************************************************/ SyncEventGuard(SyncEvent & event)127 SyncEventGuard(SyncEvent& event) : mEvent(event) { 128 event.start(); // automatically start operation 129 }; 130 131 /******************************************************************************* 132 ** 133 ** Function: ~SyncEventGuard 134 ** 135 ** Description: End a synchronization operation. 136 ** 137 ** Returns: None. 138 ** 139 *******************************************************************************/ ~SyncEventGuard()140 ~SyncEventGuard() { 141 mEvent.end(); // automatically end operation 142 }; 143 144 private: 145 SyncEvent& mEvent; 146 }; 147