From 72bc55ded76c567adee241094ba3147c72706f79 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 17 Nov 2010 01:50:46 +0100 Subject: Revert "linux: Use VT_WAITEVENT if available to avoid spawn too many threads" This reverts commit 2782cc8d4950effbc4407455e72bd4750cef6e11. VT_WAITEVENT is racy unfortunately, since events that happen between the time we woke up from a VT_WAITEVENT and we go into the next VT_WAITEVENT are lost completely. --- NEWS | 1 - src/ck-sysdeps-unix.c | 44 -------------------------------------------- src/ck-sysdeps.h | 2 -- src/ck-vt-monitor.c | 48 ++++++++---------------------------------------- 4 files changed, 8 insertions(+), 87 deletions(-) diff --git a/NEWS b/NEWS index 807e9c4..101cb1c 100644 --- a/NEWS +++ b/NEWS @@ -8,7 +8,6 @@ Version 0.4.2 * Don't take bus name until ready (Ray Strode) * systemd hookup (Lennart Poettering) * add --since option to ck-history (William Jon McCann) - * Reduce number of threads on Linux (Kan-Ru Chen) * Other fixes (Anders Kaseor, Frederic Crozat, Matthias Clasen, Michael Biebl, William Jon McCann) ============== diff --git a/src/ck-sysdeps-unix.c b/src/ck-sysdeps-unix.c index 6a8b5f8..e4ab16b 100644 --- a/src/ck-sysdeps-unix.c +++ b/src/ck-sysdeps-unix.c @@ -296,50 +296,6 @@ ck_wait_for_active_console_num (int console_fd, return ret; } -#ifdef VT_WAITEVENT -gboolean -ck_wait_for_console_switch (int console_fd, - guint *num) -{ - gboolean ret; - int res; - struct vt_event vt; - - g_assert (console_fd != -1); - - again: - ret = FALSE; - errno = 0; - vt.event = VT_EVENT_SWITCH; - vt.oldev = *num; - res = ioctl (console_fd, VT_WAITEVENT, &vt); - - if (res == ERROR) { - const char *errmsg; - - errmsg = g_strerror (errno); - - if (errno == EINTR) { - g_debug ("Interrupted waiting for native console event: %s", - errmsg); - goto again; - } else if (errno == ENOTSUP) { - g_debug ("Console event not supported on this system"); - } else { - g_warning ("Error waiting for native console event: %s", - errmsg); - } - goto out; - } - - ret = TRUE; - *num = vt.newev; - - out: - return ret; -} -#endif - gboolean ck_activate_console_num (int console_fd, guint num) diff --git a/src/ck-sysdeps.h b/src/ck-sysdeps.h index 5dd573f..8f22d52 100644 --- a/src/ck-sysdeps.h +++ b/src/ck-sysdeps.h @@ -72,8 +72,6 @@ gboolean ck_activate_console_num (int console_fd, guint num); gboolean ck_wait_for_active_console_num (int console_fd, guint num); -gboolean ck_wait_for_console_switch (int console_fd, - guint *num); G_END_DECLS diff --git a/src/ck-vt-monitor.c b/src/ck-vt-monitor.c index d7d1f0b..cf44983 100644 --- a/src/ck-vt-monitor.c +++ b/src/ck-vt-monitor.c @@ -26,7 +26,6 @@ #include #include #include -#include #include #include @@ -40,11 +39,9 @@ #include "ck-sysdeps.h" #include "ck-marshal.h" -#ifdef HAVE_SYS_VT_H +#if defined (__sun) && defined (HAVE_SYS_VT_H) #include -#endif - -#ifdef __sun +#include #include #endif @@ -165,7 +162,7 @@ ck_vt_monitor_get_active (CkVtMonitor *vt_monitor, return TRUE; } -#if defined(HAVE_SYS_VT_H) && defined(__sun) +#if defined (__sun) && defined (HAVE_SYS_VT_H) static void handle_vt_active (void) { @@ -315,31 +312,11 @@ vt_thread_start (ThreadData *data) { CkVtMonitor *vt_monitor; gboolean res; - guint num; + gint32 num; vt_monitor = data->vt_monitor; num = data->num; -#ifdef VT_WAITEVENT - for (;;) { - res = ck_wait_for_console_switch (vt_monitor->priv->vfd, &num); - if (! res) { - break; - } else { - EventData *event; - - /* add event to queue */ - event = g_new0 (EventData, 1); - event->num = num; - g_debug ("Pushing activation event for VT %d onto queue", num); - - g_async_queue_push (vt_monitor->priv->event_queue, event); - - /* schedule processing of queue */ - schedule_process_queue (vt_monitor); - } - } -#else res = ck_wait_for_active_console_num (vt_monitor->priv->vfd, num); if (! res) { /* FIXME: what do we do if it fails? */ @@ -356,7 +333,6 @@ vt_thread_start (ThreadData *data) /* schedule processing of queue */ schedule_process_queue (vt_monitor); } -#endif G_LOCK (hash_lock); if (vt_monitor->priv->vt_thread_hash != NULL) { @@ -400,6 +376,10 @@ vt_add_watch_unlocked (CkVtMonitor *vt_monitor, static void vt_add_watches (CkVtMonitor *vt_monitor) { + guint max_consoles; + int i; + gint32 current_num; + #if defined (__sun) && !defined (HAVE_SYS_VT_H) /* Best to do nothing if VT is not supported */ #elif defined (__sun) && defined (HAVE_SYS_VT_H) @@ -417,19 +397,7 @@ vt_add_watches (CkVtMonitor *vt_monitor) sigaction (SIGPOLL, &act, NULL); ioctl (vt_monitor->priv->vfd, I_SETSIG, S_MSG); -#elif defined (VT_WAITEVENT) - gpointer id; - - G_LOCK (hash_lock); - id = GINT_TO_POINTER (1); - if (g_hash_table_lookup (vt_monitor->priv->vt_thread_hash, id) == NULL) - vt_add_watch_unlocked (vt_monitor, 1); - G_UNLOCK (hash_lock); #else - guint max_consoles; - int i; - gint32 current_num; - G_LOCK (hash_lock); current_num = vt_monitor->priv->active_num; -- cgit v1.2.3