Replace the BUSY-WAITING CODE with the SELECT.
authorSung-jae Park <nicesj.park@samsung.com>
Thu, 26 Jul 2012 13:31:37 +0000 (22:31 +0900)
committerSung-jae Park <nicesj.park@samsung.com>
Thu, 26 Jul 2012 14:23:36 +0000 (23:23 +0900)
Change-Id: I1403ecd17b371905c3b9cd9489fcd5ba072ef9c3

debian/changelog
packaging/libcom-core.spec
src/com-core.c
src/com-core_packet.c

index a6879bb..ec46664 100644 (file)
@@ -1,3 +1,10 @@
+com-core (0.1.1) unstable; urgency=low
+
+  * Git: slp/pkgs/c/com-core
+  * Tag: com-core_0.1.1
+
+ -- Sung-jae Park <nicesj.park@samsung.com>  Thu, 26 Jul 2012 23:23:18 +0900
+
 com-core (0.1.0) unstable; urgency=low
 
   * Git: slp/pkgs/c/com-core
index 61e5c2e..7f89265 100644 (file)
@@ -1,6 +1,6 @@
 Name: libcom-core
 Summary: Library for the light-weight IPC 
-Version: 0.1.0
+Version: 0.1.1
 Release: 1
 Group: main/util
 License: Samsung Proprietary License
index 0ce0c71..a4fae74 100644 (file)
@@ -87,7 +87,7 @@ static gboolean client_cb(GIOChannel *src, GIOCondition cond, gpointer data)
        }
 
        if (ioctl(client_fd, FIONREAD, &readsize) < 0 || readsize == 0) {
-               DbgPrint("Client is disconencted (readsize: %d)\n", readsize);
+               DbgPrint("Client is disconencted (fd: %d, readsize: %d)\n", client_fd, readsize);
                invoke_disconn_cb_list(client_fd);
                secure_socket_remove_connection_handle(client_fd);
                return FALSE;
@@ -104,7 +104,7 @@ static gboolean client_cb(GIOChannel *src, GIOCondition cond, gpointer data)
        return TRUE;
 }
 
-static gboolean accept_cb(GIOChannel *src, GIOCondition cond, gpointer data)
+static gboolean accept_cb(GIOChannel *src, GIOCondition cond, gpointer cbdata)
 {
        int socket_fd;
        int client_fd;
@@ -116,7 +116,7 @@ static gboolean accept_cb(GIOChannel *src, GIOCondition cond, gpointer data)
                ErrPrint("Accept socket closed\n");
                if (close(socket_fd) < 0)
                        ErrPrint("Close error[%d]: %s\n", socket_fd, strerror(errno));
-               free(data);
+               free(cbdata);
                return FALSE;
        }
 
@@ -124,15 +124,17 @@ static gboolean accept_cb(GIOChannel *src, GIOCondition cond, gpointer data)
                DbgPrint("Client connection is lost\n");
                if (close(socket_fd) < 0)
                        ErrPrint("Close error[%d]: %s\n", socket_fd, strerror(errno));
-               free(data);
+               free(cbdata);
                return FALSE;
        }
 
+       DbgPrint("New connectino arrived: socket(%d)\n", socket_fd);
        client_fd = secure_socket_get_connection_handle(socket_fd);
        if (client_fd < 0) {
-               free(data);
+               free(cbdata);
                return FALSE;
        }
+       DbgPrint("New client: %d\n", client_fd);
 
        if (fcntl(client_fd, F_SETFD, FD_CLOEXEC) < 0)
                ErrPrint("Error: %s\n", strerror(errno));
@@ -144,14 +146,14 @@ static gboolean accept_cb(GIOChannel *src, GIOCondition cond, gpointer data)
        if (!gio) {
                ErrPrint("Failed to get gio\n");
                secure_socket_remove_connection_handle(client_fd);
-               free(data);
+               free(cbdata);
                return FALSE;
        }
 
        g_io_channel_set_close_on_unref(gio, FALSE);
 
-       id = g_io_add_watch(gio, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, client_cb, data);
-       if (id < 0) {
+       id = g_io_add_watch(gio, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, (GIOFunc)client_cb, cbdata);
+       if (id <= 0) {
                GError *err = NULL;
                ErrPrint("Failed to add IO watch\n");
                g_io_channel_shutdown(gio, TRUE, &err);
@@ -161,7 +163,7 @@ static gboolean accept_cb(GIOChannel *src, GIOCondition cond, gpointer data)
                }
                g_io_channel_unref(gio);
                secure_socket_remove_connection_handle(client_fd);
-               free(data);
+               free(cbdata);
                return FALSE;
        }
 
@@ -197,11 +199,10 @@ EAPI int com_core_server_create(const char *addr, int is_sync, int (*service_cb)
        if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0)
                ErrPrint("fcntl: %s\n", strerror(errno));
 
-       if (!is_sync) {
-               if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0)
-                       ErrPrint("fcntl: %s\n", strerror(errno));
-       }
+       if (!is_sync && fcntl(fd, F_SETFL, O_NONBLOCK) < 0)
+               ErrPrint("fcntl: %s\n", strerror(errno));
 
+       DbgPrint("Create new IO channel for socket FD: %d\n", fd);
        gio = g_io_channel_unix_new(fd);
        if (!gio) {
                ErrPrint("Failed to create new io channel\n");
@@ -214,7 +215,7 @@ EAPI int com_core_server_create(const char *addr, int is_sync, int (*service_cb)
        g_io_channel_set_close_on_unref(gio, FALSE);
 
        id = g_io_add_watch(gio, G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL, (GIOFunc)accept_cb, cbdata);
-       if (id < 0) {
+       if (id <= 0) {
                GError *err = NULL;
                ErrPrint("Failed to add IO watch\n");
                free(cbdata);
@@ -258,10 +259,8 @@ EAPI int com_core_client_create(const char *addr, int is_sync, int (*service_cb)
        if (fcntl(client_fd, F_SETFD, FD_CLOEXEC) < 0)
                ErrPrint("Error: %s\n", strerror(errno));
 
-       if (!is_sync) {
-               if (fcntl(client_fd, F_SETFL, O_NONBLOCK) < 0)
-                       ErrPrint("Error: %s\n", strerror(errno));
-       }
+       if (!is_sync && fcntl(client_fd, F_SETFL, O_NONBLOCK) < 0)
+               ErrPrint("Error: %s\n", strerror(errno));
 
        gio = g_io_channel_unix_new(client_fd);
        if (!gio) {
@@ -275,7 +274,7 @@ EAPI int com_core_client_create(const char *addr, int is_sync, int (*service_cb)
        g_io_channel_set_close_on_unref(gio, FALSE);
 
        id = g_io_add_watch(gio, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, (GIOFunc)client_cb, cbdata);
-       if (id < 0) {
+       if (id <= 0) {
                GError *err = NULL;
                ErrPrint("Failed to add IO watch\n");
                free(cbdata);
index dc96339..69d5b1e 100644 (file)
@@ -5,6 +5,8 @@
 #include <stdlib.h>
 #include <fcntl.h>
 #include <sys/time.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
 
 #include <glib.h>
 #include <dlog.h>
@@ -407,39 +409,63 @@ EAPI struct packet *com_core_packet_oneshot_send(const char *addr, struct packet
        int offset;
        struct packet *result = NULL;
        void *ptr;
-       struct timeval stv;
-       struct timeval etv;
-       struct timeval rtv;
+       struct timeval timeout;
+       fd_set set;
 
        fd = secure_socket_create_client(addr);
        if (fd < 0)
                return NULL;
 
+       DbgPrint("FD: %d\n", fd);
+
        if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0)
                ErrPrint("fcntl: %s\n", strerror(errno));
 
        if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0)
                ErrPrint("Error: %s\n", strerror(errno));
 
-       gettimeofday(&stv, NULL);
-       sz = 0;
-       do {
-               ret = secure_socket_send(fd, (char *)packet_data(packet) + sz, packet_size(packet) - sz);
-               if (ret < 0) {
-                       secure_socket_destroy(fd);
-                       return NULL;
-               }
+       ret = secure_socket_send(fd, (char *)packet_data(packet), packet_size(packet));
+       if (ret < 0) {
+               secure_socket_destroy(fd);
+               return NULL;
+       }
+       DbgPrint("Sent: %d bytes (%d bytes)\n", ret, packet_size(packet));
 
-               sz += ret;
+       FD_ZERO(&set);
+       FD_SET(fd, &set);
 
-               gettimeofday(&etv, NULL);
-               timersub(&etv, &stv, &rtv);
-               if (rtv.tv_sec > DEFAULT_TIMEOUT) {
-                       ErrPrint("Timeout\n");
-                       secure_socket_destroy(fd);
-                       return NULL;
-               }
-       } while (sz < packet_size(packet));
+       timeout.tv_sec = DEFAULT_TIMEOUT;
+       timeout.tv_usec = 0;
+
+       ret = select(fd + 1, &set, NULL, NULL, &timeout);
+       if (ret < 0) {
+               ErrPrint("Error: %s\n", strerror(errno));
+               secure_socket_destroy(fd);
+               return NULL;
+       } else if (ret != 1) {
+               ErrPrint("Timeout (%d)\n", ret);
+               secure_socket_destroy(fd);
+               return NULL;
+       }
+
+       if (!FD_ISSET(fd, &set)) {
+               ErrPrint("Invalid handle\n");
+               secure_socket_destroy(fd);
+               return NULL;
+       }
+
+       if (ioctl(fd, FIONREAD, &sz) < 0 || sz == 0) {
+               ErrPrint("Connection closed\n");
+               secure_socket_destroy(fd);
+               return NULL;
+       }
+
+       DbgPrint("Readable size: %d\n", sz);
+       if (sz < packet_header_size()) {
+               ErrPrint("Invalid packet [SIZE: %d]\n", sz);
+               secure_socket_destroy(fd);
+               return NULL;
+       }
 
        offset = 0;
        ptr = malloc(packet_header_size());
@@ -449,59 +475,46 @@ EAPI struct packet *com_core_packet_oneshot_send(const char *addr, struct packet
                return NULL;
        }
 
-       gettimeofday(&stv, NULL);
-       sz = 0;
-       do {
-               ret = secure_socket_recv(fd, (char *)ptr + sz, packet_header_size() - sz, &pid);
-               if (ret < 0) {
-                       free(ptr);
-                       secure_socket_destroy(fd);
-                       return NULL;
-               }
-               sz += ret;
-               gettimeofday(&etv, NULL);
-               timersub(&etv, &stv, &rtv);
-               if (rtv.tv_sec > DEFAULT_TIMEOUT) {
-                       ErrPrint("Timeout\n");
-                       free(ptr);
-                       secure_socket_destroy(fd);
-                       return NULL;
-               }
-       } while (sz < packet_header_size());
+       ret = secure_socket_recv(fd, (char *)ptr, packet_header_size(), &pid);
+       if (ret < 0) {
+               free(ptr);
+               secure_socket_destroy(fd);
+               return NULL;
+       }
+       DbgPrint("Recv'd size: %d (header: %d)\n", ret, packet_header_size());
        result = packet_build(result, offset, ptr, ret);
        offset += ret;
        free(ptr);
 
+       DbgPrint("Payload size: %d\n", packet_payload_size(result));
+       if (sz < packet_payload_size(result) + packet_header_size()) {
+               ErrPrint("Invalid packet [%d <> %d]\n", sz, packet_payload_size(result) + packet_header_size());
+               secure_socket_destroy(fd);
+               packet_destroy(result);
+               return NULL;
+       }
+
        ptr = malloc(packet_payload_size(result));
        if (!ptr) {
                ErrPrint("Heap: %s\n", strerror(errno));
                secure_socket_destroy(fd);
+               packet_destroy(result);
                return NULL;
        }
 
-       gettimeofday(&stv, NULL);
-       sz = 0;
-       do {
-               ret = secure_socket_recv(fd, (char *)ptr + sz, packet_payload_size(result) - sz, &pid);
-               if (ret < 0) {
-                       free(ptr);
-                       secure_socket_destroy(fd);
-                       return NULL;
-               }
-               sz += ret;
-               gettimeofday(&etv, NULL);
-               timersub(&etv, &stv, &rtv);
-               if (rtv.tv_sec > DEFAULT_TIMEOUT) {
-                       ErrPrint("Timeout\n");
-                       free(ptr);
-                       secure_socket_destroy(fd);
-                       return NULL;
-               }
-       } while (sz < packet_payload_size(result));
+       ret = secure_socket_recv(fd, (char *)ptr, packet_payload_size(result), &pid);
+       if (ret < 0) {
+               free(ptr);
+               secure_socket_destroy(fd);
+               packet_destroy(result);
+               return NULL;
+       }
        result = packet_build(result, offset, ptr, ret);
        offset += ret;
        free(ptr);
+
        secure_socket_destroy(fd);
+       DbgPrint("Close connection: %d\n", fd);
        return result;
 }