1525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*
2525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Copyright (C) 2012 The Android Open Source Project
3525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
4525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * you may not use this file except in compliance with the License.
6525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * You may obtain a copy of the License at
7525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
8525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
10525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * See the License for the specific language governing permissions and
14525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * limitations under the License.
15525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */
16525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
17525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*
18525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *  Synchronize two or more threads using a condition variable and a mutex.
19525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */
20525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#pragma once
21525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "CondVar.h"
22525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "Mutex.h"
23525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
24525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
25525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectclass SyncEvent
26525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
27525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectpublic:
28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /*******************************************************************************
29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
30525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Function:        ~SyncEvent
31525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
32525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Description:     Cleanup all resources.
33525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Returns:         None.
35525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    *******************************************************************************/
37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ~SyncEvent ()
38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
39525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
42525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /*******************************************************************************
43525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
44525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Function:        start
45525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
46525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Description:     Start a synchronization operation.
47525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
48525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Returns:         None.
49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
50525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    *******************************************************************************/
51525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    void start ()
52525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
53525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mMutex.lock ();
54525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
55525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /*******************************************************************************
58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Function:        wait
60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Description:     Block the thread and wait for the event to occur.
62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
63525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Returns:         None.
64525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
65525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    *******************************************************************************/
66525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    void wait ()
67525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
68525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mCondVar.wait (mMutex);
69525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
70525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /*******************************************************************************
73525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
74525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Function:        wait
75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Description:     Block the thread and wait for the event to occur.
77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **                  millisec: Timeout in milliseconds.
78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Returns:         True if wait is successful; false if timeout occurs.
80525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    *******************************************************************************/
82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    bool wait (long millisec)
83525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        bool retVal = mCondVar.wait (mMutex, millisec);
85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return retVal;
86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
87525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
88525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
89525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /*******************************************************************************
90525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
91525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Function:        notifyOne
92525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
93525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Description:     Notify a blocked thread that the event has occured. Unblocks it.
94525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
95525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Returns:         None.
96525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
97525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    *******************************************************************************/
98525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    void notifyOne ()
99525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mCondVar.notifyOne ();
101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
103525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
104525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /*******************************************************************************
105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Function:        end
107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Description:     End a synchronization operation.
109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Returns:         None.
111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    *******************************************************************************/
113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    void end ()
114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mMutex.unlock ();
116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectprivate:
119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    CondVar mCondVar;
120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    Mutex mMutex;
121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project};
122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*****************************************************************************/
125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*****************************************************************************/
126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*****************************************************************************
129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**  Name:           SyncEventGuard
131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**  Description:    Automatically start and end a synchronization event.
133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*****************************************************************************/
135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectclass SyncEventGuard
136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectpublic:
138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /*******************************************************************************
139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
140525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Function:        SyncEventGuard
141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Description:     Start a synchronization operation.
143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Returns:         None.
145525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
146525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    *******************************************************************************/
147525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    SyncEventGuard (SyncEvent& event)
148525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    :   mEvent (event)
149525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
150525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        event.start (); //automatically start operation
151525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    };
152525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
153525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
154525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    /*******************************************************************************
155525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
156525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Function:        ~SyncEventGuard
157525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
158525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Description:     End a synchronization operation.
159525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
160525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ** Returns:         None.
161525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    **
162525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    *******************************************************************************/
163525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ~SyncEventGuard ()
164525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    {
165525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        mEvent.end (); //automatically end operation
166525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    };
167525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
168525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectprivate:
169525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    SyncEvent& mEvent;
170525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project};
171525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
172