|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24: /* IOStubThread.m 1.0 02/04/91 (c) 1991 NeXT
25: *
26: * IOStubThread.m - IOStub Device Thread support.
27: *
28: * HISTORY
29: * 04-Feb-91 Doug Mitchell at NeXT
30: * Created.
31: */
32:
33: #import <bsd/sys/types.h>
34: #import <mach/cthreads.h>
35: #import <driverkit/IODevice.h>
36: #import "IOStub.h"
37: #import "IOStubThread.h"
38: #import "IOStubDevice.h"
39: #import "IOStubUxpr.h"
40: #import <bsd/libc.h>
41: #import <machkit/NXLock.h>
42:
43: @implementation IOStub(Thread)
44:
45: /*
46: * Enqueue an IOBuf on IOQueue and wake up anyone who might be waiting
47: * for something to do.
48: */
49: - (void)enqueueIoBuf : (IOBuf_t *)buf
50: {
51: xpr_stub("enqueueIoBuf: IOBuf 0x%x\n", buf, 2,3,4,5);
52: [ioQLock lock];
53: queue_enter(&ioQueue, buf, IOBuf_t *, link);
54: [ioQLock unlockWith:WORK_AVAILABLE];
55: }
56:
57: /*
58: * Get an IOBuf from ioQueue. Blocks if necessary.
59: */
60: - (IOBuf_t *)dequeueIoBuf
61: {
62: IOBuf_t *buf;
63:
64: xpr_stub("dequeueIoBuf: entry\n", 1,2,3,4,5);
65: [ioQLock lockWhen:WORK_AVAILABLE];
66: buf = (IOBuf_t *)queue_first(&ioQueue);
67: queue_remove(&ioQueue, buf, IOBuf_t *, link);
68: if(queue_empty(&ioQueue))
69: [ioQLock unlockWith:NO_WORK_AVAILABLE];
70: else
71: [ioQLock unlockWith:WORK_AVAILABLE];
72: return buf;
73: }
74:
75: @end
76:
77: /*
78: * I/O thread. This handles IOBufs which have been enqueued by
79: * exported methods (like read: and write:).
80: *
81: * This thread merely loops doing the following:
82: * -- get an IOBuf off of the IOQueue.
83: * -- perform the task specified.
84: * -- if async request, ioComplete: the result, else
85: * condition_signal() the waiting thread.
86: */
87:
88: volatile void IOStub_thread(IOStub *stubId)
89: {
90: IOBuf_t *IOBuf;
91:
92: xpr_stub("IOStub_thread: starting\n", 1,2,3,4,5);
93: while(1) {
94: IOBuf = [stubId dequeueIoBuf];
95: xpr_stub("IOStub_thread: IOBuf 0x%x received\n", IOBuf,
96: 2,3,4,5);
97:
98: switch(IOBuf->cmd) {
99: case STUB_READ:
100: [stubId deviceRead:IOBuf];
101: break;
102: case STUB_WRITE:
103: [stubId deviceWrite:IOBuf];
104: break;
105: case STUB_ZERO:
106: [stubId deviceZero:IOBuf];
107: break;
108: case STUB_ABORT:
109: /*
110: * I/O complete this request before we die.
111: */
112: [IOBuf->waitLock unlockWith:YES];
113: IOExitThread();
114: break;
115: }
116: }
117: /* NOT REACHED */
118: }
119:
120: /* end of IOThread.m */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.