1c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju/*
2c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * Copyright 2016 The Android Open Source Project
3c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju *
4c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * Licensed under the Apache License, Version 2.0 (the "License");
5c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * you may not use this file except in compliance with the License.
6c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * You may obtain a copy of the License at
7c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju *
8c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju *      http://www.apache.org/licenses/LICENSE-2.0
9c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju *
10c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * Unless required by applicable law or agreed to in writing, software
11c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * distributed under the License is distributed on an "AS IS" BASIS,
12c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * See the License for the specific language governing permissions and
14c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * limitations under the License.
15c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju */
16c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
17c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#ifndef ANDROID_SURFACEREPLAYER_EVENT_H
18c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#define ANDROID_SURFACEREPLAYER_EVENT_H
19c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
20c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <frameworks/native/cmds/surfacereplayer/proto/src/trace.pb.h>
21c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
22c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <condition_variable>
23c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <mutex>
24c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
25c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjunamespace android {
26c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
27c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuclass Event {
28c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju  public:
29c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    Event(Increment::IncrementCase);
30c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
31c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    enum class EventState {
32c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        SettingUp,  // Completing as much time-independent work as possible
33c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        Waiting,    // Waiting for signal from main thread to finish execution
34c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        Signaled,   // Signaled by main thread, about to immediately switch to Running
35c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        Running     // Finishing execution of rest of work
36c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    };
37c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
38c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    void readyToExecute();
39c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    void complete();
40c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
41c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    Increment::IncrementCase getIncrementType();
42c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
43c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju  private:
44c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    void waitUntil(EventState state);
45c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    void changeState(EventState state);
46c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
47c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    std::mutex mLock;
48c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    std::condition_variable mCond;
49c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
50c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    EventState mState = EventState::SettingUp;
51c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
52c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    Increment::IncrementCase mIncrementType;
53c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju};
54c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju}
55c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#endif
56