summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Deutschmann <whissi@gentoo.org>2019-10-15 12:24:12 +0200
committerThomas Deutschmann <whissi@gentoo.org>2020-08-13 11:26:55 +0200
commite088156d5b620e5e639580dacf85c6dc13823c74 (patch)
tree57f5c025e203279944da512166c20bc0521d8ccd /base/gsnotify.c
downloadghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.tar.gz
ghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.tar.bz2
ghostscript-gpl-patches-e088156d5b620e5e639580dacf85c6dc13823c74.zip
Import Ghostscript 9.50ghostscript-9.50
Signed-off-by: Thomas Deutschmann <whissi@gentoo.org>
Diffstat (limited to 'base/gsnotify.c')
-rw-r--r--base/gsnotify.c124
1 files changed, 124 insertions, 0 deletions
diff --git a/base/gsnotify.c b/base/gsnotify.c
new file mode 100644
index 00000000..b54ccae6
--- /dev/null
+++ b/base/gsnotify.c
@@ -0,0 +1,124 @@
+/* Copyright (C) 2001-2019 Artifex Software, Inc.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied,
+ modified or distributed except as expressly authorized under the terms
+ of the license contained in the file LICENSE in this distribution.
+
+ Refer to licensing information at http://www.artifex.com or contact
+ Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+ CA 94945, U.S.A., +1(415)492-9861, for further information.
+*/
+
+
+/* Notification machinery implementation */
+#include "gx.h"
+#include "gserrors.h"
+#include "gsstruct.h"
+#include "gsnotify.h"
+
+/* GC descriptors */
+private_st_gs_notify_registration();
+public_st_gs_notify_list();
+
+/* Initialize a notification list. */
+void
+gs_notify_init(gs_notify_list_t *nlist, gs_memory_t *mem)
+{
+ nlist->first = 0;
+ nlist->memory = mem;
+}
+
+/* Register a client. */
+int
+gs_notify_register(gs_notify_list_t *nlist, gs_notify_proc_t proc,
+ void *proc_data)
+{
+ gs_notify_registration_t *nreg =
+ gs_alloc_struct(nlist->memory, gs_notify_registration_t,
+ &st_gs_notify_registration, "gs_notify_register");
+
+ if (nreg == 0)
+ return_error(gs_error_VMerror);
+ nreg->proc = proc;
+ nreg->proc_data = proc_data;
+ nreg->next = nlist->first;
+ nlist->first = nreg;
+ return 0;
+}
+
+/*
+ * Unregister a client. Return 1 if the client was registered, 0 if not.
+ * If proc_data is 0, unregister all registrations of that proc; otherwise,
+ * unregister only the registration of that procedure with that proc_data.
+ */
+static void
+no_unreg_proc(void *pdata)
+{
+}
+int
+gs_notify_unregister_calling(gs_notify_list_t *nlist, gs_notify_proc_t proc,
+ void *proc_data,
+ void (*unreg_proc)(void *pdata))
+{
+ gs_notify_registration_t **prev = &nlist->first;
+ gs_notify_registration_t *cur;
+ bool found = 0;
+
+ while ((cur = *prev) != 0)
+ if (cur->proc == proc &&
+ (proc_data == 0 || cur->proc_data == proc_data)
+ ) {
+ *prev = cur->next;
+ unreg_proc(cur->proc_data);
+ gs_free_object(nlist->memory, cur, "gs_notify_unregister");
+ found = 1;
+ } else
+ prev = &cur->next;
+ return found;
+}
+int
+gs_notify_unregister(gs_notify_list_t *nlist, gs_notify_proc_t proc,
+ void *proc_data)
+{
+ return gs_notify_unregister_calling(nlist, proc, proc_data, no_unreg_proc);
+}
+
+/*
+ * Notify the clients on a list. If an error occurs, return the first
+ * error code, but notify all clients regardless.
+ */
+int
+gs_notify_all(gs_notify_list_t *nlist, void *event_data)
+{
+ gs_notify_registration_t *cur;
+ gs_notify_registration_t *next;
+ int ecode = 0;
+
+ for (next = nlist->first; (cur = next) != 0;) {
+ int code;
+
+ next = cur->next;
+ code = cur->proc(cur->proc_data, event_data);
+ if (code < 0 && ecode == 0)
+ ecode = code;
+ }
+ return ecode;
+}
+
+/* Release a notification list. */
+void
+gs_notify_release(gs_notify_list_t *nlist)
+{
+ gs_memory_t *mem = nlist->memory;
+
+ while (nlist->first) {
+ gs_notify_registration_t *next = nlist->first->next;
+
+ gs_free_object(mem, nlist->first, "gs_notify_release");
+ nlist->first = next;
+ }
+}