mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-03-10 01:41:42 +01:00
Fixed threading issues brought up by #74577. Make g_log_find_domain,
2002-03-14 Sebastian Wilhelmi <wilhelmi@ira.uka.de> * glib/gmessages.c: Fixed threading issues brought up by #74577. Make g_log_find_domain, g_log_domain_new, g_log_domain_check_free and g_log_domain_get_handler require being called with g_messages_lock held and remove all internal locking in them. Then added proper locking to g_log_set_handler, g_log_remove_handler and g_logv. Problem spotted by Miroslaw Dobrzanski-Neumann <mne@mosaic-ag.com>. (#74577)
This commit is contained in:
parent
f318cdcacb
commit
148a846602
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
|||||||
|
2002-03-14 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||||
|
|
||||||
|
* glib/gmessages.c: Fixed threading issues brought up by
|
||||||
|
#74577. Make g_log_find_domain, g_log_domain_new,
|
||||||
|
g_log_domain_check_free and g_log_domain_get_handler require being
|
||||||
|
called with g_messages_lock held and remove all internal locking
|
||||||
|
in them. Then added proper locking to g_log_set_handler,
|
||||||
|
g_log_remove_handler and g_logv. Problem spotted by Miroslaw
|
||||||
|
Dobrzanski-Neumann <mne@mosaic-ag.com>. (#74577)
|
||||||
|
|
||||||
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
||||||
* glib/gconvert.c
|
* glib/gconvert.c
|
||||||
glib/gen-unicode-tables.pl
|
glib/gen-unicode-tables.pl
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
2002-03-14 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||||
|
|
||||||
|
* glib/gmessages.c: Fixed threading issues brought up by
|
||||||
|
#74577. Make g_log_find_domain, g_log_domain_new,
|
||||||
|
g_log_domain_check_free and g_log_domain_get_handler require being
|
||||||
|
called with g_messages_lock held and remove all internal locking
|
||||||
|
in them. Then added proper locking to g_log_set_handler,
|
||||||
|
g_log_remove_handler and g_logv. Problem spotted by Miroslaw
|
||||||
|
Dobrzanski-Neumann <mne@mosaic-ag.com>. (#74577)
|
||||||
|
|
||||||
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
||||||
* glib/gconvert.c
|
* glib/gconvert.c
|
||||||
glib/gen-unicode-tables.pl
|
glib/gen-unicode-tables.pl
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
2002-03-14 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||||
|
|
||||||
|
* glib/gmessages.c: Fixed threading issues brought up by
|
||||||
|
#74577. Make g_log_find_domain, g_log_domain_new,
|
||||||
|
g_log_domain_check_free and g_log_domain_get_handler require being
|
||||||
|
called with g_messages_lock held and remove all internal locking
|
||||||
|
in them. Then added proper locking to g_log_set_handler,
|
||||||
|
g_log_remove_handler and g_logv. Problem spotted by Miroslaw
|
||||||
|
Dobrzanski-Neumann <mne@mosaic-ag.com>. (#74577)
|
||||||
|
|
||||||
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
||||||
* glib/gconvert.c
|
* glib/gconvert.c
|
||||||
glib/gen-unicode-tables.pl
|
glib/gen-unicode-tables.pl
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
2002-03-14 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||||
|
|
||||||
|
* glib/gmessages.c: Fixed threading issues brought up by
|
||||||
|
#74577. Make g_log_find_domain, g_log_domain_new,
|
||||||
|
g_log_domain_check_free and g_log_domain_get_handler require being
|
||||||
|
called with g_messages_lock held and remove all internal locking
|
||||||
|
in them. Then added proper locking to g_log_set_handler,
|
||||||
|
g_log_remove_handler and g_logv. Problem spotted by Miroslaw
|
||||||
|
Dobrzanski-Neumann <mne@mosaic-ag.com>. (#74577)
|
||||||
|
|
||||||
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
||||||
* glib/gconvert.c
|
* glib/gconvert.c
|
||||||
glib/gen-unicode-tables.pl
|
glib/gen-unicode-tables.pl
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
2002-03-14 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||||
|
|
||||||
|
* glib/gmessages.c: Fixed threading issues brought up by
|
||||||
|
#74577. Make g_log_find_domain, g_log_domain_new,
|
||||||
|
g_log_domain_check_free and g_log_domain_get_handler require being
|
||||||
|
called with g_messages_lock held and remove all internal locking
|
||||||
|
in them. Then added proper locking to g_log_set_handler,
|
||||||
|
g_log_remove_handler and g_logv. Problem spotted by Miroslaw
|
||||||
|
Dobrzanski-Neumann <mne@mosaic-ag.com>. (#74577)
|
||||||
|
|
||||||
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
||||||
* glib/gconvert.c
|
* glib/gconvert.c
|
||||||
glib/gen-unicode-tables.pl
|
glib/gen-unicode-tables.pl
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
2002-03-14 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||||
|
|
||||||
|
* glib/gmessages.c: Fixed threading issues brought up by
|
||||||
|
#74577. Make g_log_find_domain, g_log_domain_new,
|
||||||
|
g_log_domain_check_free and g_log_domain_get_handler require being
|
||||||
|
called with g_messages_lock held and remove all internal locking
|
||||||
|
in them. Then added proper locking to g_log_set_handler,
|
||||||
|
g_log_remove_handler and g_logv. Problem spotted by Miroslaw
|
||||||
|
Dobrzanski-Neumann <mne@mosaic-ag.com>. (#74577)
|
||||||
|
|
||||||
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
||||||
* glib/gconvert.c
|
* glib/gconvert.c
|
||||||
glib/gen-unicode-tables.pl
|
glib/gen-unicode-tables.pl
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
2002-03-14 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||||
|
|
||||||
|
* glib/gmessages.c: Fixed threading issues brought up by
|
||||||
|
#74577. Make g_log_find_domain, g_log_domain_new,
|
||||||
|
g_log_domain_check_free and g_log_domain_get_handler require being
|
||||||
|
called with g_messages_lock held and remove all internal locking
|
||||||
|
in them. Then added proper locking to g_log_set_handler,
|
||||||
|
g_log_remove_handler and g_logv. Problem spotted by Miroslaw
|
||||||
|
Dobrzanski-Neumann <mne@mosaic-ag.com>. (#74577)
|
||||||
|
|
||||||
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
||||||
* glib/gconvert.c
|
* glib/gconvert.c
|
||||||
glib/gen-unicode-tables.pl
|
glib/gen-unicode-tables.pl
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
2002-03-14 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||||
|
|
||||||
|
* glib/gmessages.c: Fixed threading issues brought up by
|
||||||
|
#74577. Make g_log_find_domain, g_log_domain_new,
|
||||||
|
g_log_domain_check_free and g_log_domain_get_handler require being
|
||||||
|
called with g_messages_lock held and remove all internal locking
|
||||||
|
in them. Then added proper locking to g_log_set_handler,
|
||||||
|
g_log_remove_handler and g_logv. Problem spotted by Miroslaw
|
||||||
|
Dobrzanski-Neumann <mne@mosaic-ag.com>. (#74577)
|
||||||
|
|
||||||
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
2002-03-13 Erwann Chenede <erwann.chenede@sun.com>
|
||||||
* glib/gconvert.c
|
* glib/gconvert.c
|
||||||
glib/gen-unicode-tables.pl
|
glib/gen-unicode-tables.pl
|
||||||
|
@ -261,26 +261,23 @@ g_log_write_prefix (GFileDescriptor fd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* HOLDS g_messages_lock */
|
||||||
static inline GLogDomain*
|
static inline GLogDomain*
|
||||||
g_log_find_domain (const gchar *log_domain)
|
g_log_find_domain (const gchar *log_domain)
|
||||||
{
|
{
|
||||||
register GLogDomain *domain;
|
register GLogDomain *domain;
|
||||||
|
|
||||||
g_mutex_lock (g_messages_lock);
|
|
||||||
domain = g_log_domains;
|
domain = g_log_domains;
|
||||||
while (domain)
|
while (domain)
|
||||||
{
|
{
|
||||||
if (strcmp (domain->log_domain, log_domain) == 0)
|
if (strcmp (domain->log_domain, log_domain) == 0)
|
||||||
{
|
return domain;
|
||||||
g_mutex_unlock (g_messages_lock);
|
|
||||||
return domain;
|
|
||||||
}
|
|
||||||
domain = domain->next;
|
domain = domain->next;
|
||||||
}
|
}
|
||||||
g_mutex_unlock (g_messages_lock);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* HOLDS g_messages_lock */
|
||||||
static inline GLogDomain*
|
static inline GLogDomain*
|
||||||
g_log_domain_new (const gchar *log_domain)
|
g_log_domain_new (const gchar *log_domain)
|
||||||
{
|
{
|
||||||
@ -291,14 +288,13 @@ g_log_domain_new (const gchar *log_domain)
|
|||||||
domain->fatal_mask = G_LOG_FATAL_MASK;
|
domain->fatal_mask = G_LOG_FATAL_MASK;
|
||||||
domain->handlers = NULL;
|
domain->handlers = NULL;
|
||||||
|
|
||||||
g_mutex_lock (g_messages_lock);
|
|
||||||
domain->next = g_log_domains;
|
domain->next = g_log_domains;
|
||||||
g_log_domains = domain;
|
g_log_domains = domain;
|
||||||
g_mutex_unlock (g_messages_lock);
|
|
||||||
|
|
||||||
return domain;
|
return domain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* HOLDS g_messages_lock */
|
||||||
static inline void
|
static inline void
|
||||||
g_log_domain_check_free (GLogDomain *domain)
|
g_log_domain_check_free (GLogDomain *domain)
|
||||||
{
|
{
|
||||||
@ -309,7 +305,6 @@ g_log_domain_check_free (GLogDomain *domain)
|
|||||||
|
|
||||||
last = NULL;
|
last = NULL;
|
||||||
|
|
||||||
g_mutex_lock (g_messages_lock);
|
|
||||||
work = g_log_domains;
|
work = g_log_domains;
|
||||||
while (work)
|
while (work)
|
||||||
{
|
{
|
||||||
@ -326,10 +321,10 @@ g_log_domain_check_free (GLogDomain *domain)
|
|||||||
last = work;
|
last = work;
|
||||||
work = last->next;
|
work = last->next;
|
||||||
}
|
}
|
||||||
g_mutex_unlock (g_messages_lock);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* HOLDS g_messages_lock */
|
||||||
static inline GLogFunc
|
static inline GLogFunc
|
||||||
g_log_domain_get_handler (GLogDomain *domain,
|
g_log_domain_get_handler (GLogDomain *domain,
|
||||||
GLogLevelFlags log_level,
|
GLogLevelFlags log_level,
|
||||||
@ -388,6 +383,8 @@ g_log_set_fatal_mask (const gchar *log_domain,
|
|||||||
/* remove bogus flag */
|
/* remove bogus flag */
|
||||||
fatal_mask &= ~G_LOG_FLAG_FATAL;
|
fatal_mask &= ~G_LOG_FLAG_FATAL;
|
||||||
|
|
||||||
|
g_mutex_lock (g_messages_lock);
|
||||||
|
|
||||||
domain = g_log_find_domain (log_domain);
|
domain = g_log_find_domain (log_domain);
|
||||||
if (!domain)
|
if (!domain)
|
||||||
domain = g_log_domain_new (log_domain);
|
domain = g_log_domain_new (log_domain);
|
||||||
@ -395,7 +392,9 @@ g_log_set_fatal_mask (const gchar *log_domain,
|
|||||||
|
|
||||||
domain->fatal_mask = fatal_mask;
|
domain->fatal_mask = fatal_mask;
|
||||||
g_log_domain_check_free (domain);
|
g_log_domain_check_free (domain);
|
||||||
|
|
||||||
|
g_mutex_unlock (g_messages_lock);
|
||||||
|
|
||||||
return old_flags;
|
return old_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -415,19 +414,21 @@ g_log_set_handler (const gchar *log_domain,
|
|||||||
if (!log_domain)
|
if (!log_domain)
|
||||||
log_domain = "";
|
log_domain = "";
|
||||||
|
|
||||||
|
g_mutex_lock (g_messages_lock);
|
||||||
|
|
||||||
domain = g_log_find_domain (log_domain);
|
domain = g_log_find_domain (log_domain);
|
||||||
if (!domain)
|
if (!domain)
|
||||||
domain = g_log_domain_new (log_domain);
|
domain = g_log_domain_new (log_domain);
|
||||||
|
|
||||||
handler = g_new (GLogHandler, 1);
|
handler = g_new (GLogHandler, 1);
|
||||||
g_mutex_lock (g_messages_lock);
|
|
||||||
handler->id = ++handler_id;
|
handler->id = ++handler_id;
|
||||||
g_mutex_unlock (g_messages_lock);
|
|
||||||
handler->log_level = log_levels;
|
handler->log_level = log_levels;
|
||||||
handler->log_func = log_func;
|
handler->log_func = log_func;
|
||||||
handler->data = user_data;
|
handler->data = user_data;
|
||||||
handler->next = domain->handlers;
|
handler->next = domain->handlers;
|
||||||
domain->handlers = handler;
|
domain->handlers = handler;
|
||||||
|
|
||||||
|
g_mutex_unlock (g_messages_lock);
|
||||||
|
|
||||||
return handler_id;
|
return handler_id;
|
||||||
}
|
}
|
||||||
@ -443,6 +444,8 @@ g_log_remove_handler (const gchar *log_domain,
|
|||||||
if (!log_domain)
|
if (!log_domain)
|
||||||
log_domain = "";
|
log_domain = "";
|
||||||
|
|
||||||
|
g_mutex_lock (g_messages_lock);
|
||||||
|
|
||||||
domain = g_log_find_domain (log_domain);
|
domain = g_log_find_domain (log_domain);
|
||||||
if (domain)
|
if (domain)
|
||||||
{
|
{
|
||||||
@ -459,13 +462,17 @@ g_log_remove_handler (const gchar *log_domain,
|
|||||||
else
|
else
|
||||||
domain->handlers = work->next;
|
domain->handlers = work->next;
|
||||||
g_free (work);
|
g_free (work);
|
||||||
g_log_domain_check_free (domain);
|
g_log_domain_check_free (domain);
|
||||||
|
|
||||||
|
g_mutex_unlock (g_messages_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
last = work;
|
last = work;
|
||||||
work = last->next;
|
work = last->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_mutex_unlock (g_messages_lock);
|
||||||
g_warning ("g_log_remove_handler(): could not find handler with id `%d' for domain \"%s\"",
|
g_warning ("g_log_remove_handler(): could not find handler with id `%d' for domain \"%s\"",
|
||||||
handler_id,
|
handler_id,
|
||||||
log_domain);
|
log_domain);
|
||||||
@ -522,6 +529,8 @@ g_logv (const gchar *log_domain,
|
|||||||
GLogFunc log_func;
|
GLogFunc log_func;
|
||||||
gpointer data = NULL;
|
gpointer data = NULL;
|
||||||
|
|
||||||
|
g_mutex_lock (g_messages_lock);
|
||||||
|
|
||||||
domain = g_log_find_domain (log_domain ? log_domain : "");
|
domain = g_log_find_domain (log_domain ? log_domain : "");
|
||||||
|
|
||||||
if (depth)
|
if (depth)
|
||||||
@ -529,14 +538,14 @@ g_logv (const gchar *log_domain,
|
|||||||
|
|
||||||
depth++;
|
depth++;
|
||||||
g_private_set (g_log_depth, GUINT_TO_POINTER (depth));
|
g_private_set (g_log_depth, GUINT_TO_POINTER (depth));
|
||||||
|
|
||||||
g_mutex_lock (g_messages_lock);
|
|
||||||
if ((((domain ? domain->fatal_mask : G_LOG_FATAL_MASK) |
|
if ((((domain ? domain->fatal_mask : G_LOG_FATAL_MASK) |
|
||||||
g_log_always_fatal) & test_level) != 0)
|
g_log_always_fatal) & test_level) != 0)
|
||||||
test_level |= G_LOG_FLAG_FATAL;
|
test_level |= G_LOG_FLAG_FATAL;
|
||||||
g_mutex_unlock (g_messages_lock);
|
|
||||||
|
|
||||||
log_func = g_log_domain_get_handler (domain, test_level, &data);
|
log_func = g_log_domain_get_handler (domain, test_level, &data);
|
||||||
|
g_mutex_unlock (g_messages_lock);
|
||||||
|
|
||||||
log_func (log_domain, test_level, buffer, data);
|
log_func (log_domain, test_level, buffer, data);
|
||||||
|
|
||||||
/* *domain can be cluttered now */
|
/* *domain can be cluttered now */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user