fix Windows disconnect bug 51/11451/1
authorho.namkoong <ho.namkoong@samsung.com>
Mon, 28 Oct 2013 08:07:20 +0000 (17:07 +0900)
committerho.namkoong <ho.namkoong@samsung.com>
Mon, 28 Oct 2013 08:38:20 +0000 (17:38 +0900)
Change-Id: I98ef7ecfbbf6d2314628fffd5d6fc93bc289ade6
Signed-off-by: ho.namkoong <ho.namkoong@samsung.com>
src/transport.c
src/transport_local.c
src/utils.c
src/utils.h [changed mode: 0644->0755]
src/utils_backend.h
src/utils_unix.c
src/utils_windows.c

index cece18fbe476eca0917482d539b394049115a08c..0bfe1041ce2bf7a0ee49188bb7a0bcc4a032e564 100755 (executable)
@@ -439,6 +439,11 @@ static void remove_transport(TRANSPORT *t)
 
     remove_node(&transport_list, t->node, no_free);
 
+    //In Windows, handle is not removed from sdb_handle_map, yet.
+#ifdef OS_WINDOWS
+    sdb_close(t->sfd);
+#endif
+
     run_transport_close(t);
 
     if (t->serial)
index 823768130e605f2a44ef35f8951d9bb9974eef57..a58542a6c178f3e4558adb3b4d55e75cc20ebbb5 100755 (executable)
@@ -189,9 +189,12 @@ static void remote_kick(TRANSPORT *t)
 {
     int fd = t->sfd;
 
+//In Unix, another socket fd can be created while transport thread still uses it
+#ifndef OS_WINDOWS
     t->sfd = -1;
+#endif
     sdb_shutdown(fd);
-    sdb_close(fd);
+    sdb_transport_close(fd);
 
     --current_local_transports;
 }
index 67593149678d91f169ce8c76c3b9d9aac3bf2bad..baa22451547b37cd032da7be6d20b82599a156ff 100755 (executable)
@@ -221,6 +221,11 @@ int sdb_shutdown(int fd) {
     return utils_backend->sdb_shutdown(fd);
 }
 
+//In Windows, just close the socket and not free the SDB_HANDLE because it may be used in transport_thread
+int sdb_transport_close(int fd) {
+    return utils_backend->sdb_transport_close(fd);
+}
+
 int sdb_close(int fd) {
     return utils_backend->sdb_close(fd);
 }
old mode 100644 (file)
new mode 100755 (executable)
index 8ff8e06..1ee4957
@@ -116,6 +116,7 @@ int sdb_creat(const char* path, int mode);
 int sdb_read(int fd, void* buf, size_t len);
 int sdb_write(int fd, const void* buf, size_t len);
 int sdb_shutdown(int fd);
+int sdb_transport_close(int fd);
 int sdb_close(int fd);
 int unix_unlink(const char* path);
 int sdb_mkdir(const char* path, int mode);
index 4adea5e761c327f2011e156f814f05138d3f1a94..f50b298e42eb58bc45a21bd59092a8ffcb6d85b2 100755 (executable)
@@ -64,6 +64,7 @@ struct utils_os_backend {
     int (*sdb_read)(int fd, void* buf, size_t len);
     int (*sdb_write)(int fd, const void* buf, size_t len);
     int (*sdb_shutdown)(int fd);
+    int (*sdb_transport_close)(int fd);
     int (*sdb_close)(int fd);
     int (*sdb_mkdir)(const char* path, int mode);
     void (*close_on_exec)(int fd);
index bd055bf56d0b2b52e16d1b963c1e9ef599d3de85..90df67953c37e7992dcc17ddbc4f6a6db979d345 100755 (executable)
@@ -367,6 +367,7 @@ const struct utils_os_backend utils_unix_backend = {
     .sdb_read = _sdb_read,
     .sdb_write = _sdb_write,
     .sdb_shutdown = _sdb_shutdown,
+    .sdb_transport_close = _sdb_close,
     .sdb_close = _sdb_close,
     .close_on_exec = _close_on_exec,
     .sdb_mkdir = _sdb_mkdir,
index 1b7a082132c07dd59c028cf5b593e3f272f1ce00..f19c4b71603d6821afc0b481f3d4bb5bff3d0522 100755 (executable)
@@ -493,6 +493,22 @@ static int _sdb_shutdown(int fd) {
     return 0;
 }
 
+static int _sdb_transport_close(int fd) {
+
+       SDB_HANDLE* _h = sdb_handle_map_get(fd);
+
+    if (_h == NULL) {
+       LOG_ERROR("FD(%d) not exists\n", fd);
+        return -1;
+    }
+
+    D( "sdb_close: FD(%d)\n", fd);
+    shutdown(_h->u.socket, SD_BOTH);
+    closesocket(_h->u.socket);
+    _h->u.socket = INVALID_SOCKET;
+    return 0;
+}
+
 static int _sdb_close(int fd) {
 
        SDB_HANDLE* _h = sdb_handle_map_get(fd);
@@ -986,6 +1002,7 @@ const struct utils_os_backend utils_windows_backend = {
     .sdb_read = _sdb_read,
     .sdb_write = _sdb_write,
     .sdb_shutdown = _sdb_shutdown,
+    .sdb_transport_close = _sdb_transport_close,
     .sdb_close = _sdb_close,
     .close_on_exec = _close_on_exec,
     .sdb_mkdir = _sdb_mkdir,