|
|
1.1 root 1: ; Copyright Barbara Liskov 1985
2:
3: x_buf = cluster is init,
4: get, send_data, send_array, flush, receive, receive_data,
5: events,
6: get_lp0, get_lp1, get_lp2, get_lp3,
7: get_sp0, get_sp1, get_sp2, get_sp3, get_sp4, get_sp5,
8: get_bp10, get_bp11
9:
10: rep = null
11:
12: bufsize = 2048
13:
14: rsize = 24
15:
16: x_err = -1
17: x_reply = 0
18:
19: ExposeWindow = #0080
20: ExposeRegion = #0100
21: ExposeCopy = #0200
22: UnmapWindow = #2000
23: FocusChange = #4000
24:
25: rcode = 16
26: parms = 20
27:
28: sock_stream = 1
29: %fionread = #4004,,#667f
30:
31: wvec ev {11}
32: wvec wbuf {4}
33: wvec pbuf {5}
34: wvec obuf {513}
35: wvec ibuf {10}
36: wvec padbuf {1}
37:
38: own bufptr
39: own bufmin
40: own bufmax
41: own reqcount
42:
43: init = proc (addr: _wordvec) signals (error(string))
44: movl pbuf,pp
45: movl 3,(pp)
46: movzwl 4(rr),4(pp)
47: movq sock_stream,8(pp)
48: chmk %socket
49: bcs death
50: movl n0,r1
51: movl r1,4(pp)
52: addl 4,rr,8(pp)
53: movzwl (rr),12(pp)
54: ifcs chmk %connect
55: then movl n0,n1
56: movl 1,(pp)
57: chmk %close
58: movl n1,n0
59: death: _erstr(n0)
60: signal error(rr)
61: end
62: movl wbuf,n1
63: movl 3,(n1)
64: movl r1,4(n1)
65: movl ibuf,n1
66: movl 3,(n1)
67: movl r1,4(n1)
68: addl rcode,n1,8(n1)
69: movl rsize,12(n1)
70: movl pbuf,n1
71: movl 3,(n1)
72: movl r1,4(n1)
73: movl %fionread,8(n1)
74: addl 16,n1,12(n1)
75: clrl reqcount
76: subl 4,obuf,bufmin
77: movl bufmin,bufptr
78: addl bufmin,bufsize,bufmax
79: movl 10,@ev
80: end init
81:
82: get = qproc () returns (oreq, ereq)
83: movl bufptr,rr
84: addl rsize,bufptr
85: ifgtr cmpl bufptr,bufmax
86: then movl wbuf,pp
87: movl obuf,8(pp)
88: subl bufmin,rr,12(pp)
89: qloop
90: chmk %write
91: bcs oops
92: addl n0,8(pp)
93: subl n0,12(pp)
94: bneq this
95: end
96: movl bufmin,rr
97: addl rsize,rr,bufptr
98: end
99: movl (sp),pp
100: addl 2,rr,(sp)
101: incl reqcount
102: jmp (pp)
103: oops: pushl ep
104: movl sp,ep
105: _erstr(n0)
106: movl (sp)+,ep
107: signal failure(rr)
108: end get
109:
110: send_data = qproc (b: _bytevec, strt, z: int)
111: movq strt,r1
112: movzwl (r2),n1
113: if sobgeq r1,next
114: then
115: bnds: signal failure("unhandled exception: bounds")
116: end
117: iflss cmpl r1,n1
118: then tstl rr
119: bleq check
120: addl r1,rr,n0
121: cmpl n0,n1
122: bgtr bnds
123: addl 3,rr
124: bicb 3,rr
125: movl bufptr,r3
126: addl rr,r3,r4
127: ifleq cmpl r4,bufmax
128: then movc rr,4(r2)[r1],4(r3)
129: movl r4,bufptr
130: return
131: end
132: movl wbuf,pp
133: movl obuf,8(pp)
134: subl bufmin,r3,12(pp)
135: qloop
136: chmk %write
137: bcs oops
138: addl n0,8(pp)
139: subl n0,12(pp)
140: bneq this
141: end
142: movl bufmin,bufptr
143: movab 4(r2)[r1],8(pp)
144: movl rr,12(pp)
145: qloop
146: chmk %write
147: bcs oops
148: addl n0,8(pp)
149: subl n0,12(pp)
150: bneq this
151: end
152: return
153: end
154: bgtr bnds
155: check: tstl rr
156: bneq bnds
157: return
158: oops: pushl ep
159: movl sp,ep
160: pushl rr
161: _erstr(n0)
162: movl (sp)+,rr
163: movl (sp)+,ep
164: signal failure(rr)
165: end send_data
166:
167: send_array = qproc (a: array[char], strt, z: int)
168: ifleq tstl rr
169: then ifeql
170: then return
171: end
172: bnds: signal failure("unhandled exception: bounds")
173: end
174: movq strt,r1
175: subl dv%low(r2),r1
176: cmpl r1,dv%size(r2)
177: bgtru bnds
178: addl rr,r1,n3
179: cmpl n3,dv%size(r2)
180: bgtr bnds
181: moval @dv%rel(r2)[r1],n3
182: addl 3,rr
183: bicb 3,rr
184: movl bufptr,r3
185: addl rr,r3,r4
186: ifgtr cmpl r4,bufmax
187: then movl wbuf,pp
188: movl obuf,8(pp)
189: subl bufmin,r3,12(pp)
190: qloop
191: chmk %write
192: bcs oops
193: addl n0,8(pp)
194: subl n0,12(pp)
195: bneq this
196: end
197: movl bufmin,r3
198: end
199: addl 4,r3
200: qloop
201: cvtlb (n3)+,(r3)+
202: sobgtr rr,this
203: end
204: subl 4,r3,bufptr
205: return
206: oops: pushl ep
207: movl sp,ep
208: pushl rr
209: _erstr(n0)
210: movl (sp)+,rr
211: movl (sp)+,ep
212: signal failure(rr)
213: end send_array
214:
215: flush = qproc ()
216: ifgtr cmpl bufptr,obuf
217: then movl wbuf,pp
218: movl obuf,8(pp)
219: subl bufmin,bufptr,12(pp)
220: qloop
221: chmk %write
222: bcs oops
223: addl n0,8(pp)
224: subl n0,12(pp)
225: bneq this
226: end
227: movl bufmin,bufptr
228: end
229: return
230: oops: pushl ep
231: movl sp,ep
232: _erstr(n0)
233: movl (sp)+,ep
234: signal failure(rr)
235: end flush
236:
237: receive = proc () signals (error(string))
238: ifgtr cmpl bufptr,obuf
239: then movl wbuf,pp
240: movl obuf,8(pp)
241: subl bufmin,bufptr,12(pp)
242: qloop
243: chmk %write
244: bcs oops
245: addl n0,8(pp)
246: subl n0,12(pp)
247: bneq this
248: end
249: movl bufmin,bufptr
250: end
251: loop
252: movl ibuf,pp
253: chmk %read
254: bcs oops
255: cmpl n0,rsize
256: bneq bad
257: ifeql tstl rcode(pp)
258: then return
259: end
260: ifneq cmpl rcode(pp),x_err
261: then x_buf$%enq()
262: continue
263: end
264: cvtbl parms+4(pp),-(sp)
265: pushl parms+0(pp)
266: cvtbl parms+5(pp),-(sp)
267: cvtbl parms+6(pp),-(sp)
268: movl parms+8(pp),rr
269: ifeql cmpl parms+0(pp),reqcount
270: then x_erstr(*, *, *, *, *)
271: signal error(rr)
272: end
273: x_erstr(*, *, *, *, *)
274: x_error(rr)
275: end
276: oops: _erstr(n0)
277: signal failure(rr)
278: bad: signal failure("incomplete message received")
279: end receive
280:
281: receive_data = proc (b: _bytevec)
282: movl wbuf,pp
283: addl 4,rr,8(pp)
284: movzwl (rr),12(pp)
285: qloop
286: chmk %read
287: bcs oops
288: addl n0,8(pp)
289: subl n0,12(pp)
290: bneq this
291: end
292: ifneq bicl -4,(rr),n0
293: then subl n0,4,12(pp)
294: movl padbuf,8(pp)
295: qloop
296: chmk %read
297: bcs oops
298: addl n0,8(pp)
299: subl n0,12(pp)
300: bneq this
301: end
302: end
303: return
304: oops: _erstr(n0)
305: signal failure(rr)
306: end receive_data
307:
308: events = proc (need: bool)
309: var cnt
310: ifgtr cmpl bufptr,obuf
311: then movl wbuf,pp
312: movl obuf,8(pp)
313: subl bufmin,bufptr,12(pp)
314: qloop
315: chmk %write
316: bcs oops
317: addl n0,8(pp)
318: subl n0,12(pp)
319: bneq this
320: end
321: movl bufmin,bufptr
322: end
323: loop
324: again: movl pbuf,pp
325: chmk %ioctl
326: bcs oops
327: ifeql movl 16(pp),cnt
328: then movl need,cnt
329: beql next
330: end
331: clrl need
332: qloop
333: movl ibuf,pp
334: chmk %read
335: bcs oops
336: ifneq cmpl n0,rsize
337: then signal failure("incomplete message received")
338: end
339: ifeql tstl rcode(pp)
340: then signal failure("protocol screwup")
341: end
342: ifeql cmpl rcode(pp),x_err
343: then cvtbl parms+4(pp),-(sp)
344: pushl parms+0(pp)
345: cvtbl parms+5(pp),-(sp)
346: cvtbl parms+6(pp),-(sp)
347: movl parms+8(pp),rr
348: x_erstr(*, *, *, *, *)
349: x_error(rr)
350: br again
351: end
352: x_buf$%enq()
353: subl rsize,cnt
354: bgtr this
355: end
356: end
357: return
358: oops: _erstr(n0)
359: signal failure(rr)
360: end events
361:
362: %enq = proc ()
363: movl ibuf,pp
364: movl ev,rr
365: movl rcode(pp),4(rr)
366: movl parms+0(pp),24(rr)
367: movl parms+12(pp),12(rr)
368: movzwl parms+6(pp),20(rr)
369: ifneq bitw ExposeWindow+ExposeRegion,rcode(pp)
370: then cvtwl parms+8(pp),32(rr)
371: cvtwl parms+10(pp),40(rr)
372: cvtwl parms+16(pp),36(rr)
373: cvtwl parms+18(pp),28(rr)
374: elfeql bitw UnmapWindow+FocusChange+ExposeCopy,rcode(pp)
375: then clrb 21(rr)
376: movzwl parms+4(pp),16(rr)
377: movzwl parms+6(pp),8(rr)
378: clrb 8(rr)
379: cvtwl parms+8(pp),28(rr)
380: cvtwl parms+10(pp),36(rr)
381: cvtwl parms+16(pp),40(rr)
382: cvtwl parms+18(pp),32(rr)
383: end
384: x_input$enq(rr)
385: end %enq
386:
387: get_lp0 = qproc () returns (int)
388: movl ibuf,rr
389: movl parms+0(rr),rr
390: return(rr)
391: end get_lp0
392:
393: get_lp1 = qproc () returns (int)
394: movl ibuf,rr
395: movl parms+4(rr),rr
396: return(rr)
397: end get_lp1
398:
399: get_lp2 = qproc () returns (int)
400: movl ibuf,rr
401: movl parms+8(rr),rr
402: return(rr)
403: end get_lp2
404:
405: get_lp3 = qproc () returns (int)
406: movl ibuf,rr
407: movl parms+12(rr),rr
408: return(rr)
409: end get_lp3
410:
411: get_sp0 = qproc () returns (int)
412: movl ibuf,rr
413: cvtwl parms+0(rr),rr
414: return(rr)
415: end get_sp0
416:
417: get_sp1 = qproc () returns (int)
418: movl ibuf,rr
419: cvtwl parms+2(rr),rr
420: return(rr)
421: end get_sp1
422:
423: get_sp2 = qproc () returns (int)
424: movl ibuf,rr
425: cvtwl parms+4(rr),rr
426: return(rr)
427: end get_sp2
428:
429: get_sp3 = qproc () returns (int)
430: movl ibuf,rr
431: cvtwl parms+6(rr),rr
432: return(rr)
433: end get_sp3
434:
435: get_sp4 = qproc () returns (int)
436: movl ibuf,rr
437: cvtwl parms+8(rr),rr
438: return(rr)
439: end get_sp4
440:
441: get_sp5 = qproc () returns (int)
442: movl ibuf,rr
443: cvtwl parms+10(rr),rr
444: return(rr)
445: end get_sp5
446:
447: get_bp10 = qproc () returns (int)
448: movl ibuf,rr
449: cvtbl parms+10(rr),rr
450: return(rr)
451: end get_bp10
452:
453: get_bp11 = qproc () returns (int)
454: movl ibuf,rr
455: cvtbl parms+11(rr),rr
456: return(rr)
457: end get_bp11
458:
459: end x_buf
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.