4 * Copyright (c) 2000 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
8 * Jaewon Lim <jaewon81.lim@samsung.com>
9 * Woojin Jung <woojin2.jung@samsung.com>
10 * Juyoung Kim <j0.kim@samsung.com>
11 * Cherepanov Vitaliy <v.cherepanov@samsung.com>
12 * Nikita Kalyazin <n.kalyazin@samsung.com>
14 * Licensed under the Apache License, Version 2.0 (the "License");
15 * you may not use this file except in compliance with the License.
16 * You may obtain a copy of the License at
18 * http://www.apache.org/licenses/LICENSE-2.0
20 * Unless required by applicable law or agreed to in writing, software
21 * distributed under the License is distributed on an "AS IS" BASIS,
22 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23 * See the License for the specific language governing permissions and
24 * limitations under the License.
28 * - Samsung RnD Institute Russia
31 #define __STDC_FORMAT_MACROS
33 #include <stdlib.h> // for realpath
34 #include <string.h> // for strtok, strcpy, strncpy
35 #include <limits.h> // for realpath
38 #include <errno.h> // for errno
39 #include <sys/types.h> // for accept, mkdir, opendir, readdir
40 #include <sys/socket.h> // for accept
41 #include <sys/stat.h> // for mkdir
42 #include <sys/eventfd.h> // for eventfd
43 #include <sys/epoll.h> // for epoll apis
44 #include <sys/timerfd.h> // for timerfd
45 #include <unistd.h> // for access, sleep
51 #include <attr/xattr.h> // for fsetxattr
52 #include <sys/smack.h>
55 #include <linux/input.h>
61 #include "da_protocol.h"
64 #include "process_info.h"
66 #define DA_WORK_DIR "/home/developer/sdk_tools/da/"
67 #define DA_READELF_PATH "/home/developer/sdk_tools/da/readelf"
68 #define SCREENSHOT_DIR "/tmp/da"
71 #define MAX_APP_LAUNCH_TIME 60
72 #define MAX_CONNECT_TIMEOUT_TIME 5*60
75 #define MAX_FILENAME 128
77 #define ARRAY_END (-11)
79 input_dev g_key_dev[MAX_DEVICE];
80 input_dev g_touch_dev[MAX_DEVICE];
82 // return bytes size of readed data
83 // return 0 if no data readed or error occurred
84 static int _file_read(FILE* fp, char *buffer, int size)
88 if(fp != NULL && size > 0)
90 ret = fread((void*)buffer, sizeof(char), size, fp);
98 ret = 0; // error case
104 // get input id of given input device
105 static int get_input_id(char* inputname)
107 static int query_cmd_type = 0; // 1 if /lib/udev/input_id, 2 if udevadm
109 char buffer[BUF_SIZE];
110 char command[MAX_FILENAME];
113 // determine input_id query command
114 if(unlikely(query_cmd_type == 0))
116 if(access("/lib/udev/input_id", F_OK) == 0) // there is /lib/udev/input_id
120 else // there is not /lib/udev/input_id
126 // make command string
127 if(query_cmd_type == 1)
129 sprintf(command, "/lib/udev/input_id /class/input/%s", inputname);
133 sprintf(command, "udevadm info --name=input/%s --query=property", inputname);
137 cmd_fp = popen(command, "r");
138 _file_read(cmd_fp, buffer, BUF_SIZE);
140 // determine input id
141 if(strstr(buffer, INPUT_ID_STR_KEY)) // key
145 else if(strstr(buffer, INPUT_ID_STR_TOUCH)) // touch
147 ret = INPUT_ID_TOUCH;
149 else if(strstr(buffer, INPUT_ID_STR_KEYBOARD)) // keyboard
153 else if(strstr(buffer, INPUT_ID_STR_TABLET)) // touch (emulator)
155 ret = INPUT_ID_TOUCH;
163 // get filename and fd of given input type devices
164 static void _get_fds(input_dev *dev, int input_id)
170 dp = opendir("/sys/class/input");
174 while((d = readdir(dp)) != NULL)
176 if(!strncmp(d->d_name, "event", 5)) // start with "event"
179 if(input_id == get_input_id(d->d_name))
181 sprintf(dev[count].fileName, "/dev/input/%s", d->d_name);
182 dev[count].fd = open(dev[count].fileName, O_RDWR | O_NONBLOCK);
190 dev[count].fd = ARRAY_END; // end of input_dev array
194 void _device_write(input_dev *dev, struct input_event* in_ev)
197 for(i = 0; dev[i].fd != ARRAY_END; i++)
201 write(dev[i].fd, in_ev, sizeof(struct input_event));
202 LOGI("write(%d, %d, %d)\n",
203 dev[i].fd, (int)in_ev, sizeof(struct input_event));
208 long long get_total_alloc_size()
211 long long allocsize = 0;
213 for(i = 0; i < MAX_TARGET_COUNT; i++)
215 if(manager.target[i].socket != -1 && manager.target[i].allocmem > 0)
216 allocsize += manager.target[i].allocmem;
221 static int getEmptyTargetSlot()
224 for(i = 0; i < MAX_TARGET_COUNT; i++)
226 if(manager.target[i].socket == -1)
233 static void setEmptyTargetSlot(int index)
235 if(index >= 0 && index < MAX_TARGET_COUNT)
237 manager.target[index].pid = -1;
238 manager.target[index].recv_thread = -1;
239 manager.target[index].allocmem = 0;
240 manager.target[index].starttime = 0;
241 manager.target[index].initial_log = 0;
242 if(manager.target[index].event_fd != -1)
243 close(manager.target[index].event_fd);
244 manager.target[index].event_fd = -1;
245 if(manager.target[index].socket != -1)
246 close(manager.target[index].socket);
247 manager.target[index].socket = -1;
251 // =============================================================================
252 // start and terminate control functions
253 // =============================================================================
255 //start application launch timer function
256 static int start_app_launch_timer()
259 struct epoll_event ev;
261 manager.app_launch_timerfd = timerfd_create(CLOCK_REALTIME, TFD_CLOEXEC);
262 if(manager.app_launch_timerfd > 0)
264 struct itimerspec ctime;
265 ctime.it_value.tv_sec = MAX_APP_LAUNCH_TIME;
266 ctime.it_value.tv_nsec = 0;
267 ctime.it_interval.tv_sec = 0;
268 ctime.it_interval.tv_nsec = 0;
269 if (timerfd_settime(manager.app_launch_timerfd, 0, &ctime, NULL) < 0)
271 LOGE("fail to set app launch timer\n");
272 close(manager.app_launch_timerfd);
273 manager.app_launch_timerfd = -1;
278 // add event fd to epoll list
280 ev.data.fd = manager.app_launch_timerfd;
281 if (epoll_ctl(manager.efd, EPOLL_CTL_ADD,
282 manager.app_launch_timerfd, &ev) < 0)
284 // fail to add event fd
285 LOGE("fail to add app launch timer fd to epoll list\n");
286 close(manager.app_launch_timerfd);
287 manager.app_launch_timerfd = -1;
290 LOGI("application launch time started\n");
294 LOGE("cannot create launch timer\n");
301 //stop application launch timer
302 static int stop_app_launch_timer()
304 epoll_ctl(manager.efd, EPOLL_CTL_DEL,manager.app_launch_timerfd, NULL);
305 close(manager.app_launch_timerfd);
306 manager.app_launch_timerfd = -1;
310 static int exec_app(const struct app_info_t *app_info)
313 static struct epoll_event ev;
316 switch (app_info->app_type) {
318 kill_app(app_info->exe_path);
319 if (exec_app_tizen(app_info->app_id, app_info->exe_path)) {
320 LOGE("Cannot exec tizen app %s\n", app_info->app_id);
324 case APP_TYPE_RUNNING:
325 // TODO: nothing, it's running
326 LOGI("already started\n");
327 write_process_info(atoi(app_info->app_id), 0);
329 case APP_TYPE_COMMON:
330 kill_app(app_info->exe_path);
331 if (exec_app_common(app_info->exe_path)) {
332 LOGE("Cannot exec common app %s\n", app_info->exe_path);
337 LOGE("Unknown app type %d\n", app_info->app_type);
342 if (res == 0 && app_info->app_type != APP_TYPE_RUNNING)
343 if (start_app_launch_timer()<0)
346 LOGI("ret=%d\n", res);
350 int launch_timer_start()
352 static struct epoll_event ev;
355 manager.connect_timeout_timerfd = timerfd_create(CLOCK_REALTIME, TFD_CLOEXEC);
356 if(manager.connect_timeout_timerfd > 0)
358 struct itimerspec ctime;
359 ctime.it_value.tv_sec = MAX_CONNECT_TIMEOUT_TIME;
360 ctime.it_value.tv_nsec = 0;
361 ctime.it_interval.tv_sec = 0;
362 ctime.it_interval.tv_nsec = 0;
363 if (timerfd_settime(manager.connect_timeout_timerfd, 0, &ctime, NULL) < 0)
365 LOGE("fail to set connect timeout timer\n");
366 close(manager.connect_timeout_timerfd);
367 manager.connect_timeout_timerfd = -1;
371 // add event fd to epoll list
373 ev.data.fd = manager.connect_timeout_timerfd;
374 if (epoll_ctl(manager.efd, EPOLL_CTL_ADD,
375 manager.connect_timeout_timerfd, &ev) < 0)
377 // fail to add event fd
378 LOGE("fail to add app connection timeout timer fd to epoll list\n");
379 close(manager.connect_timeout_timerfd);
380 manager.connect_timeout_timerfd = -1;
382 LOGI("connection timeout timer started\n");
386 LOGE("cannot create connection timeout timer\n");
389 LOGI("ret=%d\n", res);
393 static void epoll_add_input_events();
394 static void epoll_del_input_events();
396 int start_profiling()
398 const struct app_info_t *app_info = &prof_session.app_info;
401 // remove previous screen capture files
402 remove_indir(SCREENSHOT_DIR);
403 mkdir(SCREENSHOT_DIR, 0777);
405 smack_lsetlabel(SCREENSHOT_DIR, "*", SMACK_LABEL_ACCESS);
408 if (IS_OPT_SET(FL_CPU | FL_MEMORY)) {
409 if (samplingStart() < 0) {
410 LOGE("Cannot start sampling\n");
416 if (IS_OPT_SET(FL_RECORDING))
417 epoll_add_input_events();
419 if (exec_app(app_info)) {
420 LOGE("Cannot exec app\n");
428 if (IS_OPT_SET(FL_RECORDING))
429 epoll_del_input_events();
430 if (IS_OPT_SET(FL_CPU | FL_MEMORY))
434 LOGI("return %d\n", res);
438 void stop_profiling(void)
440 if (IS_OPT_SET(FL_RECORDING))
441 epoll_del_input_events();
442 if (IS_OPT_SET(FL_CPU | FL_MEMORY))
446 static void reconfigure_recording(struct conf_t conf)
448 uint64_t old_features = prof_session.conf.use_features0;
449 uint64_t new_features = conf.use_features0;
450 uint64_t to_enable = (new_features ^ old_features) & new_features;
451 uint64_t to_disable = (new_features ^ old_features) & old_features;
453 if (IS_OPT_SET_IN(FL_RECORDING, to_disable)) {
454 epoll_del_input_events();
455 prof_session.conf.use_features0 &= ~FL_RECORDING;
458 if (IS_OPT_SET_IN(FL_RECORDING, to_enable)) {
459 epoll_add_input_events();
460 prof_session.conf.use_features0 |= FL_RECORDING;
465 static int reconfigure_cpu_and_memory(struct conf_t conf)
467 uint64_t old_features = prof_session.conf.use_features0;
468 uint64_t new_features = conf.use_features0;
469 uint64_t to_enable = (new_features ^ old_features) & new_features;
470 uint64_t to_disable = (new_features ^ old_features) & old_features;
472 prof_session.conf.system_trace_period = conf.system_trace_period;
474 if (IS_OPT_SET(FL_CPU | FL_MEMORY))
477 if (IS_OPT_SET_IN(FL_CPU | FL_MEMORY, to_disable)) {
478 prof_session.conf.use_features0 &= ~(FL_CPU | FL_MEMORY);
482 if (IS_OPT_SET_IN(FL_CPU | FL_MEMORY, to_enable)) {
483 if (samplingStart() < 0) {
484 LOGE("Cannot start sampling\n");
487 prof_session.conf.use_features0 |= (FL_CPU | FL_MEMORY);
493 int reconfigure(struct conf_t conf)
495 reconfigure_recording(conf);
496 if (reconfigure_cpu_and_memory(conf)) {
497 LOGE("Cannot reconf cpu and memory\n");
504 // just send stop message to all target process
505 static void terminate_all_target()
509 msg_target_t sendlog;
511 sendlog.type = MSG_STOP;
514 for (i = 0; i < MAX_TARGET_COUNT; i++)
516 if(manager.target[i].socket != -1)
518 sendlen = send(manager.target[i].socket, &sendlog,
519 sizeof(sendlog.type) + sizeof(sendlog.length),
523 LOGI("TERMINATE send exit msg (socket %d) "
524 "by terminate_all_target()\n", manager.target[i].socket);
530 // terminate all target and wait for threads
534 terminate_all_target();
536 // wait for all other thread exit
537 for(i = 0; i < MAX_TARGET_COUNT; i++)
539 if(manager.target[i].recv_thread != -1)
541 pthread_join(manager.target[i].recv_thread, NULL);
546 // terminate all profiling by critical error
547 // TODO: don't send data to host
548 static void terminate_error(char* errstr, int send_to_host)
550 LOGE("termination all with err '%s'\n", errstr);
551 struct msg_data_t *msg = NULL;
552 if (send_to_host != 0){
553 msg = gen_message_error(errstr);
558 LOGI("cannot generate error message\n");
564 #define MAX_EVENTS_NUM 10
565 static int deviceEventHandler(input_dev* dev, int input_type)
570 struct input_event in_ev[MAX_EVENTS_NUM];
571 struct msg_data_t *log;
573 if(input_type == INPUT_ID_TOUCH || input_type == INPUT_ID_KEY)
576 size = read(dev->fd, &in_ev[count], sizeof(*in_ev) );
579 } while (count < MAX_EVENTS_NUM && size > 0);
582 LOGI("read %d %s events\n",
584 input_type == INPUT_ID_KEY ? STR_KEY : STR_TOUCH);
585 log = gen_message_event(in_ev, count, input_type);
586 printBuf((char *)log, MSG_DATA_HDR_LEN + log->len);
593 LOGW("unknown input_type\n");
594 ret = 1; // it is not error
599 // return 0 if normal case
600 // return plus value if non critical error occur
601 // return minus value if critical error occur
602 // return -11 if all target process closed
603 static int targetEventHandler(int epollfd, int index, uint64_t msg)
607 if (index == 0) { // main application
609 if ( is_same_app_process(prof_session.app_info.exe_path,
610 manager.target[index].pid) == 0 ) {
611 LOGE("is same error: '%s' is not %d\n",
612 prof_session.app_info.exe_path,
613 manager.target[index].pid);
617 if (start_replay() != 0) {
618 LOGE("Cannot start replay thread\n");
622 manager.target[index].initial_log = 1;
625 if(msg & EVENT_STOP || msg & EVENT_ERROR)
627 LOGI("target close, socket(%d), pid(%d) : (remaining %d target)\n",
628 manager.target[index].socket,
629 manager.target[index].pid,
630 manager.target_count - 1);
631 if (index == 0) { // main application
634 epoll_ctl(epollfd, EPOLL_CTL_DEL, manager.target[index].event_fd, NULL);
635 setEmptyTargetSlot(index);
636 // all target client are closed
637 if (0 == __sync_sub_and_fetch(&manager.target_count, 1))
644 // return 0 if normal case
645 // return plus value if non critical error occur
646 // return minus value if critical error occur
647 static int targetServerHandler(int efd)
650 struct epoll_event ev;
652 int index = getEmptyTargetSlot();
653 if(index == MAX_TARGET_COUNT)
655 LOGW("Max target number(8) reached, no more target can connected\n");
659 manager.target[index].socket =
660 accept(manager.target_server_socket, NULL, NULL);
662 if(manager.target[index].socket >= 0) // accept succeed
665 // set smack attribute for certification
666 fsetxattr(manager.target[index].socket, "security.SMACK64IPIN", "*", 1, 0);
667 fsetxattr(manager.target[index].socket, "security.SMACK64IPOUT", "*", 1, 0);
668 #endif /* LOCALTEST */
670 // send config message to target process
671 log.type = MSG_OPTION;
672 log.length = sprintf(log.data, "%lu",
673 (unsigned long int) prof_session.conf.use_features0);
674 send(manager.target[index].socket, &log,
675 sizeof(log.type) + sizeof(log.length) + log.length,
679 manager.target[index].event_fd = eventfd(0, EFD_NONBLOCK);
680 if(manager.target[index].event_fd == -1)
682 // fail to make event fd
683 LOGE("fail to make event fd for socket (%d)\n",
684 manager.target[index].socket);
685 goto TARGET_CONNECT_FAIL;
688 // add event fd to epoll list
690 ev.data.fd = manager.target[index].event_fd;
691 if(epoll_ctl(efd, EPOLL_CTL_ADD, manager.target[index].event_fd, &ev) < 0)
693 // fail to add event fd
694 LOGE("fail to add event fd to epoll list for socket (%d)\n",
695 manager.target[index].socket);
696 goto TARGET_CONNECT_FAIL;
699 // make recv thread for target
700 if(makeRecvThread(index) != 0)
702 // fail to make recv thread
703 LOGE("fail to make recv thread for socket (%d)\n",
704 manager.target[index].socket);
705 epoll_ctl(efd, EPOLL_CTL_DEL, manager.target[index].event_fd, NULL);
706 goto TARGET_CONNECT_FAIL;
709 if(manager.app_launch_timerfd >= 0)
711 LOGI("release launch timer\n");
712 if (stop_app_launch_timer()<0)
713 LOGE("cannot stop app launch timer\n");
716 LOGI("target connected = %d(running %d target)\n",
717 manager.target[index].socket, manager.target_count + 1);
719 manager.target_count++;
724 LOGE("Failed to accept at target server socket\n");
728 if(manager.target_count == 0) // if this connection is main connection
734 // if this connection is not main connection then ignore process by error
735 setEmptyTargetSlot(index);
740 // return 0 if normal case
741 // return plus value if non critical error occur
742 // return minus value if critical error occur
743 static int hostServerHandler(int efd)
745 static int hostserverorder = 0;
747 struct epoll_event ev;
749 if(hostserverorder > 1) // control and data socket connected already
752 csocket = accept(manager.host_server_socket, NULL, NULL);
754 if(csocket >= 0) // accept succeed
757 ev.data.fd = csocket;
758 if(epoll_ctl(efd, EPOLL_CTL_ADD, csocket, &ev) < 0)
760 // consider as accept fail
761 LOGE("Failed to add socket fd to epoll list\n");
766 if(hostserverorder == 0)
768 manager.host.control_socket = csocket;
770 LOGI("host control socket connected = %d\n", csocket);
774 manager.host.data_socket = csocket;
775 LOGI("host data socket connected = %d\n", csocket);
783 LOGE("Failed to accept from host server socket\n");
789 // return 0 if normal case
790 // return plus value if non critical error occur
791 // return minus value if critical error occur
792 // return -11 if socket closed
794 static int controlSocketHandler(int efd)
797 struct msg_t msg_head;
801 if(manager.connect_timeout_timerfd >= 0)
803 LOGI("release connect timeout timer\n");
804 epoll_ctl(efd, EPOLL_CTL_DEL, manager.connect_timeout_timerfd, NULL);
805 close(manager.connect_timeout_timerfd);
806 manager.connect_timeout_timerfd = -1;
810 recv_len = recv(manager.host.control_socket,
813 // error or close request from host
814 if (recv_len == -1 || recv_len == 0)
817 msg = malloc(MSG_CMD_HDR_LEN + msg_head.len);
819 LOGE("Cannot alloc msg\n");
820 sendACKToHost(msg_head.id, ERR_WRONG_MESSAGE_FORMAT, 0, 0);
823 msg->id = msg_head.id;
824 msg->len = msg_head.len;
826 // Receive payload (if exists)
827 recv_len = recv(manager.host.control_socket,
829 msg->len, MSG_WAITALL);
833 res = host_message_handler(msg);
840 static void epoll_add_input_events()
842 struct epoll_event ev;
845 // add device fds to epoll event pool
847 for (i = 0; g_key_dev[i].fd != ARRAY_END; i++) {
848 if (g_key_dev[i].fd >= 0) {
849 ev.data.fd = g_key_dev[i].fd;
850 if (epoll_ctl(manager.efd,
852 g_key_dev[i].fd, &ev) < 0)
853 LOGE("keyboard device file epoll_ctl error\n");
858 for (i = 0; g_touch_dev[i].fd != ARRAY_END; i++) {
859 if (g_touch_dev[i].fd >= 0) {
860 ev.data.fd = g_touch_dev[i].fd;
861 if (epoll_ctl(manager.efd,
863 g_touch_dev[i].fd, &ev) < 0)
864 LOGE("touch device file epoll_ctl error\n");
869 static void epoll_del_input_events()
873 // remove device fds from epoll event pool
874 for (i = 0; g_key_dev[i].fd != ARRAY_END; i++)
875 if (g_key_dev[i].fd >= 0)
876 if (epoll_ctl(manager.efd,
878 g_key_dev[i].fd, NULL) < 0)
879 LOGE("keyboard device file epoll_ctl error\n");
881 for (i = 0; g_touch_dev[i].fd != ARRAY_END; i++)
882 if (g_touch_dev[i].fd >= 0)
883 if (epoll_ctl(manager.efd,
885 g_touch_dev[i].fd, NULL) < 0)
886 LOGE("touch device file epoll_ctl error\n");
888 static bool initialize_epoll_events(void)
890 struct epoll_event ev;
892 if ((manager.efd = epoll_create1(0)) < 0) {
893 LOGE("epoll creation error\n");
897 // add server sockets to epoll event pool
899 ev.data.fd = manager.host_server_socket;
900 if (epoll_ctl(manager.efd, EPOLL_CTL_ADD,
901 manager.host_server_socket, &ev) < 0)
903 LOGE("Host server socket epoll_ctl error\n");
907 ev.data.fd = manager.target_server_socket;
908 if (epoll_ctl(manager.efd, EPOLL_CTL_ADD,
909 manager.target_server_socket, &ev) < 0)
911 LOGE("Target server socket epoll_ctl error\n");
917 // return 0 for normal case
920 int return_value = 0;
921 struct epoll_event *events = malloc(EPOLL_SIZE * sizeof(*events));
923 _get_fds(g_key_dev, INPUT_ID_KEY);
924 _get_fds(g_touch_dev, INPUT_ID_TOUCH);
927 LOGE("Out of memory when allocate epoll event pool\n");
931 if (!initialize_epoll_events()) {
936 if (launch_timer_start() < 0) {
937 LOGE("Launch timer start failed\n");
945 // number of occured events
946 int numevent = epoll_wait(manager.efd, events, EPOLL_SIZE, -1);
948 LOGE("Failed to epoll_wait : num of event(%d), errno(%d)\n", numevent, errno);
952 for(i = 0; i < numevent; i++)
954 // check for request from event fd
955 for(k = 0; k < MAX_TARGET_COUNT; k++)
957 if(manager.target[k].socket != -1 &&
958 events[i].data.fd == manager.target[k].event_fd)
961 recvLen = read(manager.target[k].event_fd, &u, sizeof(uint64_t));
962 if(recvLen != sizeof(uint64_t))
964 // maybe closed, but ignoring is more safe then
965 // removing fd from epoll list
969 if(-11 == targetEventHandler(manager.efd, k, u))
971 LOGI("all target process is closed\n");
979 if(k != MAX_TARGET_COUNT)
982 // check for request from device fd
983 for(k = 0; g_touch_dev[k].fd != ARRAY_END; k++)
985 if(g_touch_dev[k].fd >= 0 &&
986 events[i].data.fd == g_touch_dev[k].fd)
988 if(deviceEventHandler(&g_touch_dev[k], INPUT_ID_TOUCH) < 0)
990 LOGE("Internal DA framework error, "
991 "Please re-run the profiling (touch dev)\n");
998 if(g_touch_dev[k].fd != ARRAY_END)
1001 for(k = 0; g_key_dev[k].fd != ARRAY_END; k++)
1003 if(g_key_dev[k].fd >= 0 &&
1004 events[i].data.fd == g_key_dev[k].fd)
1006 if(deviceEventHandler(&g_key_dev[k], INPUT_ID_KEY) < 0)
1008 LOGE("Internal DA framework error, "
1009 "Please re-run the profiling (key dev)\n");
1016 if(g_key_dev[k].fd != ARRAY_END)
1019 // connect request from target
1020 if (events[i].data.fd == manager.target_server_socket)
1022 if (targetServerHandler(manager.efd) < 0) // critical error
1024 terminate_error("Internal DA framework error, "
1025 "Please re-run the profiling (targetServerHandler)\n", 1);
1029 // connect request from host
1030 else if (events[i].data.fd == manager.host_server_socket)
1032 int result = hostServerHandler(manager.efd);
1035 LOGE("Internal DA framework error (hostServerHandler)\n");
1039 // control message from host
1040 else if (events[i].data.fd == manager.host.control_socket)
1042 int result = controlSocketHandler(manager.efd);
1043 if (result == -11) // socket close
1045 //if the host disconnected.
1046 //In all other cases daemon must report an error and continue the loop
1047 //close connect_timeoutt and host socket and quit
1048 LOGI("Connection closed. Termination. (%d)\n",
1049 manager.host.control_socket);
1053 else if (result < 0)
1055 terminate_error("Internal DA framework error, "
1056 "Please re-run the profiling.", 1);
1061 else if (events[i].data.fd == manager.host.data_socket)
1064 recvLen = recv(manager.host.data_socket, recvBuf, 32, MSG_DONTWAIT);
1066 { // close data socket
1067 epoll_ctl(manager.efd, EPOLL_CTL_DEL,
1068 manager.host.data_socket,
1070 close(manager.host.data_socket);
1071 manager.host.data_socket = -1;
1072 // TODO: finish transfer thread
1075 LOGI("host message from data socket %d\n", recvLen);
1077 // check for application launch timerfd
1078 else if (events[i].data.fd == manager.app_launch_timerfd)
1080 // send to host timeout error message for launching application
1081 LOGE("Failed to launch application\n");
1082 if (stop_app_launch_timer()<0)
1083 LOGE("cannot stop app launch timer\n");
1086 // check for connection timeout timerfd
1087 else if (events[i].data.fd == manager.connect_timeout_timerfd)
1089 // send to host timeout error message for launching application
1090 terminate_error("no incoming connections", 1);
1091 epoll_ctl(manager.efd, EPOLL_CTL_DEL,
1092 manager.connect_timeout_timerfd, NULL);
1093 close(manager.connect_timeout_timerfd);
1094 manager.connect_timeout_timerfd = -1;
1095 LOGE("No connection in %d sec. shutdown.\n",MAX_CONNECT_TIMEOUT_TIME);
1102 LOGW("Unknown socket fd (%d)\n", events[i].data.fd);
1108 LOGI("close efd\n");
1112 return return_value;