Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Köplinger <alex.koeplinger@outlook.com>2016-05-27 20:36:57 +0300
committerAlexander Köplinger <alex.koeplinger@outlook.com>2016-05-27 20:38:47 +0300
commit7c5c60f517cef679f6b420ac0ffdc73da71d6505 (patch)
tree6cbb69f33a4d684e8beab0ec33aa628b4aa7cdbb
parentcfe7d24980ab06667a104479d9fe3bbb32b9757d (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.c8
-rw-r--r--mono/metadata/threadpool-ms-io-kqueue.c8
-rw-r--r--mono/metadata/threadpool-ms-io-poll.c7
-rw-r--r--mono/metadata/threadpool-ms-io.c19
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