/******************************************************************************
*
* Copyright (C) 2012 Broadcom Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
/******************************************************************************
*
* Synchronize two or more threads using a condition variable and a mutex.
*
******************************************************************************/
#pragma once
#include "CondVar.h"
#include "Mutex.h"
class SyncEvent {
public:
/*******************************************************************************
**
** Function: ~SyncEvent
**
** Description: Cleanup all resources.
**
** Returns: None.
**
*******************************************************************************/
~SyncEvent() {}
/*******************************************************************************
**
** Function: start
**
** Description: Start a synchronization operation.
**
** Returns: None.
**
*******************************************************************************/
void start() { mMutex.lock(); }
/*******************************************************************************
**
** Function: wait
**
** Description: Block the thread and wait for the event to occur.
**
** Returns: None.
**
*******************************************************************************/
void wait() { mCondVar.wait(mMutex); }
/*******************************************************************************
**
** Function: wait
**
** Description: Block the thread and wait for the event to occur.
** millisec: Timeout in milliseconds.
**
** Returns: True if wait is successful; false if timeout occurs.
**
*******************************************************************************/
bool wait(long millisec) {
bool retVal = mCondVar.wait(mMutex, millisec);
return retVal;
}
/*******************************************************************************
**
** Function: notifyOne
**
** Description: Notify a blocked thread that the event has occured.
*Unblocks it.
**
** Returns: None.
**
*******************************************************************************/
void notifyOne() { mCondVar.notifyOne(); }
/*******************************************************************************
**
** Function: end
**
** Description: End a synchronization operation.
**
** Returns: None.
**
*******************************************************************************/
void end() { mMutex.unlock(); }
private:
CondVar mCondVar;
Mutex mMutex;
};
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************
**
** Name: SyncEventGuard
**
** Description: Automatically start and end a synchronization event.
**
*****************************************************************************/
class SyncEventGuard {
public:
/*******************************************************************************
**
** Function: SyncEventGuard
**
** Description: Start a synchronization operation.
**
** Returns: None.
**
*******************************************************************************/
SyncEventGuard(SyncEvent& event) : mEvent(event) {
event.start(); // automatically start operation
};
/*******************************************************************************
**
** Function: ~SyncEventGuard
**
** Description: End a synchronization operation.
**
** Returns: None.
**
*******************************************************************************/
~SyncEventGuard() {
mEvent.end(); // automatically end operation
};
private:
SyncEvent& mEvent;
};