- // handler loop
- while (1) {
- int i, k;
- ssize_t recvLen;
- // number of occured events
- int numevent = epoll_wait(manager.efd, events, EPOLL_SIZE, -1);
- if (numevent <= 0) {
- LOGE("Failed to epoll_wait : num of event(%d), errno(%d)\n", numevent, errno);
- continue;
- }
-
- for (i = 0; i < numevent; i++) {
- // check for request from event fd
- for (k = 0; k < MAX_TARGET_COUNT; k++) {
- if (manager.target[k].socket != -1 &&
- events[i].data.fd == manager.target[k].event_fd) {
- uint64_t u;
- recvLen = read(manager.target[k].event_fd, &u, sizeof(uint64_t));
- if (recvLen != sizeof(uint64_t)) {
- // maybe closed, but ignoring is more safe then
- // removing fd from epoll list
- } else {
- if (-11 == target_event_handler(manager.efd, k, u)) {
- LOGI("all target process is closed\n");
- continue;
- }
- }
- break;
- }
- }
-
- if (k != MAX_TARGET_COUNT)
- continue;
-
- // check for request from device fd
- for (k = 0; g_touch_dev[k].fd != ARRAY_END; k++) {
- if (g_touch_dev[k].fd >= 0 &&
- events[i].data.fd == g_touch_dev[k].fd) {
- if (deviceEventHandler(&g_touch_dev[k],
- INPUT_ID_TOUCH) < 0) {
- LOGE("Internal DA framework error, "
- "Please re-run the profiling (touch dev)\n");
- continue;
- }
- break;
- }
- }
-
- if (g_touch_dev[k].fd != ARRAY_END)
- continue;
-
- for (k = 0; g_key_dev[k].fd != ARRAY_END; k++) {
- if (g_key_dev[k].fd >= 0 &&
- events[i].data.fd == g_key_dev[k].fd) {
- if (deviceEventHandler(&g_key_dev[k], INPUT_ID_KEY) < 0) {
- LOGE("Internal DA framework error, "
- "Please re-run the profiling (key dev)\n");
- continue;
- }
- break;
- }
- }
-
- if (g_key_dev[k].fd != ARRAY_END)
- continue;
-
- // connect request from target
- if (events[i].data.fd == manager.target_server_socket) {
- if (targetServerHandler(manager.efd) < 0) {
- // critical error
- terminate_error("Internal DA framework error, "
- "Please re-run the profiling "
- "(targetServerHandler)\n", 1);
- continue;
- }
- } else if (events[i].data.fd == manager.host_server_socket) {
- // connect request from host
- int result = hostServerHandler(manager.efd);
- if (result < 0) {
- LOGE("Internal DA framework error (hostServerHandler)\n");
- continue;
- }
- } else if (events[i].data.fd == manager.host.control_socket) {
- // control message from host
- int result = controlSocketHandler(manager.efd);
- if (result == -11) {
- // socket close
- //if the host disconnected.
- //In all other cases daemon must report an error and continue the loop
- //close connect_timeoutt and host socket and quit
- LOGI("Connection closed. Termination. (%d)\n",
- manager.host.control_socket);
- return_value = 0;
- goto END_EFD;
- } else if (result < 0) {
- LOGE("Control socket handler.\n");
- }
- } else if (events[i].data.fd == manager.host.data_socket) {
- char recvBuf[32];
- recvLen = recv(manager.host.data_socket, recvBuf, 32, MSG_DONTWAIT);
- if (recvLen == 0) {
- // close data socket
- if (0 > epoll_ctl(manager.efd,
- EPOLL_CTL_DEL,
- manager.host.data_socket,
- NULL))
- LOGW("fail to EPOLL DEL of host data socket\n");
- close(manager.host.data_socket);
- manager.host.data_socket = -1;
- // TODO: finish transfer thread
- }
-
- LOGI("host message from data socket %d\n",
- recvLen);
- } else if (events[i].data.fd == manager.app_launch_timerfd) {
- // check for application launch timerfd
- // send to host timeout error message for launching application
- LOGE("Failed to launch application\n");
- if (stop_app_launch_timer() < 0)
- LOGE("cannot stop app launch timer\n");
- continue;
- } else if (events[i].data.fd == manager.connect_timeout_timerfd) {
- // check for connection timeout timerfd
- // send to host timeout error message for launching application
- terminate_error("no incoming connections", 1);
- if (0 > epoll_ctl(manager.efd, EPOLL_CTL_DEL,
- manager.connect_timeout_timerfd,
- NULL))
- LOGW("fail to EPOLL DEL of timeout timer fd\n");
- close(manager.connect_timeout_timerfd);
- manager.connect_timeout_timerfd = -1;
- LOGE("No connection in %d sec. shutdown.\n",
- MAX_CONNECT_TIMEOUT_TIME);
- goto END_EFD;
- } else {
- // unknown socket
- // never happened
- LOGW("Unknown socket fd (%d)\n",
- events[i].data.fd);
- }
- }
- }