[FIX] multistart fix (mostly transfer thread)
authorNikita Kalyazin <n.kalyazin@samsung.com>
Mon, 1 Jul 2013 16:03:36 +0000 (20:03 +0400)
committerNikita Kalyazin <n.kalyazin@samsung.com>
Mon, 1 Jul 2013 16:03:38 +0000 (20:03 +0400)
 - removed redundant terminate_all notifications (though one of them
   still somehow comes to our daemonLoop() as "unknown socket";
 - added blocking reading from buffer at first;
 - do not exit daemonLoop() after stop command coming.

daemon/da_protocol.c
daemon/daemon.c
daemon/transfer_thread.c

index 0ce22c1..b292376 100644 (file)
@@ -1005,6 +1005,11 @@ int host_message_handler(struct msg_t *msg)
                        return 1;
                }
 
+               if (start_transfer() != 0) {
+                       LOGE("Cannot start transfer\n");
+                       return -1;
+               }
+
                // TODO: launch translator thread
 
                // TODO: kill app
index 0443d21..8cf262b 100644 (file)
@@ -422,8 +422,8 @@ static void terminate_all_target()
 void terminate_all()
 {
        int i;
-       terminate_all_target();
        samplingStop();
+       terminate_all_target();
 
        // wait for all other thread exit
        for(i = 0; i < MAX_TARGET_COUNT; i++)
@@ -788,7 +788,6 @@ static int targetEventHandler(int epollfd, int index, uint64_t msg)
                LOGI("target close, socket(%d), pid(%d) : (remaining %d target)\n",
                                manager.target[index].socket, manager.target[index].pid, manager.target_count - 1);
 
-               terminate_target(index);
                epoll_ctl(epollfd, EPOLL_CTL_DEL, manager.target[index].event_fd, NULL);
                setEmptyTargetSlot(index);
                if (0 == __sync_sub_and_fetch(&manager.target_count, 1)) // all target client are closed
@@ -922,10 +921,6 @@ static int hostServerHandler(int efd)
                {
                        manager.host.data_socket = csocket;
                        LOGI("host data socket connected = %d\n", csocket);
-                       if (start_transfer() != 0) {
-                               LOGE("Cannot start transfer\n");
-                               return -1;
-                       }
                }
 
                hostserverorder++;
@@ -1114,9 +1109,7 @@ int daemonLoop()
                                                if(-11 == targetEventHandler(efd, k, u))
                                                {
                                                        LOGI("all target process is closed\n");
-                                                       terminate_all();
-                                                       ret = 0;
-                                                       goto END_EFD;
+                                                       continue;
                                                }
                                        }
                                        break;
@@ -1192,7 +1185,6 @@ int daemonLoop()
                                {
                                        // close target and host socket and quit
                                        LOGI("host close = %d\n", manager.host.control_socket);
-                                       terminate_all();
                                        ret = 0;
                                        goto END_EFD;
                                }
index a34f6b6..d7fc905 100644 (file)
@@ -48,8 +48,15 @@ static void *transfer_thread(void *arg)
 
 int start_transfer()
 {
-       if (manager.transfer_thread != -1) // already started
+       int saved_flags;
+
+       if (manager.transfer_thread != -1) { // already started
+               LOGI("KAIN: transfer already running\n");
                return 1;
+       }
+
+       saved_flags = fcntl(manager.buf_fd, F_GETFL);
+       fcntl(manager.buf_fd, F_SETFL, saved_flags & ~O_NONBLOCK);
 
        if(pthread_create(&(manager.transfer_thread),
                          NULL,