|
|
1.1 ! root 1: .TH NEWPROC 9.2 ! 2: .CT 2 proc_man ! 3: .SH NAME ! 4: P, newproc, muxnewwind, newwindow, tolayer, debug, getproc, getproctab, putname, getname \- jerq process control ! 5: .SH SYNOPSIS ! 6: .B #include <jerq.h> ! 7: .PP ! 8: .B extern struct Proc *P; ! 9: .PP ! 10: .B struct Proc *newproc(f) ! 11: .B void (*f)(); ! 12: .PP ! 13: .B struct Proc *newwindow(f); ! 14: .B void (*f)(); ! 15: .PP ! 16: .B void tolayer(l) ! 17: .B Layer *l; ! 18: .PP ! 19: .B void debug(); ! 20: .PP ! 21: .B struct Proc *getproc(); ! 22: .PP ! 23: .B struct Proc *getproctab(); ! 24: .PP ! 25: .B int putname(string, data) ! 26: .B char *string; long data; ! 27: .PP ! 28: .B struct Nqueue *getname(string) ! 29: .B char *string; ! 30: .PP ! 31: .B #include <msgs.h> ! 32: .br ! 33: .B void muxnewwind(p, c) ! 34: .B struct Proc *p; int c; ! 35: .SH DESCRIPTION ! 36: Processes in the jerq consist of a coroutine-style process ! 37: structure and an associated layer ! 38: (see ! 39: .IR newlayer (9.2)), ! 40: allocated independently. ! 41: This section describes the process allocation and control ! 42: primitives. ! 43: They are direct links to the system's own ! 44: control structures, so given ! 45: .IR mux 's ! 46: open addressing, they should be used with care. ! 47: .PP ! 48: Each process has a global variable ! 49: .I P ! 50: that points to its process structure. ! 51: The only regular use of ! 52: .I P ! 53: is to check that the process has been moved or reshaped: ! 54: .IP ! 55: .EX ! 56: if(P->state & RESHAPED){ ! 57: do_reshape(); ! 58: P->state &= ~RESHAPED; ! 59: } ! 60: .EE ! 61: .PP ! 62: The definition of ! 63: .B struct Proc ! 64: is in the include file ! 65: .BR <jerqproc.h> , ! 66: which is included automatically by ! 67: .BR <jerq.h> . ! 68: .PP ! 69: .I Newproc ! 70: allocates a new process, returning a pointer to it, or 0 ! 71: if one cannot be allocated. ! 72: Argument ! 73: .I f ! 74: points to the program text to be executed. ! 75: The special case ! 76: .IR f =0 ! 77: creates a process running the default terminal program, ! 78: and is almost always how ! 79: .I newproc ! 80: should be called; use ! 81: .IR 32ld (9.1) ! 82: to run non-standard programs. ! 83: A process is disabled by setting ! 84: .I p->state ! 85: to zero. ! 86: After calling ! 87: .IR newproc, ! 88: the process must be bound to a layer and ! 89: Unix told of its presence, typically as: ! 90: .IP ! 91: .EX ! 92: struct Proc *p; ! 93: Rectangle r; ! 94: p = newproc((struct Proc *)0); ! 95: if(p == 0) ! 96: error(); ! 97: p->layer = newlayer(r); ! 98: if(p->layer == 0){ ! 99: p->state = 0; ! 100: error(); ! 101: } ! 102: p->rect = r; ! 103: muxnewwind(p, C_NEW); ! 104: .EE ! 105: .PP ! 106: The second argument to ! 107: .I muxnewwind ! 108: should be ! 109: .B C_RESHAPE ! 110: if an existing process is being given a new layer. ! 111: If the process is ! 112: .I not ! 113: running the default terminal program, its variables ! 114: .L display ! 115: and ! 116: .L Drect ! 117: must be set: ! 118: .IP ! 119: .EX ! 120: struct udata *u=((struct udata *)p->data); ! 121: u->Drect=p->rect; ! 122: u->Jdisplayp=p->layer; ! 123: .EE ! 124: This procedure works regardless of whether the process being manipulated is itself. ! 125: .PP ! 126: .I Newwindow ! 127: creates a process by the above procedure, going through the ! 128: standard user interface to select the rectangle for the process's ! 129: layer. ! 130: .PP ! 131: .I Tolayer ! 132: takes an argument ! 133: .I layer ! 134: pointer and makes the process in that layer the receiver of ! 135: mouse and keyboard events. ! 136: .PP ! 137: .I Getproc ! 138: presents the user with a gunsight cursor and returns the ! 139: address of the process whose layer is indicated with the mouse. ! 140: .I Getproctab ! 141: simply returns the address of the base of the process table array. ! 142: This is an array of ! 143: .B NPROC ! 144: process structures. ! 145: .B NPROC ! 146: is stored in the word immediately lower in address than the ! 147: process table. ! 148: .PP ! 149: .I Debug ! 150: announces to the system that the calling process is prepared ! 151: to handle exceptions by other processes. ! 152: .PP ! 153: .I Putname ! 154: and ! 155: .I getname ! 156: manage a bulletin board for interprocess communication. ! 157: Further communication may be arranged through shared memory. ! 158: .I Putname ! 159: associates ! 160: .I data ! 161: with ! 162: .I string, ! 163: returning nonzero normally, or 0 if the data could not be stored. ! 164: .I Getname ! 165: returns a pointer ! 166: to a structure which contains ! 167: .TP ! 168: .B struct Proc *proc ! 169: pointer to the process structure of the layer that ! 170: most recently announced the string ! 171: .TP ! 172: .B long data ! 173: the corresponding data ! 174: .LP ! 175: .I Getname ! 176: returns 0 if no such string has been announced. ! 177: A pointer returned by ! 178: .I getname ! 179: remains valid: a client may rendezvous with a server by ! 180: calling ! 181: .I getname ! 182: once and repeatedly testing ! 183: the associated ! 184: .B proc ! 185: pointer thereafter. ! 186: .SH BUGS ! 187: These primitives are awkward at best, and are ! 188: subject to change. ! 189: .br ! 190: Creating a process without a layer or ! 191: .I ! 192: vice versa ! 193: is dangerous.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.