summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver <halting@riseup.net>2022-11-11 17:04:00 +0000
committerAlan Coopersmith <alan.coopersmith@oracle.com>2022-11-11 17:04:00 +0000
commit696d19d5db7bcb1c1f582c2b1846520e7e0870cb (patch)
treeb8c631b7bda4d6b1d703696c438d7fd3264c4c9f
parentb4f24b272c6ef888b6fcfcf80670c196b2e8f755 (diff)
downloadxorg-lib-libX11-696d19d5db7bcb1c1f582c2b1846520e7e0870cb.tar.gz
Add XFreeThreads function.
-rw-r--r--include/X11/Xlib.h4
-rw-r--r--man/XInitThreads.man8
-rw-r--r--src/globals.c6
-rw-r--r--src/locking.c23
4 files changed, 40 insertions, 1 deletions
diff --git a/include/X11/Xlib.h b/include/X11/Xlib.h
index f62fb470..29ea5715 100644
--- a/include/X11/Xlib.h
+++ b/include/X11/Xlib.h
@@ -1735,6 +1735,10 @@ extern Status XInitThreads(
void
);
+extern Status XFreeThreads(
+ void
+);
+
extern void XLockDisplay(
Display* /* display */
);
diff --git a/man/XInitThreads.man b/man/XInitThreads.man
index 4ae95228..b629bd28 100644
--- a/man/XInitThreads.man
+++ b/man/XInitThreads.man
@@ -52,6 +52,8 @@ XInitThreads, XLockDisplay, XUnlockDisplay \- multi-threading support
.HP
Status XInitThreads\^(void);
.HP
+Status XFreeThreads\^(void);
+.HP
void XLockDisplay\^(\^Display *\fIdisplay\fP\^);
.HP
void XUnlockDisplay\^(\^Display *\fIdisplay\fP\^);
@@ -76,7 +78,11 @@ are protected by some other access mechanism (for example,
a mutual exclusion lock in a toolkit or through explicit client
programming), Xlib thread initialization is not required.
It is recommended that single-threaded programs not call this function.
-
+.LP
+The
+.B XFreeThreads
+function frees the memory allocated by
+.BR XInitThreads .
.LP
The
.B XLockDisplay
diff --git a/src/globals.c b/src/globals.c
index 66b589fe..c07de431 100644
--- a/src/globals.c
+++ b/src/globals.c
@@ -105,4 +105,10 @@ xlib_ctor(void)
{
XInitThreads();
}
+
+__attribute__((destructor)) static void
+xlib_dtor(void)
+{
+ XFreeThreads();
+}
#endif
diff --git a/src/locking.c b/src/locking.c
index 36530691..bdc07011 100644
--- a/src/locking.c
+++ b/src/locking.c
@@ -673,9 +673,32 @@ Status XInitThreads(void)
return 1;
}
+Status XFreeThreads(void)
+{
+ if (global_lock.lock != NULL) {
+ xmutex_free(global_lock.lock);
+ global_lock.lock = NULL;
+ }
+ if (i18n_lock.lock != NULL) {
+ xmutex_free(i18n_lock.lock);
+ i18n_lock.lock = NULL;
+ }
+ if (conv_lock.lock != NULL) {
+ xmutex_free(conv_lock.lock);
+ conv_lock.lock = NULL;
+ }
+
+ return 1;
+}
+
#else /* XTHREADS */
Status XInitThreads(void)
{
return 0;
}
+
+Status XFreeThreads(void)
+{
+ return 0;
+}
#endif /* XTHREADS */