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