-
Notifications
You must be signed in to change notification settings - Fork 1
/
ALooper.h
88 lines (63 loc) · 2.75 KB
/
ALooper.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#pragma once
#include <stdint.h>
#include "Errors.h"
#include "Base.h"
namespace android {
struct AHandler;
struct AMessage;
struct AReplyToken;
struct ALooper : public std::enable_shared_from_this<ALooper> {
typedef int32_t event_id;
typedef int32_t handler_id;
ALooper();
// Takes effect in a subsequent call to start().
void setName(const char* name);
handler_id registerHandler(const std::shared_ptr<AHandler>& handler);
void unregisterHandler(handler_id handlerID);
status_t start(
bool runOnCallingThread = false,
bool canCallJava = false,
int32_t priority = 0
);
status_t stop();
static int64_t GetNowUs();
const char* getName() const {
return mName.c_str();
}
virtual ~ALooper();
private:
friend struct AMessage; // post()
friend struct AHandler;
struct Event {
int64_t mWhenUs;
std::shared_ptr<AMessage> mMessage;
};
std::mutex mLock;
std::condition_variable mQueueChangedCondition;
std::string mName;
std::vector<Event> mEventQueue;
struct LooperThread;
std::shared_ptr<LooperThread> mThread;
bool mRunningLocally;
// use a separate lock for reply handling, as it is always on another thread
// use a central lock, however, to avoid creating a mutex for each reply
std::mutex mRepliesLock;
std::condition_variable mRepliesCondition;
// START --- methods used only by AMessage
// posts a message on this looper with the given timeout
void post(const std::shared_ptr<AMessage>& msg, int64_t delayUs);
void remove(const std::shared_ptr<AHandler>& handler);
void remove(const std::shared_ptr<AHandler>& handler, int what);
// creates a reply token to be used with this looper
std::shared_ptr<AReplyToken> createReplyToken();
// waits for a response for the reply token. If status is OK, the response
// is stored into the supplied variable. Otherwise, it is unchanged.
status_t awaitResponse(const std::shared_ptr<AReplyToken>& replyToken, std::shared_ptr<AMessage>* response);
// posts a reply for a reply token. If the reply could be successfully posted,
// it returns OK. Otherwise, it returns an error value.
status_t postReply(const std::shared_ptr<AReplyToken>& replyToken, const std::shared_ptr<AMessage>& msg);
// END --- methods used only by AMessage
bool loop();
DISALLOW_EVIL_CONSTRUCTORS(ALooper);
};
} // namespace android