summaryrefslogtreecommitdiffstats
path: root/contrib/ntp/libntp/work_thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ntp/libntp/work_thread.c')
-rw-r--r--contrib/ntp/libntp/work_thread.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/contrib/ntp/libntp/work_thread.c b/contrib/ntp/libntp/work_thread.c
index 11e3267..82f6064 100644
--- a/contrib/ntp/libntp/work_thread.c
+++ b/contrib/ntp/libntp/work_thread.c
@@ -88,7 +88,27 @@ static int ensure_workresp_empty_slot(blocking_child *);
static int queue_req_pointer(blocking_child *, blocking_pipe_header *);
static void cleanup_after_child(blocking_child *);
+static sema_type worker_mmutex;
+static sem_ref worker_memlock;
+/* --------------------------------------------------------------------
+ * locking the global worker state table (and other global stuff)
+ */
+void
+worker_global_lock(
+ int inOrOut)
+{
+ if (worker_memlock) {
+ if (inOrOut)
+ wait_for_sem(worker_memlock, NULL);
+ else
+ tickle_sem(worker_memlock);
+ }
+}
+
+/* --------------------------------------------------------------------
+ * implementation isolation wrapper
+ */
void
exit_worker(
int exitcode
@@ -724,6 +744,9 @@ prepare_child_sems(
blocking_child *c
)
{
+ if (NULL == worker_memlock)
+ worker_memlock = create_sema(&worker_mmutex, 1, 1);
+
c->accesslock = create_sema(&c->sem_table[0], 1, 1);
c->workitems_pending = create_sema(&c->sem_table[1], 0, 0);
c->wake_scheduled_sleep = create_sema(&c->sem_table[2], 0, 1);
OpenPOWER on IntegriCloud