made to work
This commit is contained in:
parent
d6c52e0fef
commit
5d861a3399
2 changed files with 33 additions and 1 deletions
|
@ -116,6 +116,13 @@ static int timeout();
|
||||||
|
|
||||||
int chan_any(c) register chan *c;
|
int chan_any(c) register chan *c;
|
||||||
{
|
{
|
||||||
|
#ifdef __BSD4_2
|
||||||
|
#include <fcntl.h>
|
||||||
|
#ifndef O_NDELAY
|
||||||
|
#define O_NDELAY FNDELAY
|
||||||
|
#endif
|
||||||
|
int flags;
|
||||||
|
#endif
|
||||||
switch (c->type) {
|
switch (c->type) {
|
||||||
case C_T_FILE:
|
case C_T_FILE:
|
||||||
if ((c->f.flgs&C_F_READAHEAD)!=0)
|
if ((c->f.flgs&C_F_READAHEAD)!=0)
|
||||||
|
@ -132,6 +139,24 @@ int chan_any(c) register chan *c;
|
||||||
deadlock=0;
|
deadlock=0;
|
||||||
/* No deadlock while waiting for key */
|
/* No deadlock while waiting for key */
|
||||||
|
|
||||||
|
/* Unfortunately, the mechanism that was used
|
||||||
|
here does not work on all Unix systems.
|
||||||
|
On BSD 4.2 and newer, the "read" is
|
||||||
|
automatically restarted. Therefore, on
|
||||||
|
these systems, we try it with non-blocking
|
||||||
|
reads
|
||||||
|
*/
|
||||||
|
#ifdef __BSD4_2
|
||||||
|
flags = fcntl(fileno(fp), F_GETFL, 0);
|
||||||
|
fcntl(fileno(fp), F_SETFL, flags | O_NDELAY);
|
||||||
|
errno = 0;
|
||||||
|
ch = getc(fp);
|
||||||
|
fcntl(fileno(fp), F_SETFL, flags);
|
||||||
|
if (errno == EWOULDBLOCK) {
|
||||||
|
clearerr(fp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#else
|
||||||
signal(SIGALRM, timeout);
|
signal(SIGALRM, timeout);
|
||||||
alarm(1);
|
alarm(1);
|
||||||
|
|
||||||
|
@ -141,8 +166,11 @@ int chan_any(c) register chan *c;
|
||||||
signal(SIGALRM, SIG_IGN);
|
signal(SIGALRM, SIG_IGN);
|
||||||
alarm(0);
|
alarm(0);
|
||||||
|
|
||||||
if (errno==EINTR)
|
if (errno==EINTR) {
|
||||||
|
clearerr(fp);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
else {
|
else {
|
||||||
if (!feof(fp)) {
|
if (!feof(fp)) {
|
||||||
c->f.flgs|=C_F_READAHEAD;
|
c->f.flgs|=C_F_READAHEAD;
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
exp $top_save
|
exp $top_save
|
||||||
pro $top_save, 0
|
pro $top_save, 0
|
||||||
|
mes 11
|
||||||
loe 0
|
loe 0
|
||||||
lae 4 ; load line number and file name
|
lae 4 ; load line number and file name
|
||||||
loi EM_PSIZE
|
loi EM_PSIZE
|
||||||
|
@ -37,11 +38,14 @@
|
||||||
|
|
||||||
exp $top_load
|
exp $top_load
|
||||||
pro $top_load, 0
|
pro $top_load, 0
|
||||||
|
mes 11
|
||||||
lal 0
|
lal 0
|
||||||
loi EM_PSIZE
|
loi EM_PSIZE
|
||||||
dup EM_PSIZE
|
dup EM_PSIZE
|
||||||
loi EM_PSIZE
|
loi EM_PSIZE
|
||||||
sti EM_PSIZE ; copy pointer from argument 0 to new frame
|
sti EM_PSIZE ; copy pointer from argument 0 to new frame
|
||||||
|
lal 0
|
||||||
|
loi EM_PSIZE
|
||||||
loi EM_PSIZE ; load indirect to
|
loi EM_PSIZE ; load indirect to
|
||||||
str 1 ; restore SP
|
str 1 ; restore SP
|
||||||
dup EM_PSIZE ; givesargument 0 again
|
dup EM_PSIZE ; givesargument 0 again
|
||||||
|
|
Loading…
Reference in a new issue