mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-15 05:46:15 +01:00
Merge branch 'backport-1698-slice-getenv-win32-glib-2-66' into 'glib-2-66'
Backport !1698 “gslice: Inline win32 implementation of g_getenv() to avoid deadlock” to glib-2-66 See merge request GNOME/glib!1702
This commit is contained in:
commit
cb8059291d
@ -361,10 +361,52 @@ static void
|
|||||||
slice_config_init (SliceConfig *config)
|
slice_config_init (SliceConfig *config)
|
||||||
{
|
{
|
||||||
const gchar *val;
|
const gchar *val;
|
||||||
|
gchar *val_allocated = NULL;
|
||||||
|
|
||||||
*config = slice_config;
|
*config = slice_config;
|
||||||
|
|
||||||
|
/* Note that the empty string (`G_SLICE=""`) is treated differently from the
|
||||||
|
* envvar being unset. In the latter case, we also check whether running under
|
||||||
|
* valgrind. */
|
||||||
|
#ifndef G_OS_WIN32
|
||||||
val = g_getenv ("G_SLICE");
|
val = g_getenv ("G_SLICE");
|
||||||
|
#else
|
||||||
|
/* The win32 implementation of g_getenv() has to do UTF-8 ↔ UTF-16 conversions
|
||||||
|
* which use the slice allocator, leading to deadlock. Use a simple in-place
|
||||||
|
* implementation here instead.
|
||||||
|
*
|
||||||
|
* Ignore references to other environment variables: only support values which
|
||||||
|
* are a combination of always-malloc and debug-blocks. */
|
||||||
|
{
|
||||||
|
|
||||||
|
wchar_t wvalue[128]; /* at least big enough for `always-malloc,debug-blocks` */
|
||||||
|
int len;
|
||||||
|
|
||||||
|
len = GetEnvironmentVariableW (L"G_SLICE", wvalue, G_N_ELEMENTS (wvalue));
|
||||||
|
|
||||||
|
if (len == 0)
|
||||||
|
{
|
||||||
|
if (GetLastError () == ERROR_ENVVAR_NOT_FOUND)
|
||||||
|
val = NULL;
|
||||||
|
else
|
||||||
|
val = "";
|
||||||
|
}
|
||||||
|
else if (len >= G_N_ELEMENTS (wvalue))
|
||||||
|
{
|
||||||
|
/* @wvalue isn’t big enough. Give up. */
|
||||||
|
g_warning ("Unsupported G_SLICE value");
|
||||||
|
val = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* it’s safe to use g_utf16_to_utf8() here as it only allocates using
|
||||||
|
* malloc() rather than GSlice */
|
||||||
|
val = val_allocated = g_utf16_to_utf8 (wvalue, -1, NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif /* G_OS_WIN32 */
|
||||||
|
|
||||||
if (val != NULL)
|
if (val != NULL)
|
||||||
{
|
{
|
||||||
gint flags;
|
gint flags;
|
||||||
@ -392,6 +434,8 @@ slice_config_init (SliceConfig *config)
|
|||||||
config->always_malloc = TRUE;
|
config->always_malloc = TRUE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_free (val_allocated);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user