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