diff options
author | Alexander Köplinger <alex.koeplinger@outlook.com> | 2016-05-27 20:36:57 +0300 |
---|---|---|
committer | Alexander Köplinger <alex.koeplinger@outlook.com> | 2016-05-27 20:38:47 +0300 |
commit | 7c5c60f517cef679f6b420ac0ffdc73da71d6505 (patch) | |
tree | 6cbb69f33a4d684e8beab0ec33aa628b4aa7cdbb | |
parent | cfe7d24980ab06667a104479d9fe3bbb32b9757d (diff) |
Revert "Merge pull request #2917 from ludovic-henry/4.4.0-fix-40306"
[4.4.0][threadpool-io] Fix crash on shutdownin System.Net.Sockets.Socket:Close_internal (reverted from commit c31aa7ec75fb5e9e062457c60ff09e0aedfc585e)
Got signoff from @kumpera to see if this fixes https://bugzilla.xamarin.com/show_bug.cgi?id=41264
-rw-r--r-- | mono/metadata/threadpool-ms-io-epoll.c | 8 | ||||
-rw-r--r-- | mono/metadata/threadpool-ms-io-kqueue.c | 8 | ||||
-rw-r--r-- | mono/metadata/threadpool-ms-io-poll.c | 7 | ||||
-rw-r--r-- | mono/metadata/threadpool-ms-io.c | 19 |
4 files changed, 42 insertions, 0 deletions
diff --git a/mono/metadata/threadpool-ms-io-epoll.c b/mono/metadata/threadpool-ms-io-epoll.c index 462fa98df81..bf619214c85 100644 --- a/mono/metadata/threadpool-ms-io-epoll.c +++ b/mono/metadata/threadpool-ms-io-epoll.c @@ -48,6 +48,13 @@ epoll_init (gint wakeup_pipe_fd) } static void +epoll_cleanup (void) +{ + g_free (epoll_events); + close (epoll_fd); +} + +static void epoll_register_fd (gint fd, gint events, gboolean is_new) { struct epoll_event event; @@ -120,6 +127,7 @@ epoll_event_wait (void (*callback) (gint fd, gint events, gpointer user_data), g static ThreadPoolIOBackend backend_epoll = { .init = epoll_init, + .cleanup = epoll_cleanup, .register_fd = epoll_register_fd, .remove_fd = epoll_remove_fd, .event_wait = epoll_event_wait, diff --git a/mono/metadata/threadpool-ms-io-kqueue.c b/mono/metadata/threadpool-ms-io-kqueue.c index e162c3cc9be..093d3399dc9 100644 --- a/mono/metadata/threadpool-ms-io-kqueue.c +++ b/mono/metadata/threadpool-ms-io-kqueue.c @@ -44,6 +44,13 @@ kqueue_init (gint wakeup_pipe_fd) } static void +kqueue_cleanup (void) +{ + g_free (kqueue_events); + close (kqueue_fd); +} + +static void kqueue_register_fd (gint fd, gint events, gboolean is_new) { if (events & EVENT_IN) { @@ -117,6 +124,7 @@ kqueue_event_wait (void (*callback) (gint fd, gint events, gpointer user_data), static ThreadPoolIOBackend backend_kqueue = { .init = kqueue_init, + .cleanup = kqueue_cleanup, .register_fd = kqueue_register_fd, .remove_fd = kqueue_remove_fd, .event_wait = kqueue_event_wait, diff --git a/mono/metadata/threadpool-ms-io-poll.c b/mono/metadata/threadpool-ms-io-poll.c index 4d4cceb0902..4adae56791b 100644 --- a/mono/metadata/threadpool-ms-io-poll.c +++ b/mono/metadata/threadpool-ms-io-poll.c @@ -29,6 +29,12 @@ poll_init (gint wakeup_pipe_fd) } static void +poll_cleanup (void) +{ + g_free (poll_fds); +} + +static void poll_register_fd (gint fd, gint events, gboolean is_new) { gint i; @@ -230,6 +236,7 @@ poll_event_wait (void (*callback) (gint fd, gint events, gpointer user_data), gp static ThreadPoolIOBackend backend_poll = { .init = poll_init, + .cleanup = poll_cleanup, .register_fd = poll_register_fd, .remove_fd = poll_remove_fd, .event_wait = poll_event_wait, diff --git a/mono/metadata/threadpool-ms-io.c b/mono/metadata/threadpool-ms-io.c index bf408b7e1af..3c931eb7b3d 100644 --- a/mono/metadata/threadpool-ms-io.c +++ b/mono/metadata/threadpool-ms-io.c @@ -31,6 +31,7 @@ typedef struct { gboolean (*init) (gint wakeup_pipe_fd); + void (*cleanup) (void); void (*register_fd) (gint fd, gint events, gboolean is_new); void (*remove_fd) (gint fd); gint (*event_wait) (void (*callback) (gint fd, gint events, gpointer user_data), gpointer user_data); @@ -539,6 +540,24 @@ cleanup (void) selector_thread_wakeup (); while (io_selector_running) g_usleep (1000); + + mono_coop_mutex_destroy (&threadpool_io->updates_lock); + mono_coop_cond_destroy (&threadpool_io->updates_cond); + + threadpool_io->backend.cleanup (); + +#if !defined(HOST_WIN32) + close (threadpool_io->wakeup_pipes [0]); + close (threadpool_io->wakeup_pipes [1]); +#else + closesocket (threadpool_io->wakeup_pipes [0]); + closesocket (threadpool_io->wakeup_pipes [1]); +#endif + + g_assert (threadpool_io); + g_free (threadpool_io); + threadpool_io = NULL; + g_assert (!threadpool_io); } void |