#ifndef lint static char sccsid[] = "@(#)monitor.c 9.2 88/01/19 Copyright 1987 Sun Micro"; #endif /* * Copyright (c) 1987 by Sun Microsystems, Inc. */ /*- Routines for dealing with PostScript monitors monitor.c, Wed Sep 24 10:33:35 1986 James Gosling, Sun Microsystems */ #ifdef REF #include #include #endif #include "PostScript.h" static createmonitor(ee) register struct execution_environment *ee; { register struct body *p = new_body(monitor); set_typed_bodied_object(ee->optop, monitor_type, p); p->type = monitor_type; p->body.monitor.holder = 0; p->body.monitor.first = 0; p->body.monitor.last = 0; p->body.monitor.reentry_depth = 0; ee->optop++; } static monitorlocked(ee) register struct execution_environment *ee; { register struct object *optop = ee->optop; register fract ret; if (optop[-1].type != monitor_type) { ee->error_code = typecheck_error_code; return; } ret = fracti(body_of(optop - 1)->body.monitor.holder != 0); decref(body_of(optop - 1)); set_typed_object(optop - 1, boolean_type); optop[-1].value.fixed = ret; return; } disentangle_monitor(ee, b) register struct execution_environment *ee; register struct body *b; { assert(b->type == monitor_type); if (ee == b->body.monitor.holder) { register struct execution_environment *new; assert(b->body.monitor.reentry_depth > 0); if (--b->body.monitor.reentry_depth == 0) { b->body.monitor.holder = 0; if (new = b->body.monitor.first) { b->body.monitor.first = new->next; new->next = 0; assert(new->event == monitor_wait); new->event = 0; enqueue_process(new); } } decref(b); } else if (ee->event == monitor_wait) { assert(body_of(&ee->pos->env.monitor) == b); if (b->body.monitor.first == ee) { b->body.monitor.first = ee->next; ee->next = 0; } else { register struct execution_environment *where; for (where = b->body.monitor.first; where && where->next != ee; where = where->next); assert(where); where->next = ee->next; ee->next = 0; if (ee = b->body.monitor.last) b->body.monitor.last = where; } decref(b); } } initialize_monitor() { define_operator("createmonitor", createmonitor, 0, 0, 1); define_operator("monitorlocked", monitorlocked, 0, 1, 1); }