PageRenderTime 47ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/frameworks/native/libs/utils/Looper.cpp

https://gitlab.com/brian0218/rk3066_r-box_android4.2.2_sdk
C++ | 561 lines | 434 code | 92 blank | 35 comment | 120 complexity | 0549c0540a74e9bb902e924bcdea73db MD5 | raw file
  1. //
  2. // Copyright 2010 The Android Open Source Project
  3. //
  4. // A looper implementation based on epoll().
  5. //
  6. #define LOG_TAG "Looper"
  7. //#define LOG_NDEBUG 0
  8. // Debugs poll and wake interactions.
  9. #define DEBUG_POLL_AND_WAKE 0
  10. // Debugs callback registration and invocation.
  11. #define DEBUG_CALLBACKS 0
  12. #include <cutils/log.h>
  13. #include <utils/Looper.h>
  14. #include <utils/Timers.h>
  15. #include <unistd.h>
  16. #include <fcntl.h>
  17. #include <limits.h>
  18. namespace android {
  19. // --- WeakMessageHandler ---
  20. WeakMessageHandler::WeakMessageHandler(const wp<MessageHandler>& handler) :
  21. mHandler(handler) {
  22. }
  23. WeakMessageHandler::~WeakMessageHandler() {
  24. }
  25. void WeakMessageHandler::handleMessage(const Message& message) {
  26. sp<MessageHandler> handler = mHandler.promote();
  27. if (handler != NULL) {
  28. handler->handleMessage(message);
  29. }
  30. }
  31. // --- SimpleLooperCallback ---
  32. SimpleLooperCallback::SimpleLooperCallback(ALooper_callbackFunc callback) :
  33. mCallback(callback) {
  34. }
  35. SimpleLooperCallback::~SimpleLooperCallback() {
  36. }
  37. int SimpleLooperCallback::handleEvent(int fd, int events, void* data) {
  38. return mCallback(fd, events, data);
  39. }
  40. // --- Looper ---
  41. // Hint for number of file descriptors to be associated with the epoll instance.
  42. static const int EPOLL_SIZE_HINT = 8;
  43. // Maximum number of file descriptors for which to retrieve poll events each iteration.
  44. static const int EPOLL_MAX_EVENTS = 16;
  45. static pthread_once_t gTLSOnce = PTHREAD_ONCE_INIT;
  46. static pthread_key_t gTLSKey = 0;
  47. Looper::Looper(bool allowNonCallbacks) :
  48. mAllowNonCallbacks(allowNonCallbacks), mSendingMessage(false),
  49. mResponseIndex(0), mNextMessageUptime(LLONG_MAX) {
  50. int wakeFds[2];
  51. int result = pipe(wakeFds);
  52. LOG_ALWAYS_FATAL_IF(result != 0, "Could not create wake pipe. errno=%d", errno);
  53. mWakeReadPipeFd = wakeFds[0];
  54. mWakeWritePipeFd = wakeFds[1];
  55. result = fcntl(mWakeReadPipeFd, F_SETFL, O_NONBLOCK);
  56. LOG_ALWAYS_FATAL_IF(result != 0, "Could not make wake read pipe non-blocking. errno=%d",
  57. errno);
  58. result = fcntl(mWakeWritePipeFd, F_SETFL, O_NONBLOCK);
  59. LOG_ALWAYS_FATAL_IF(result != 0, "Could not make wake write pipe non-blocking. errno=%d",
  60. errno);
  61. // Allocate the epoll instance and register the wake pipe.
  62. mEpollFd = epoll_create(EPOLL_SIZE_HINT);
  63. LOG_ALWAYS_FATAL_IF(mEpollFd < 0, "Could not create epoll instance. errno=%d", errno);
  64. struct epoll_event eventItem;
  65. memset(& eventItem, 0, sizeof(epoll_event)); // zero out unused members of data field union
  66. eventItem.events = EPOLLIN;
  67. eventItem.data.fd = mWakeReadPipeFd;
  68. result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeReadPipeFd, & eventItem);
  69. LOG_ALWAYS_FATAL_IF(result != 0, "Could not add wake read pipe to epoll instance. errno=%d",
  70. errno);
  71. }
  72. Looper::~Looper() {
  73. close(mWakeReadPipeFd);
  74. close(mWakeWritePipeFd);
  75. close(mEpollFd);
  76. }
  77. void Looper::initTLSKey() {
  78. int result = pthread_key_create(& gTLSKey, threadDestructor);
  79. LOG_ALWAYS_FATAL_IF(result != 0, "Could not allocate TLS key.");
  80. }
  81. void Looper::threadDestructor(void *st) {
  82. Looper* const self = static_cast<Looper*>(st);
  83. if (self != NULL) {
  84. self->decStrong((void*)threadDestructor);
  85. }
  86. }
  87. void Looper::setForThread(const sp<Looper>& looper) {
  88. sp<Looper> old = getForThread(); // also has side-effect of initializing TLS
  89. if (looper != NULL) {
  90. looper->incStrong((void*)threadDestructor);
  91. }
  92. pthread_setspecific(gTLSKey, looper.get());
  93. if (old != NULL) {
  94. old->decStrong((void*)threadDestructor);
  95. }
  96. }
  97. sp<Looper> Looper::getForThread() {
  98. int result = pthread_once(& gTLSOnce, initTLSKey);
  99. LOG_ALWAYS_FATAL_IF(result != 0, "pthread_once failed");
  100. return (Looper*)pthread_getspecific(gTLSKey);
  101. }
  102. sp<Looper> Looper::prepare(int opts) {
  103. bool allowNonCallbacks = opts & ALOOPER_PREPARE_ALLOW_NON_CALLBACKS;
  104. sp<Looper> looper = Looper::getForThread();
  105. if (looper == NULL) {
  106. looper = new Looper(allowNonCallbacks);
  107. Looper::setForThread(looper);
  108. }
  109. if (looper->getAllowNonCallbacks() != allowNonCallbacks) {
  110. ALOGW("Looper already prepared for this thread with a different value for the "
  111. "ALOOPER_PREPARE_ALLOW_NON_CALLBACKS option.");
  112. }
  113. return looper;
  114. }
  115. bool Looper::getAllowNonCallbacks() const {
  116. return mAllowNonCallbacks;
  117. }
  118. int Looper::pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData) {
  119. int result = 0;
  120. for (;;) {
  121. while (mResponseIndex < mResponses.size()) {
  122. const Response& response = mResponses.itemAt(mResponseIndex++);
  123. int ident = response.request.ident;
  124. if (ident >= 0) {
  125. int fd = response.request.fd;
  126. int events = response.events;
  127. void* data = response.request.data;
  128. #if DEBUG_POLL_AND_WAKE
  129. ALOGD("%p ~ pollOnce - returning signalled identifier %d: "
  130. "fd=%d, events=0x%x, data=%p",
  131. this, ident, fd, events, data);
  132. #endif
  133. if (outFd != NULL) *outFd = fd;
  134. if (outEvents != NULL) *outEvents = events;
  135. if (outData != NULL) *outData = data;
  136. return ident;
  137. }
  138. }
  139. if (result != 0) {
  140. #if DEBUG_POLL_AND_WAKE
  141. ALOGD("%p ~ pollOnce - returning result %d", this, result);
  142. #endif
  143. if (outFd != NULL) *outFd = 0;
  144. if (outEvents != NULL) *outEvents = 0;
  145. if (outData != NULL) *outData = NULL;
  146. return result;
  147. }
  148. result = pollInner(timeoutMillis);
  149. }
  150. }
  151. int Looper::pollInner(int timeoutMillis) {
  152. #if DEBUG_POLL_AND_WAKE
  153. ALOGD("%p ~ pollOnce - waiting: timeoutMillis=%d", this, timeoutMillis);
  154. #endif
  155. // Adjust the timeout based on when the next message is due.
  156. if (timeoutMillis != 0 && mNextMessageUptime != LLONG_MAX) {
  157. nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
  158. int messageTimeoutMillis = toMillisecondTimeoutDelay(now, mNextMessageUptime);
  159. if (messageTimeoutMillis >= 0
  160. && (timeoutMillis < 0 || messageTimeoutMillis < timeoutMillis)) {
  161. timeoutMillis = messageTimeoutMillis;
  162. }
  163. #if DEBUG_POLL_AND_WAKE
  164. ALOGD("%p ~ pollOnce - next message in %lldns, adjusted timeout: timeoutMillis=%d",
  165. this, mNextMessageUptime - now, timeoutMillis);
  166. #endif
  167. }
  168. // Poll.
  169. int result = ALOOPER_POLL_WAKE;
  170. mResponses.clear();
  171. mResponseIndex = 0;
  172. struct epoll_event eventItems[EPOLL_MAX_EVENTS];
  173. int eventCount = epoll_wait(mEpollFd, eventItems, EPOLL_MAX_EVENTS, timeoutMillis);
  174. // Acquire lock.
  175. mLock.lock();
  176. // Check for poll error.
  177. if (eventCount < 0) {
  178. if (errno == EINTR) {
  179. goto Done;
  180. }
  181. ALOGW("Poll failed with an unexpected error, errno=%d", errno);
  182. result = ALOOPER_POLL_ERROR;
  183. goto Done;
  184. }
  185. // Check for poll timeout.
  186. if (eventCount == 0) {
  187. #if DEBUG_POLL_AND_WAKE
  188. ALOGD("%p ~ pollOnce - timeout", this);
  189. #endif
  190. result = ALOOPER_POLL_TIMEOUT;
  191. goto Done;
  192. }
  193. // Handle all events.
  194. #if DEBUG_POLL_AND_WAKE
  195. ALOGD("%p ~ pollOnce - handling events from %d fds", this, eventCount);
  196. #endif
  197. for (int i = 0; i < eventCount; i++) {
  198. int fd = eventItems[i].data.fd;
  199. uint32_t epollEvents = eventItems[i].events;
  200. if (fd == mWakeReadPipeFd) {
  201. if (epollEvents & EPOLLIN) {
  202. awoken();
  203. } else {
  204. ALOGW("Ignoring unexpected epoll events 0x%x on wake read pipe.", epollEvents);
  205. }
  206. } else {
  207. ssize_t requestIndex = mRequests.indexOfKey(fd);
  208. if (requestIndex >= 0) {
  209. int events = 0;
  210. if (epollEvents & EPOLLIN) events |= ALOOPER_EVENT_INPUT;
  211. if (epollEvents & EPOLLOUT) events |= ALOOPER_EVENT_OUTPUT;
  212. if (epollEvents & EPOLLERR) events |= ALOOPER_EVENT_ERROR;
  213. if (epollEvents & EPOLLHUP) events |= ALOOPER_EVENT_HANGUP;
  214. pushResponse(events, mRequests.valueAt(requestIndex));
  215. } else {
  216. ALOGW("Ignoring unexpected epoll events 0x%x on fd %d that is "
  217. "no longer registered.", epollEvents, fd);
  218. }
  219. }
  220. }
  221. Done: ;
  222. // Invoke pending message callbacks.
  223. mNextMessageUptime = LLONG_MAX;
  224. while (mMessageEnvelopes.size() != 0) {
  225. nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
  226. const MessageEnvelope& messageEnvelope = mMessageEnvelopes.itemAt(0);
  227. if (messageEnvelope.uptime <= now) {
  228. // Remove the envelope from the list.
  229. // We keep a strong reference to the handler until the call to handleMessage
  230. // finishes. Then we drop it so that the handler can be deleted *before*
  231. // we reacquire our lock.
  232. { // obtain handler
  233. sp<MessageHandler> handler = messageEnvelope.handler;
  234. Message message = messageEnvelope.message;
  235. mMessageEnvelopes.removeAt(0);
  236. mSendingMessage = true;
  237. mLock.unlock();
  238. #if DEBUG_POLL_AND_WAKE || DEBUG_CALLBACKS
  239. ALOGD("%p ~ pollOnce - sending message: handler=%p, what=%d",
  240. this, handler.get(), message.what);
  241. #endif
  242. handler->handleMessage(message);
  243. } // release handler
  244. mLock.lock();
  245. mSendingMessage = false;
  246. result = ALOOPER_POLL_CALLBACK;
  247. } else {
  248. // The last message left at the head of the queue determines the next wakeup time.
  249. mNextMessageUptime = messageEnvelope.uptime;
  250. break;
  251. }
  252. }
  253. // Release lock.
  254. mLock.unlock();
  255. // Invoke all response callbacks.
  256. for (size_t i = 0; i < mResponses.size(); i++) {
  257. Response& response = mResponses.editItemAt(i);
  258. if (response.request.ident == ALOOPER_POLL_CALLBACK) {
  259. int fd = response.request.fd;
  260. int events = response.events;
  261. void* data = response.request.data;
  262. #if DEBUG_POLL_AND_WAKE || DEBUG_CALLBACKS
  263. ALOGD("%p ~ pollOnce - invoking fd event callback %p: fd=%d, events=0x%x, data=%p",
  264. this, response.request.callback.get(), fd, events, data);
  265. #endif
  266. int callbackResult = response.request.callback->handleEvent(fd, events, data);
  267. if (callbackResult == 0) {
  268. removeFd(fd);
  269. }
  270. // Clear the callback reference in the response structure promptly because we
  271. // will not clear the response vector itself until the next poll.
  272. response.request.callback.clear();
  273. result = ALOOPER_POLL_CALLBACK;
  274. }
  275. }
  276. return result;
  277. }
  278. int Looper::pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData) {
  279. if (timeoutMillis <= 0) {
  280. int result;
  281. do {
  282. result = pollOnce(timeoutMillis, outFd, outEvents, outData);
  283. } while (result == ALOOPER_POLL_CALLBACK);
  284. return result;
  285. } else {
  286. nsecs_t endTime = systemTime(SYSTEM_TIME_MONOTONIC)
  287. + milliseconds_to_nanoseconds(timeoutMillis);
  288. for (;;) {
  289. int result = pollOnce(timeoutMillis, outFd, outEvents, outData);
  290. if (result != ALOOPER_POLL_CALLBACK) {
  291. return result;
  292. }
  293. nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
  294. timeoutMillis = toMillisecondTimeoutDelay(now, endTime);
  295. if (timeoutMillis == 0) {
  296. return ALOOPER_POLL_TIMEOUT;
  297. }
  298. }
  299. }
  300. }
  301. void Looper::wake() {
  302. #if DEBUG_POLL_AND_WAKE
  303. ALOGD("%p ~ wake", this);
  304. #endif
  305. ssize_t nWrite;
  306. do {
  307. nWrite = write(mWakeWritePipeFd, "W", 1);
  308. } while (nWrite == -1 && errno == EINTR);
  309. if (nWrite != 1) {
  310. if (errno != EAGAIN) {
  311. ALOGW("Could not write wake signal, errno=%d", errno);
  312. }
  313. }
  314. }
  315. void Looper::awoken() {
  316. #if DEBUG_POLL_AND_WAKE
  317. ALOGD("%p ~ awoken", this);
  318. #endif
  319. char buffer[16];
  320. ssize_t nRead;
  321. do {
  322. nRead = read(mWakeReadPipeFd, buffer, sizeof(buffer));
  323. } while ((nRead == -1 && errno == EINTR) || nRead == sizeof(buffer));
  324. }
  325. void Looper::pushResponse(int events, const Request& request) {
  326. Response response;
  327. response.events = events;
  328. response.request = request;
  329. mResponses.push(response);
  330. }
  331. int Looper::addFd(int fd, int ident, int events, ALooper_callbackFunc callback, void* data) {
  332. return addFd(fd, ident, events, callback ? new SimpleLooperCallback(callback) : NULL, data);
  333. }
  334. int Looper::addFd(int fd, int ident, int events, const sp<LooperCallback>& callback, void* data) {
  335. #if DEBUG_CALLBACKS
  336. ALOGD("%p ~ addFd - fd=%d, ident=%d, events=0x%x, callback=%p, data=%p", this, fd, ident,
  337. events, callback.get(), data);
  338. #endif
  339. if (!callback.get()) {
  340. if (! mAllowNonCallbacks) {
  341. ALOGE("Invalid attempt to set NULL callback but not allowed for this looper.");
  342. return -1;
  343. }
  344. if (ident < 0) {
  345. ALOGE("Invalid attempt to set NULL callback with ident < 0.");
  346. return -1;
  347. }
  348. } else {
  349. ident = ALOOPER_POLL_CALLBACK;
  350. }
  351. int epollEvents = 0;
  352. if (events & ALOOPER_EVENT_INPUT) epollEvents |= EPOLLIN;
  353. if (events & ALOOPER_EVENT_OUTPUT) epollEvents |= EPOLLOUT;
  354. { // acquire lock
  355. AutoMutex _l(mLock);
  356. Request request;
  357. request.fd = fd;
  358. request.ident = ident;
  359. request.callback = callback;
  360. request.data = data;
  361. struct epoll_event eventItem;
  362. memset(& eventItem, 0, sizeof(epoll_event)); // zero out unused members of data field union
  363. eventItem.events = epollEvents;
  364. eventItem.data.fd = fd;
  365. ssize_t requestIndex = mRequests.indexOfKey(fd);
  366. if (requestIndex < 0) {
  367. int epollResult = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, & eventItem);
  368. if (epollResult < 0) {
  369. ALOGE("Error adding epoll events for fd %d, errno=%d", fd, errno);
  370. return -1;
  371. }
  372. mRequests.add(fd, request);
  373. } else {
  374. int epollResult = epoll_ctl(mEpollFd, EPOLL_CTL_MOD, fd, & eventItem);
  375. if (epollResult < 0) {
  376. ALOGE("Error modifying epoll events for fd %d, errno=%d", fd, errno);
  377. return -1;
  378. }
  379. mRequests.replaceValueAt(requestIndex, request);
  380. }
  381. } // release lock
  382. return 1;
  383. }
  384. int Looper::removeFd(int fd) {
  385. #if DEBUG_CALLBACKS
  386. ALOGD("%p ~ removeFd - fd=%d", this, fd);
  387. #endif
  388. { // acquire lock
  389. AutoMutex _l(mLock);
  390. ssize_t requestIndex = mRequests.indexOfKey(fd);
  391. if (requestIndex < 0) {
  392. return 0;
  393. }
  394. int epollResult = epoll_ctl(mEpollFd, EPOLL_CTL_DEL, fd, NULL);
  395. if (epollResult < 0) {
  396. ALOGE("Error removing epoll events for fd %d, errno=%d", fd, errno);
  397. return -1;
  398. }
  399. mRequests.removeItemsAt(requestIndex);
  400. } // release lock
  401. return 1;
  402. }
  403. void Looper::sendMessage(const sp<MessageHandler>& handler, const Message& message) {
  404. nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
  405. sendMessageAtTime(now, handler, message);
  406. }
  407. void Looper::sendMessageDelayed(nsecs_t uptimeDelay, const sp<MessageHandler>& handler,
  408. const Message& message) {
  409. nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
  410. sendMessageAtTime(now + uptimeDelay, handler, message);
  411. }
  412. void Looper::sendMessageAtTime(nsecs_t uptime, const sp<MessageHandler>& handler,
  413. const Message& message) {
  414. #if DEBUG_CALLBACKS
  415. ALOGD("%p ~ sendMessageAtTime - uptime=%lld, handler=%p, what=%d",
  416. this, uptime, handler.get(), message.what);
  417. #endif
  418. size_t i = 0;
  419. { // acquire lock
  420. AutoMutex _l(mLock);
  421. size_t messageCount = mMessageEnvelopes.size();
  422. while (i < messageCount && uptime >= mMessageEnvelopes.itemAt(i).uptime) {
  423. i += 1;
  424. }
  425. MessageEnvelope messageEnvelope(uptime, handler, message);
  426. mMessageEnvelopes.insertAt(messageEnvelope, i, 1);
  427. // Optimization: If the Looper is currently sending a message, then we can skip
  428. // the call to wake() because the next thing the Looper will do after processing
  429. // messages is to decide when the next wakeup time should be. In fact, it does
  430. // not even matter whether this code is running on the Looper thread.
  431. if (mSendingMessage) {
  432. return;
  433. }
  434. } // release lock
  435. // Wake the poll loop only when we enqueue a new message at the head.
  436. if (i == 0) {
  437. wake();
  438. }
  439. }
  440. void Looper::removeMessages(const sp<MessageHandler>& handler) {
  441. #if DEBUG_CALLBACKS
  442. ALOGD("%p ~ removeMessages - handler=%p", this, handler.get());
  443. #endif
  444. { // acquire lock
  445. AutoMutex _l(mLock);
  446. for (size_t i = mMessageEnvelopes.size(); i != 0; ) {
  447. const MessageEnvelope& messageEnvelope = mMessageEnvelopes.itemAt(--i);
  448. if (messageEnvelope.handler == handler) {
  449. mMessageEnvelopes.removeAt(i);
  450. }
  451. }
  452. } // release lock
  453. }
  454. void Looper::removeMessages(const sp<MessageHandler>& handler, int what) {
  455. #if DEBUG_CALLBACKS
  456. ALOGD("%p ~ removeMessages - handler=%p, what=%d", this, handler.get(), what);
  457. #endif
  458. { // acquire lock
  459. AutoMutex _l(mLock);
  460. for (size_t i = mMessageEnvelopes.size(); i != 0; ) {
  461. const MessageEnvelope& messageEnvelope = mMessageEnvelopes.itemAt(--i);
  462. if (messageEnvelope.handler == handler
  463. && messageEnvelope.message.what == what) {
  464. mMessageEnvelopes.removeAt(i);
  465. }
  466. }
  467. } // release lock
  468. }
  469. } // namespace android