48
48
* Get IOP capability, and enable the server
50
50
if (AuServerHostName == NULL)
51
FatalError("No hostname, no screen\n");
51
FatalError("No hostname, no screen\n");
52
52
sprintf(host, "%s/%s/%s", HOST_DIR, AuServerHostName, DEF_IOPSVRNAME);
53
53
if ((err = name_lookup(host, &iopcap)) != STD_OK)
54
FatalError("Cannot find IOP server %s: %s\n", host, err_why(err));
54
FatalError("Cannot find IOP server %s: %s\n", host, err_why(err));
57
57
* Enable IOP server
59
59
if ((err = iop_enable(&iopcap)) != STD_OK)
60
FatalError("iop_enable failed (%s)\n", err_why(err));
60
FatalError("iop_enable failed (%s)\n", err_why(err));
63
63
* Start IOP reader thread
65
65
atexit(IOPCleanUp);
66
66
if (thread_newthread(IOPServerReader, DEVREADER_STACK, 0, 0) <= 0)
67
FatalError("Cannot start IOP reader thread\n");
67
FatalError("Cannot start IOP reader thread\n");
91
IOPEvent queue[MAXEVENTQUEUE-1];
91
IOPEvent queue[MAXEVENTQUEUE - 1];
95
95
WaitForInitialization();
98
if (amDebug) ErrorF("IOPServerReader() running ...\n");
99
ErrorF("IOPServerReader() running ...\n");
103
nevents = MAXEVENTQUEUE - 1;
104
err = iop_getevents(&iopcap, queue, &nevents);
106
if (err != RPC_FAILURE) {
107
ErrorF("iop_getevents failed (%s)\n", err_why(err));
111
} while (nevents <= 0);
104
nevents = MAXEVENTQUEUE - 1;
105
err = iop_getevents(&iopcap, queue, &nevents);
107
if (err != RPC_FAILURE) {
108
ErrorF("iop_getevents failed (%s)\n", err_why(err));
112
} while (nevents <= 0);
113
/* store event(s) in the global event queue */
114
sema_mdown(&empty, nevents);
116
for (i = 0; i < nevents; i++) {
117
event_queue[event_qin] = queue[i];
118
event_qin = (event_qin + 1) % MAXEVENTQUEUE;
121
sema_mup(&filled, nevents);
114
/* store event(s) in the global event queue */
115
sema_mdown(&empty, nevents);
117
for (i = 0; i < nevents; i++) {
118
event_queue[event_qin] = queue[i];
119
event_qin = (event_qin + 1) % MAXEVENTQUEUE;
122
sema_mup(&filled, nevents);
141
142
AmoebaGetEvents(queue, size)
147
if (sema_level(&filled) <= 0) return 0;
148
if (sema_level(&filled) <= 0)
148
150
if ((nevents = sema_level(&filled)) > size)
150
152
sema_mdown(&filled, nevents);
152
154
for (i = 0; i < nevents; i++) {
153
queue[i] = event_queue[event_qout];
154
event_qout = (event_qout + 1) % MAXEVENTQUEUE;
155
queue[i] = event_queue[event_qout];
156
event_qout = (event_qout + 1) % MAXEVENTQUEUE;
156
158
mu_unlock(&lock);
157
159
sema_mup(&empty, nevents);
160
162
#endif /* AMOEBA */