Coverage Report

Created: 2025-11-02 06:51

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/tinysparql/subprojects/glib-2.80.3/glib/glib-private.h
Line
Count
Source
1
/* glib-private.h - GLib-internal private API, shared between glib, gobject, gio
2
 * Copyright (C) 2011 Red Hat, Inc.
3
 *
4
 * SPDX-License-Identifier: LGPL-2.1-or-later
5
 *
6
 * This library is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * This library is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public License
17
 * along with this library; if not, see <http://www.gnu.org/licenses/>.
18
 */
19
20
#ifndef __GLIB_PRIVATE_H__
21
#define __GLIB_PRIVATE_H__
22
23
#include <glib.h>
24
#include "gwakeup.h"
25
#include "gstdioprivate.h"
26
#include "gdatasetprivate.h"
27
28
/* gcc defines __SANITIZE_ADDRESS__, clang sets the address_sanitizer
29
 * feature flag.
30
 *
31
 * MSVC defines __SANITIZE_ADDRESS__ as well when AddressSanitizer
32
 * is enabled but __lsan_ignore_object() equivalent method is not supported
33
 * See also
34
 * https://docs.microsoft.com/en-us/cpp/sanitizers/asan-building?view=msvc-160
35
 */
36
#if !defined(_MSC_VER) && (defined(__SANITIZE_ADDRESS__) || g_macro__has_feature(address_sanitizer))
37
38
/*
39
 * %_GLIB_ADDRESS_SANITIZER:
40
 *
41
 * Private macro defined if the AddressSanitizer is in use by GLib itself.
42
 */
43
#define _GLIB_ADDRESS_SANITIZER
44
45
#include <sanitizer/lsan_interface.h>
46
47
/* If GLib itself is not compiled with ASAN sanitizer we may still want to
48
 * control it in case it's linked by the loading application, so we need to
49
 * do this check dynamically.
50
 * However MinGW doesn't support weak attribute properly (even if it advertises
51
 * it), so we ignore it in such case since it's not convenient to go through
52
 * dlsym().
53
 * Under MSVC we could use alternatename, but it doesn't seem to be as reliable
54
 * as we'd like: https://stackoverflow.com/a/11529277/210151 and
55
 * https://devblogs.microsoft.com/oldnewthing/20200731-00/?p=104024
56
 */
57
#elif defined (G_OS_UNIX) && !defined (__APPLE__) && g_macro__has_attribute (weak)
58
59
#define HAS_DYNAMIC_ASAN_LOADING
60
61
void __lsan_enable (void) __attribute__ ((weak));
62
void __lsan_disable (void) __attribute__ ((weak));
63
void __lsan_ignore_object (const void *p) __attribute__ ((weak));
64
65
#endif
66
67
/**
68
 * G_CONTAINER_OF:
69
 * @ptr: a pointer to a member @field of type @type.
70
 * @type: the type of the container in which @field is embedded.
71
 * @field: the name of the field in @type.
72
 *
73
 * Casts away constness of @ptr.
74
 *
75
 * Returns: a pointer to the container, so that "&(@container)->field == (@ptr)" holds.
76
 */
77
6.38k
#define G_CONTAINER_OF(ptr, type, field) ((type *) G_STRUCT_MEMBER_P (ptr, -G_STRUCT_OFFSET (type, field)))
78
79
/*
80
 * g_leak_sanitizer_is_supported:
81
 *
82
 * Checks at runtime if LeakSanitizer is currently supported by the running
83
 * binary. This may imply that GLib itself is not compiled with sanitizer
84
 * but that the loading program is.
85
 */
86
static inline gboolean
87
g_leak_sanitizer_is_supported (void)
88
0
{
89
#if defined (_GLIB_ADDRESS_SANITIZER)
90
  return TRUE;
91
#elif defined (HAS_DYNAMIC_ASAN_LOADING)
92
0
  return __lsan_enable != NULL && __lsan_ignore_object != NULL;
93
#else
94
  return FALSE;
95
#endif
96
0
}
Unexecuted instantiation: gresource.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gtask.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gvfs.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gdesktopappinfo.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gdbusprivate.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: glocalfile.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: glocalfileenumerator.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: glocalfileinfo.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: glocalfileinputstream.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: glocalfilemonitor.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: glocalfileoutputstream.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: glocalfileiostream.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: thumbnail-verify.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gcancellable.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gcontextspecificgroup.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: giomodule.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gunixfdlist.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gcontenttype.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gapplication.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gdbusaddress.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gdbusauthmechanismsha1.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gportalsupport.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gproxyaddressenumerator.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gthreadedresolver.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gsettingsschema.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gsubprocess.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: inotify-missing.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: inotify-kernel.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gdir.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: genviron.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: ggettext.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: ghash.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: glib-private.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gmain.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gmessages.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gquark.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gtestutils.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gthreadpool.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: guri.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gutils.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gobject.c:g_leak_sanitizer_is_supported
Unexecuted instantiation: gtype.c:g_leak_sanitizer_is_supported
97
98
/*
99
 * g_ignore_leak:
100
 * @p: any pointer
101
 *
102
 * Tell AddressSanitizer and similar tools that if the object pointed to
103
 * by @p is leaked, it is not a problem. Use this to suppress memory leak
104
 * reports when a potentially unreachable pointer is deliberately not
105
 * going to be deallocated.
106
 */
107
static inline void
108
g_ignore_leak (gconstpointer p)
109
4
{
110
#if defined (_GLIB_ADDRESS_SANITIZER)
111
  if (p != NULL)
112
    __lsan_ignore_object (p);
113
#elif defined (HAS_DYNAMIC_ASAN_LOADING)
114
4
  if (p != NULL && __lsan_ignore_object != NULL)
115
0
    __lsan_ignore_object (p);
116
4
#endif
117
4
}
Unexecuted instantiation: gresource.c:g_ignore_leak
Unexecuted instantiation: gtask.c:g_ignore_leak
Unexecuted instantiation: gvfs.c:g_ignore_leak
Unexecuted instantiation: gdesktopappinfo.c:g_ignore_leak
Unexecuted instantiation: gdbusprivate.c:g_ignore_leak
Unexecuted instantiation: glocalfile.c:g_ignore_leak
Unexecuted instantiation: glocalfileenumerator.c:g_ignore_leak
Unexecuted instantiation: glocalfileinfo.c:g_ignore_leak
Unexecuted instantiation: glocalfileinputstream.c:g_ignore_leak
Unexecuted instantiation: glocalfilemonitor.c:g_ignore_leak
Unexecuted instantiation: glocalfileoutputstream.c:g_ignore_leak
Unexecuted instantiation: glocalfileiostream.c:g_ignore_leak
Unexecuted instantiation: thumbnail-verify.c:g_ignore_leak
Unexecuted instantiation: gcancellable.c:g_ignore_leak
Unexecuted instantiation: gcontextspecificgroup.c:g_ignore_leak
Unexecuted instantiation: giomodule.c:g_ignore_leak
Unexecuted instantiation: gunixfdlist.c:g_ignore_leak
Unexecuted instantiation: gcontenttype.c:g_ignore_leak
Unexecuted instantiation: gapplication.c:g_ignore_leak
Unexecuted instantiation: gdbusaddress.c:g_ignore_leak
Unexecuted instantiation: gdbusauthmechanismsha1.c:g_ignore_leak
Unexecuted instantiation: gportalsupport.c:g_ignore_leak
Unexecuted instantiation: gproxyaddressenumerator.c:g_ignore_leak
Unexecuted instantiation: gthreadedresolver.c:g_ignore_leak
Unexecuted instantiation: gsettingsschema.c:g_ignore_leak
Unexecuted instantiation: gsubprocess.c:g_ignore_leak
Unexecuted instantiation: inotify-missing.c:g_ignore_leak
Unexecuted instantiation: inotify-kernel.c:g_ignore_leak
Unexecuted instantiation: gdir.c:g_ignore_leak
Unexecuted instantiation: genviron.c:g_ignore_leak
Unexecuted instantiation: ggettext.c:g_ignore_leak
Unexecuted instantiation: ghash.c:g_ignore_leak
Unexecuted instantiation: glib-private.c:g_ignore_leak
Unexecuted instantiation: gmain.c:g_ignore_leak
Unexecuted instantiation: gmessages.c:g_ignore_leak
Unexecuted instantiation: gquark.c:g_ignore_leak
Unexecuted instantiation: gtestutils.c:g_ignore_leak
gthreadpool.c:g_ignore_leak
Line
Count
Source
109
4
{
110
#if defined (_GLIB_ADDRESS_SANITIZER)
111
  if (p != NULL)
112
    __lsan_ignore_object (p);
113
#elif defined (HAS_DYNAMIC_ASAN_LOADING)
114
4
  if (p != NULL && __lsan_ignore_object != NULL)
115
0
    __lsan_ignore_object (p);
116
4
#endif
117
4
}
Unexecuted instantiation: guri.c:g_ignore_leak
Unexecuted instantiation: gutils.c:g_ignore_leak
Unexecuted instantiation: gobject.c:g_ignore_leak
Unexecuted instantiation: gtype.c:g_ignore_leak
118
119
/*
120
 * g_ignore_strv_leak:
121
 * @strv: (nullable) (array zero-terminated=1): an array of strings
122
 *
123
 * The same as g_ignore_leak(), but for the memory pointed to by @strv,
124
 * and for each element of @strv.
125
 */
126
static inline void
127
g_ignore_strv_leak (GStrv strv)
128
0
{
129
0
  gchar **item;
130
131
0
  if (!g_leak_sanitizer_is_supported ())
132
0
    return;
133
134
0
  if (strv)
135
0
    {
136
0
      g_ignore_leak (strv);
137
138
0
      for (item = strv; *item != NULL; item++)
139
0
        g_ignore_leak (*item);
140
0
    }
141
0
}
Unexecuted instantiation: gresource.c:g_ignore_strv_leak
Unexecuted instantiation: gtask.c:g_ignore_strv_leak
Unexecuted instantiation: gvfs.c:g_ignore_strv_leak
Unexecuted instantiation: gdesktopappinfo.c:g_ignore_strv_leak
Unexecuted instantiation: gdbusprivate.c:g_ignore_strv_leak
Unexecuted instantiation: glocalfile.c:g_ignore_strv_leak
Unexecuted instantiation: glocalfileenumerator.c:g_ignore_strv_leak
Unexecuted instantiation: glocalfileinfo.c:g_ignore_strv_leak
Unexecuted instantiation: glocalfileinputstream.c:g_ignore_strv_leak
Unexecuted instantiation: glocalfilemonitor.c:g_ignore_strv_leak
Unexecuted instantiation: glocalfileoutputstream.c:g_ignore_strv_leak
Unexecuted instantiation: glocalfileiostream.c:g_ignore_strv_leak
Unexecuted instantiation: thumbnail-verify.c:g_ignore_strv_leak
Unexecuted instantiation: gcancellable.c:g_ignore_strv_leak
Unexecuted instantiation: gcontextspecificgroup.c:g_ignore_strv_leak
Unexecuted instantiation: giomodule.c:g_ignore_strv_leak
Unexecuted instantiation: gunixfdlist.c:g_ignore_strv_leak
Unexecuted instantiation: gcontenttype.c:g_ignore_strv_leak
Unexecuted instantiation: gapplication.c:g_ignore_strv_leak
Unexecuted instantiation: gdbusaddress.c:g_ignore_strv_leak
Unexecuted instantiation: gdbusauthmechanismsha1.c:g_ignore_strv_leak
Unexecuted instantiation: gportalsupport.c:g_ignore_strv_leak
Unexecuted instantiation: gproxyaddressenumerator.c:g_ignore_strv_leak
Unexecuted instantiation: gthreadedresolver.c:g_ignore_strv_leak
Unexecuted instantiation: gsettingsschema.c:g_ignore_strv_leak
Unexecuted instantiation: gsubprocess.c:g_ignore_strv_leak
Unexecuted instantiation: inotify-missing.c:g_ignore_strv_leak
Unexecuted instantiation: inotify-kernel.c:g_ignore_strv_leak
Unexecuted instantiation: gdir.c:g_ignore_strv_leak
Unexecuted instantiation: genviron.c:g_ignore_strv_leak
Unexecuted instantiation: ggettext.c:g_ignore_strv_leak
Unexecuted instantiation: ghash.c:g_ignore_strv_leak
Unexecuted instantiation: glib-private.c:g_ignore_strv_leak
Unexecuted instantiation: gmain.c:g_ignore_strv_leak
Unexecuted instantiation: gmessages.c:g_ignore_strv_leak
Unexecuted instantiation: gquark.c:g_ignore_strv_leak
Unexecuted instantiation: gtestutils.c:g_ignore_strv_leak
Unexecuted instantiation: gthreadpool.c:g_ignore_strv_leak
Unexecuted instantiation: guri.c:g_ignore_strv_leak
Unexecuted instantiation: gutils.c:g_ignore_strv_leak
Unexecuted instantiation: gobject.c:g_ignore_strv_leak
Unexecuted instantiation: gtype.c:g_ignore_strv_leak
142
143
/*
144
 * g_begin_ignore_leaks:
145
 *
146
 * Tell AddressSanitizer and similar tools to ignore all leaks from this point
147
 * onwards, until g_end_ignore_leaks() is called.
148
 *
149
 * Try to use g_ignore_leak() where possible to target deliberate leaks more
150
 * specifically.
151
 */
152
static inline void
153
g_begin_ignore_leaks (void)
154
0
{
155
#if defined (_GLIB_ADDRESS_SANITIZER)
156
  __lsan_disable ();
157
#elif defined (HAS_DYNAMIC_ASAN_LOADING)
158
0
  if (__lsan_disable != NULL)
159
0
    __lsan_disable ();
160
0
#endif
161
0
}
Unexecuted instantiation: gresource.c:g_begin_ignore_leaks
Unexecuted instantiation: gtask.c:g_begin_ignore_leaks
Unexecuted instantiation: gvfs.c:g_begin_ignore_leaks
Unexecuted instantiation: gdesktopappinfo.c:g_begin_ignore_leaks
Unexecuted instantiation: gdbusprivate.c:g_begin_ignore_leaks
Unexecuted instantiation: glocalfile.c:g_begin_ignore_leaks
Unexecuted instantiation: glocalfileenumerator.c:g_begin_ignore_leaks
Unexecuted instantiation: glocalfileinfo.c:g_begin_ignore_leaks
Unexecuted instantiation: glocalfileinputstream.c:g_begin_ignore_leaks
Unexecuted instantiation: glocalfilemonitor.c:g_begin_ignore_leaks
Unexecuted instantiation: glocalfileoutputstream.c:g_begin_ignore_leaks
Unexecuted instantiation: glocalfileiostream.c:g_begin_ignore_leaks
Unexecuted instantiation: thumbnail-verify.c:g_begin_ignore_leaks
Unexecuted instantiation: gcancellable.c:g_begin_ignore_leaks
Unexecuted instantiation: gcontextspecificgroup.c:g_begin_ignore_leaks
Unexecuted instantiation: giomodule.c:g_begin_ignore_leaks
Unexecuted instantiation: gunixfdlist.c:g_begin_ignore_leaks
Unexecuted instantiation: gcontenttype.c:g_begin_ignore_leaks
Unexecuted instantiation: gapplication.c:g_begin_ignore_leaks
Unexecuted instantiation: gdbusaddress.c:g_begin_ignore_leaks
Unexecuted instantiation: gdbusauthmechanismsha1.c:g_begin_ignore_leaks
Unexecuted instantiation: gportalsupport.c:g_begin_ignore_leaks
Unexecuted instantiation: gproxyaddressenumerator.c:g_begin_ignore_leaks
Unexecuted instantiation: gthreadedresolver.c:g_begin_ignore_leaks
Unexecuted instantiation: gsettingsschema.c:g_begin_ignore_leaks
Unexecuted instantiation: gsubprocess.c:g_begin_ignore_leaks
Unexecuted instantiation: inotify-missing.c:g_begin_ignore_leaks
Unexecuted instantiation: inotify-kernel.c:g_begin_ignore_leaks
Unexecuted instantiation: gdir.c:g_begin_ignore_leaks
Unexecuted instantiation: genviron.c:g_begin_ignore_leaks
Unexecuted instantiation: ggettext.c:g_begin_ignore_leaks
Unexecuted instantiation: ghash.c:g_begin_ignore_leaks
Unexecuted instantiation: glib-private.c:g_begin_ignore_leaks
Unexecuted instantiation: gmain.c:g_begin_ignore_leaks
Unexecuted instantiation: gmessages.c:g_begin_ignore_leaks
Unexecuted instantiation: gquark.c:g_begin_ignore_leaks
Unexecuted instantiation: gtestutils.c:g_begin_ignore_leaks
Unexecuted instantiation: gthreadpool.c:g_begin_ignore_leaks
Unexecuted instantiation: guri.c:g_begin_ignore_leaks
Unexecuted instantiation: gutils.c:g_begin_ignore_leaks
Unexecuted instantiation: gobject.c:g_begin_ignore_leaks
Unexecuted instantiation: gtype.c:g_begin_ignore_leaks
162
163
/*
164
 * g_end_ignore_leaks:
165
 *
166
 * Start ignoring leaks again; this must be paired with a previous call to
167
 * g_begin_ignore_leaks().
168
 */
169
static inline void
170
g_end_ignore_leaks (void)
171
0
{
172
#if defined (_GLIB_ADDRESS_SANITIZER)
173
  __lsan_enable ();
174
#elif defined (HAS_DYNAMIC_ASAN_LOADING)
175
0
  if (__lsan_enable != NULL)
176
0
    __lsan_enable ();
177
0
#endif
178
0
}
Unexecuted instantiation: gresource.c:g_end_ignore_leaks
Unexecuted instantiation: gtask.c:g_end_ignore_leaks
Unexecuted instantiation: gvfs.c:g_end_ignore_leaks
Unexecuted instantiation: gdesktopappinfo.c:g_end_ignore_leaks
Unexecuted instantiation: gdbusprivate.c:g_end_ignore_leaks
Unexecuted instantiation: glocalfile.c:g_end_ignore_leaks
Unexecuted instantiation: glocalfileenumerator.c:g_end_ignore_leaks
Unexecuted instantiation: glocalfileinfo.c:g_end_ignore_leaks
Unexecuted instantiation: glocalfileinputstream.c:g_end_ignore_leaks
Unexecuted instantiation: glocalfilemonitor.c:g_end_ignore_leaks
Unexecuted instantiation: glocalfileoutputstream.c:g_end_ignore_leaks
Unexecuted instantiation: glocalfileiostream.c:g_end_ignore_leaks
Unexecuted instantiation: thumbnail-verify.c:g_end_ignore_leaks
Unexecuted instantiation: gcancellable.c:g_end_ignore_leaks
Unexecuted instantiation: gcontextspecificgroup.c:g_end_ignore_leaks
Unexecuted instantiation: giomodule.c:g_end_ignore_leaks
Unexecuted instantiation: gunixfdlist.c:g_end_ignore_leaks
Unexecuted instantiation: gcontenttype.c:g_end_ignore_leaks
Unexecuted instantiation: gapplication.c:g_end_ignore_leaks
Unexecuted instantiation: gdbusaddress.c:g_end_ignore_leaks
Unexecuted instantiation: gdbusauthmechanismsha1.c:g_end_ignore_leaks
Unexecuted instantiation: gportalsupport.c:g_end_ignore_leaks
Unexecuted instantiation: gproxyaddressenumerator.c:g_end_ignore_leaks
Unexecuted instantiation: gthreadedresolver.c:g_end_ignore_leaks
Unexecuted instantiation: gsettingsschema.c:g_end_ignore_leaks
Unexecuted instantiation: gsubprocess.c:g_end_ignore_leaks
Unexecuted instantiation: inotify-missing.c:g_end_ignore_leaks
Unexecuted instantiation: inotify-kernel.c:g_end_ignore_leaks
Unexecuted instantiation: gdir.c:g_end_ignore_leaks
Unexecuted instantiation: genviron.c:g_end_ignore_leaks
Unexecuted instantiation: ggettext.c:g_end_ignore_leaks
Unexecuted instantiation: ghash.c:g_end_ignore_leaks
Unexecuted instantiation: glib-private.c:g_end_ignore_leaks
Unexecuted instantiation: gmain.c:g_end_ignore_leaks
Unexecuted instantiation: gmessages.c:g_end_ignore_leaks
Unexecuted instantiation: gquark.c:g_end_ignore_leaks
Unexecuted instantiation: gtestutils.c:g_end_ignore_leaks
Unexecuted instantiation: gthreadpool.c:g_end_ignore_leaks
Unexecuted instantiation: guri.c:g_end_ignore_leaks
Unexecuted instantiation: gutils.c:g_end_ignore_leaks
Unexecuted instantiation: gobject.c:g_end_ignore_leaks
Unexecuted instantiation: gtype.c:g_end_ignore_leaks
179
180
#undef HAS_DYNAMIC_ASAN_LOADING
181
182
GMainContext *          g_get_worker_context            (void);
183
gboolean                g_check_setuid                  (void);
184
GMainContext *          g_main_context_new_with_next_id (guint next_id);
185
186
#if (defined (HAVE__SET_THREAD_LOCAL_INVALID_PARAMETER_HANDLER) || \
187
     defined (HAVE__SET_INVALID_PARAMETER_HANDLER)) && \
188
    defined (HAVE__CRT_SET_REPORT_MODE)
189
# define USE_INVALID_PARAMETER_HANDLER
190
#endif
191
192
#ifdef USE_INVALID_PARAMETER_HANDLER
193
struct _GWin32InvalidParameterHandler
194
{
195
  _invalid_parameter_handler old_handler;
196
  _invalid_parameter_handler pushed_handler;
197
  int prev_report_mode;
198
  int pushed_report_mode;
199
};
200
#else
201
struct _GWin32InvalidParameterHandler
202
{
203
  int unused_really;
204
};
205
#endif
206
207
#ifdef G_OS_WIN32
208
GLIB_AVAILABLE_IN_ALL
209
gchar *_glib_get_locale_dir    (void);
210
#endif
211
212
GDir * g_dir_open_with_errno (const gchar *path, guint flags);
213
GDir * g_dir_new_from_dirp (gpointer dirp);
214
215
typedef struct _GWin32InvalidParameterHandler GWin32InvalidParameterHandler;
216
void g_win32_push_empty_invalid_parameter_handler (GWin32InvalidParameterHandler *items);
217
void g_win32_pop_invalid_parameter_handler (GWin32InvalidParameterHandler *items);
218
219
char *g_find_program_for_path (const char *program,
220
                               const char *path,
221
                               const char *working_dir);
222
223
int g_uri_get_default_scheme_port (const char *scheme);
224
225
25.5k
#define GLIB_PRIVATE_CALL(symbol) (glib__private__()->symbol)
226
227
228
typedef struct {
229
  /* See gwakeup.c */
230
  GWakeup *             (* g_wakeup_new)                (void);
231
  void                  (* g_wakeup_free)               (GWakeup *wakeup);
232
  void                  (* g_wakeup_get_pollfd)         (GWakeup *wakeup,
233
                                                        GPollFD *poll_fd);
234
  void                  (* g_wakeup_signal)             (GWakeup *wakeup);
235
  void                  (* g_wakeup_acknowledge)        (GWakeup *wakeup);
236
237
  /* See gmain.c */
238
  GMainContext *        (* g_get_worker_context)        (void);
239
240
  gboolean              (* g_check_setuid)              (void);
241
  GMainContext *        (* g_main_context_new_with_next_id) (guint next_id);
242
243
  GDir *                (* g_dir_open_with_errno)       (const gchar *path,
244
                                                         guint        flags);
245
  GDir *                (* g_dir_new_from_dirp)         (gpointer dirp);
246
247
  /* See glib-init.c */
248
  void                  (* glib_init)                   (void);
249
250
  /* See gstdio.c */
251
#ifdef G_OS_WIN32
252
  int                   (* g_win32_stat_utf8)           (const gchar        *filename,
253
                                                         GWin32PrivateStat  *buf);
254
255
  int                   (* g_win32_lstat_utf8)          (const gchar        *filename,
256
                                                         GWin32PrivateStat  *buf);
257
258
  int                   (* g_win32_readlink_utf8)       (const gchar        *filename,
259
                                                         gchar              *buf,
260
                                                         gsize               buf_size,
261
                                                         gchar             **alloc_buf,
262
                                                         gboolean            terminate);
263
264
  int                   (* g_win32_fstat)               (int                 fd,
265
                                                         GWin32PrivateStat  *buf);
266
267
  /* See gwin32.c */
268
  gchar *(*g_win32_find_helper_executable_path) (const gchar *process_name,
269
                                                 void *dll_handle);
270
271
  int                   (* g_win32_reopen_noninherited) (int      fd,
272
                                                         int      mode,
273
                                                         GError **err);
274
275
  gboolean              (* g_win32_handle_is_socket)    (void *handle);
276
277
#endif
278
279
  /* See glib-private.c */
280
  void (* g_win32_push_empty_invalid_parameter_handler) (GWin32InvalidParameterHandler *items);
281
282
  void (* g_win32_pop_invalid_parameter_handler)        (GWin32InvalidParameterHandler *items);
283
284
  /* See gutils.c */
285
  char *(* g_find_program_for_path) (const char *program,
286
                                     const char *path,
287
                                     const char *working_dir);
288
289
  /* See guri.c */
290
  int (* g_uri_get_default_scheme_port) (const char *scheme);
291
292
  /* See gutils.c */
293
  gboolean (* g_set_prgname_once) (const gchar *prgname);
294
295
  gpointer (*g_datalist_id_update_atomic) (GData **datalist,
296
                                           GQuark key_id,
297
                                           GDataListUpdateAtomicFunc callback,
298
                                           gpointer user_data);
299
300
  /* Add other private functions here, initialize them in glib-private.c */
301
} GLibPrivateVTable;
302
303
GLIB_AVAILABLE_IN_ALL
304
const GLibPrivateVTable *glib__private__ (void);
305
306
/* Please see following for the use of ".ACP" over ""
307
 * on Windows, although both are accepted at compile-time
308
 * but "" renders translated console messages unreadable if
309
 * built with Visual Studio 2012 and later (this is, unfortunately,
310
 * undocumented):
311
 *
312
 * https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale
313
 * https://gitlab.gnome.org/GNOME/glib/merge_requests/895#note_525881
314
 * https://gitlab.gnome.org/GNOME/glib/merge_requests/895#note_525900
315
 *
316
 * Additional related items:
317
 * https://stackoverflow.com/questions/22604329/php-5-5-setlocale-not-working-in-cli-on-windows
318
 * https://bugs.php.net/bug.php?id=66265
319
 */
320
321
#ifdef G_OS_WIN32
322
# define GLIB_DEFAULT_LOCALE ".ACP"
323
#else
324
# define GLIB_DEFAULT_LOCALE ""
325
#endif
326
327
gboolean g_uint_equal (gconstpointer v1, gconstpointer v2);
328
guint g_uint_hash (gconstpointer v);
329
330
#if defined(__GNUC__)
331
#define G_THREAD_LOCAL __thread
332
#else
333
#undef G_THREAD_LOCAL
334
#endif
335
336
/* Convenience wrapper to call private g_datalist_id_update_atomic() function. */
337
#define _g_datalist_id_update_atomic(datalist, key_id, callback, user_data) \
338
6.39k
  (GLIB_PRIVATE_CALL (g_datalist_id_update_atomic) ((datalist), (key_id), (callback), (user_data)))
339
340
#endif /* __GLIB_PRIVATE_H__ */