PageRenderTime 27ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/libutils/Looper.cpp

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