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)
{
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;
}
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);
}
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);
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);
.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,
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);
.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,