|
|
1.1 root 1: .ds ZZ DEVELOPMENT PACKAGE
2: .TH RESOURCES 3R "630 MTG"
3: .XE "request()"
4: .XE "own()"
5: .XE "wait()"
6: .XE "alarm()"
7: .SH NAME
8: resources: request, own, wait, alarm \- routines dealing with resources
9: .SH SYNOPSIS
10: .ft B
11: #include <dmd.h>
12: .sp
13: int request (r)
14: .sp
15: int own ( )
16: .sp
17: int wait (r)
18: .sp
19: void alarm (t)
20: .sp
21: int r;
22: .br
23: unsigned t;
24: .SH DESCRIPTION
25: The above routines deal with the following 630 MTG resources:
26: .PP
27: .PD 0
28: .TP 15
29: .B KBD
30: characters received from the 630 MTG keyboard
31: .TP
32: .B SEND
33: send characters from the 630 MTG to the host
34: .TP
35: .B MOUSE
36: mouse buttons and cursor position
37: .TP
38: .B RCV
39: characters received by 630 MTG from host process
40: .TP
41: .B PSEND
42: send characters to the printer
43: .TP
44: .B CPU
45: 630 MTG cpu
46: .TP
47: .B ALARM
48: alarm has "fired"
49: .TP
50: .B RESHAPED
51: window has been reshaped or moved
52: .TP
53: .B DELETE
54: application is being deleted
55: .TP
56: .B MSG
57: state of message queues has changed
58: .PD
59: .PP
60: .I Request
61: announces a program's intent to use one or more resources
62: and is usually called once early in the program.
63: The
64: .B r
65: argument is a bit vector indicating which resources are being requested.
66: Compose
67: .B r
68: by using the bitwise inclusive OR operator of the
69: above resources (\&\s-1MOUSE\s+1\^|\^\s-1KBD\s+1 means
70: you are referring to the mouse and keyboard resources).
71: .I Request
72: returns a bit vector that indicates those resources for which the request
73: succeeded.
74: .PP
75: Note that if a program calls
76: .I request
77: several times,
78: each \f2request\f1 overrides all previously
79: .IR request ed
80: resources. This means that a resource previously
81: .IR request ed,
82: but not specified in the latest call to
83: .I request ,
84: will no longer be available to the application program.
85: .PP
86: If the keyboard is not requested,
87: characters typed will be sent to the host.
88: If the mouse is not requested,
89: mouse events in the application's window will be interpreted by
90: the terminal's control process (the terminal's control process is the
91: process that displays
92: the main button 3 menu and makes windows top and current when pointed
93: to by button 1).
94: \s-1SEND\s+1 and \s-1CPU\s+1 are always implicitly
95: .IR request ed.
96: .PP
97: A request of \s-1PSEND\s+1 will fail if
98: another application program has already requested it. Currently, \s-1PSEND\s+1
99: is the only resource that may fail a request.
100: \s-1PSEND\s+1 must be requested and owned before sending characters to the
101: printer.
102: .PP
103: Requesting the \s-1DELETE\s+1 resource tells the terminal's control process
104: to not allow a user to delete the applications window from the main button 3
105: menu. Rather, the control process sets a flag which causes
106: \fIown()&\s-1DELETE\s+1\fR to be true. This is intended for
107: use by applications which need to perform some type of cleanup before being
108: deleted. When \fIown()&\s-1DELETE\s+1\fR becomes true, it is the responsibility
109: of the application to perform its cleanup and delete itself (see example below).
110: .PP
111: The
112: .I own
113: function
114: returns a bit vector indicating which resources are ready to be serviced.
115: .SK
116: .PP
117: The
118: .I wait
119: function
120: suspends the application, enabling others to run,
121: until at least one of the resources in the bit vector \fIr\fR
122: is ready for service.
123: The return value is a bit vector indicating which resources are
124: ready for service.
125: Applications wishing to give up the processor to enable other applications to
126: run may call
127: \f2wait\f3(\s-1CPU\s+1)\f1.
128: In this case,
129: .I wait
130: will always return as soon as all other applications have had a chance to run.
131: .PP
132: The
133: .I alarm
134: function
135: starts a timer which will ``fire''
136: .B t
137: ticks (60ths of a second) in the future.
138: Calling
139: .I alarm
140: implicitly \fIrequest\fRs the
141: .B \s-1ALARM\s+1 .
142: The resource
143: .B \s-1ALARM\s+1
144: can be used to check the status of the timer.
145: The
146: \fIown\fR( ) \fB\s-1&ALARM\s+1\f1
147: call
148: will indicate whether or not the alarm timer has fired.
149: A
150: \fIwait\fR(ALARM) call allows the application to give up the CPU
151: until the specified number of ticks has elapsed.
152: An
153: \fIalarm\fR(0)
154: call cancels a previous call to \fIalarm\fR.
155: .PP
156: An
157: .I alarm
158: call
159: does not interfere with
160: .I sleep
161: and vice versa.
162: .PP
163: The call \fIwait\fR (RESHAPED) will suspend the application until the
164: application's window has been either moved or reshaped. The MOVED and
165: RESHAPED bits of the application's state variable (\fIP->state\fR) can be read to determine
166: which of the two has occurred. If the window was moved, both the MOVED and
167: RESHAPED bits are set; only the RESHAPED bit is set if the window was
168: reshaped. The application is responsible for
169: clearing the state variable MOVED and RESHAPED bits regardless of whether
170: they are read or not. Subsequent \fIwait\fR (RESHAPED) calls will return
171: immediately if the application has not cleared the MOVED and RESHAPED bits.
172: RESHAPED is always implicitly requested.
173: .PP
174: The call \fIwait\fR (MSG) will suspend the application until the state of
175: any of the message queues associated with the application changes. A list
176: of message queue identifiers is maintained for each application. A message
177: queue identifier is entered into this list during a call by the
178: application to the function msgget when either a message queue is
179: created or an identifier for an existing message queue is retrieved.
180: Once added to this list, a message queue identifier is
181: removed from the list only when the message queue is deleted. The message
182: queue can be deleted by any running application with a call to the function msgctl or
183: is deleted automatically if it was created with the NO_SAVE option and the
184: creating application is deleted or exits.
185: .PP
186: The function calls \fIown\fR(MSG) and \fIwait\fR(MSG) will return the MSG
187: bit true in the returned bit vector
188: after any of three state changes occur to any of the message queues
189: associated with the application: 1) a message queue when
190: added to the application's list already has one or more messages on it,
191: 2) a message is received at a message queue, or 3) a
192: message queue on the list is deleted.
193: This condition remains true until cleared by a call to the function msgctl
194: to examine a message queue or by a call to the function msgrcv to receive
195: a message from a queue.
196: Note that several applications may simultaneously be waiting for the same
197: message queue.
198: If a message arrives at the queue, all of the waiting applications will be
199: restarted.
200: If the first application that is restarted removes the arrived message from
201: the queue and does not replace it back on the queue with a call to the function
202: msgsnd, the other applications that were waiting will find no message when they
203: are restarted.
204: Similarly, an application may find no message queue when it is restarted if
205: the queue was deleted by another application.
206: If an application sends a message to a message queue that is on its
207: own message queue list, the wait condition becomes true for it also.
208: .SH EXAMPLE
209: The following program fragment shows how an application
210: can give up button 3 processing
211: to the terminal's control process. This is how applications who request the
212: mouse but do not use button 3 can let the main button 3 menu be displayed.
213: .PP
214: Note that the \f(CWsleep(2)\fR below is necessary because the terminal's
215: control process
216: runs only once every tick (60th of a second) of the realtime clock.
217: .PP
218: .RS 3
219: .nf
220: .ft CM
221: #include <dmd.h>
222:
223: main()
224: {
225: int r;
226:
227: r = request (\s-1MOUSE\s+1);
228: if (button3()){
229: request (r & ~\s-1MOUSE\s+1); /* release the mouse */
230: sleep (2);/* sleep(2) because the control process */
231: /* only runs once every clock tick */
232: request (r);
233: }
234: }
235: \fR
236: .fi
237: .RE
238: .PP
239: The following program shows how to use the \s-1DELETE\s+1 resource.
240: This program will ring the terminals bell before it is deleted.
241: Typically, rather than ringing the bell, some application specific
242: cleanup would be performed.
243: .PP
244: .RS 3
245: .nf
246: .ft CM
247: #include <dmd.h>
248:
249: main()
250: {
251: request(DELETE|MOUSE);
252:
253: for(;;) {
254: wait(DELETE|MOUSE);
255: if(own()&DELETE) {
256: ringbell(); /* usually some cleanup */
257: delete(); /* delete me */
258: }
259: }
260: }
261: \fR
262: .fi
263: .RE
264: .PP
265: The following code fragment shows how to use the RESHAPED resource. Upon
266: return from \fIwait\fR it tests the state variable to determine if the
267: window was moved or reshaped. Depending on which occurred, an appropriate
268: flag is set and the state variable is cleared.
269: .PP
270: .RS 3
271: .nf
272: .ft CM
273: #include <dmd.h>
274: .
275: .
276: int moved=0;
277: int reshaped=0;
278: .
279: .
280: wait(RESHAPED);
281: if (P->state&MOVED) {
282: moved++;
283: P->state &= ~(MOVED|RESHAPED);
284: }
285: else if ((P->state&RESHAPED) && !(P->state&MOVED)) {
286: reshaped++;
287: P->state &= ~RESHAPED;
288: }
289: .
290: .
291: \fR
292: .fi
293: .RE
294: .SH SEE ALSO
295: msgctl(3L), msgget(3L), msgop(3L), sleep(3R), state(3R).
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.