Replaced REVIVE and select/notify with alert and DEV_STATUS.
This commit is contained in:
parent
3292badc37
commit
92d44e8108
2 changed files with 157 additions and 46 deletions
|
@ -89,8 +89,9 @@ FORWARD _PROTOTYPE ( int sr_restart_ioctl, (sr_fd_t *fdp) );
|
|||
FORWARD _PROTOTYPE ( int sr_cancel, (message *m) );
|
||||
#ifndef __minix_vmd /* Minix 3 */
|
||||
FORWARD _PROTOTYPE ( int sr_select, (message *m) );
|
||||
FORWARD _PROTOTYPE ( void sr_status, (message *m) );
|
||||
#endif
|
||||
FORWARD _PROTOTYPE ( void sr_reply, (mq_t *m, int reply, int can_enqueue) );
|
||||
FORWARD _PROTOTYPE ( void sr_reply_, (mq_t *m, int reply, int is_revive) );
|
||||
FORWARD _PROTOTYPE ( sr_fd_t *sr_getchannel, (int minor));
|
||||
FORWARD _PROTOTYPE ( acc_t *sr_get_userdata, (int fd, vir_bytes offset,
|
||||
vir_bytes count, int for_ioctl) );
|
||||
|
@ -103,7 +104,7 @@ FORWARD _PROTOTYPE (void sr_select_res, (int fd, unsigned ops) );
|
|||
#endif
|
||||
FORWARD _PROTOTYPE ( int sr_repl_queue, (int proc, int ref, int operation) );
|
||||
FORWARD _PROTOTYPE ( int walk_queue, (sr_fd_t *sr_fd, mq_t *q_head,
|
||||
mq_t **q_tail_ptr, int type, int proc_nr, int ref) );
|
||||
mq_t **q_tail_ptr, int type, int proc_nr, int ref, int first_flag) );
|
||||
FORWARD _PROTOTYPE ( void process_req_q, (mq_t *mq, mq_t *tail,
|
||||
mq_t **tail_ptr) );
|
||||
FORWARD _PROTOTYPE ( void sr_event, (event_t *evp, ev_arg_t arg) );
|
||||
|
@ -131,6 +132,11 @@ mq_t *m;
|
|||
int result;
|
||||
int send_reply, free_mess;
|
||||
|
||||
#if 0
|
||||
if (m->mq_mess.m_source == FS_PROC_NR)
|
||||
printf("sr_rec: got type %d from FS\n", m->mq_mess.m_type);
|
||||
#endif
|
||||
|
||||
if (repl_queue)
|
||||
{
|
||||
if (m->mq_mess.m_type == DEV_CANCEL)
|
||||
|
@ -148,8 +154,10 @@ mq_t *m;
|
|||
return; /* canceled request in queue */
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
else
|
||||
sr_repl_queue(ANY, 0, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
switch (m->mq_mess.m_type)
|
||||
|
@ -190,6 +198,11 @@ mq_t *m;
|
|||
send_reply= 1;
|
||||
free_mess= 1;
|
||||
break;
|
||||
case DEV_STATUS:
|
||||
sr_status(&m->mq_mess);
|
||||
send_reply= 0;
|
||||
free_mess= 1;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
ip_panic(("unknown message, from %d, type %d",
|
||||
|
@ -197,7 +210,7 @@ mq_t *m;
|
|||
}
|
||||
if (send_reply)
|
||||
{
|
||||
sr_reply(m, result, FALSE);
|
||||
sr_reply_(m, result, FALSE /* !is_revive */);
|
||||
}
|
||||
if (free_mess)
|
||||
mq_free(m);
|
||||
|
@ -296,7 +309,7 @@ mq_t *m;
|
|||
{
|
||||
sr_fd_t *sr_fd;
|
||||
mq_t **q_head_ptr, **q_tail_ptr;
|
||||
int ip_flag, susp_flag;
|
||||
int ip_flag, susp_flag, first_flag;
|
||||
int r;
|
||||
ioreq_t request;
|
||||
size_t size;
|
||||
|
@ -304,6 +317,10 @@ mq_t *m;
|
|||
sr_fd= sr_getchannel(m->mq_mess.NDEV_MINOR);
|
||||
assert (sr_fd);
|
||||
|
||||
#if 0
|
||||
printf("sr_rwio: for %d\n", m->mq_mess.NDEV_PROC);
|
||||
#endif
|
||||
|
||||
switch(m->mq_mess.m_type)
|
||||
{
|
||||
case DEV_READ:
|
||||
|
@ -311,18 +328,21 @@ mq_t *m;
|
|||
q_tail_ptr= &sr_fd->srf_read_q_tail;
|
||||
ip_flag= SFF_READ_IP;
|
||||
susp_flag= SFF_READ_SUSP;
|
||||
first_flag= SFF_READ_FIRST;
|
||||
break;
|
||||
case DEV_WRITE:
|
||||
q_head_ptr= &sr_fd->srf_write_q;
|
||||
q_tail_ptr= &sr_fd->srf_write_q_tail;
|
||||
ip_flag= SFF_WRITE_IP;
|
||||
susp_flag= SFF_WRITE_SUSP;
|
||||
first_flag= SFF_WRITE_FIRST;
|
||||
break;
|
||||
case DEV_IOCTL3:
|
||||
q_head_ptr= &sr_fd->srf_ioctl_q;
|
||||
q_tail_ptr= &sr_fd->srf_ioctl_q_tail;
|
||||
ip_flag= SFF_IOCTL_IP;
|
||||
susp_flag= SFF_IOCTL_SUSP;
|
||||
first_flag= SFF_IOCTL_FIRST;
|
||||
break;
|
||||
default:
|
||||
ip_panic(("illegal case entry"));
|
||||
|
@ -341,6 +361,8 @@ mq_t *m;
|
|||
|
||||
*q_tail_ptr= *q_head_ptr= m;
|
||||
sr_fd->srf_flags |= ip_flag;
|
||||
assert(!(sr_fd->srf_flags & first_flag));
|
||||
sr_fd->srf_flags |= first_flag;
|
||||
|
||||
switch(m->mq_mess.m_type)
|
||||
{
|
||||
|
@ -381,10 +403,15 @@ mq_t *m;
|
|||
ip_panic(("illegal case entry"));
|
||||
}
|
||||
|
||||
assert(sr_fd->srf_flags & first_flag);
|
||||
sr_fd->srf_flags &= ~first_flag;
|
||||
|
||||
assert(r == OK || r == SUSPEND ||
|
||||
(printf("r= %d\n", r), 0));
|
||||
if (r == SUSPEND)
|
||||
sr_fd->srf_flags |= susp_flag;
|
||||
else
|
||||
mq_free(m);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -491,7 +518,7 @@ message *m;
|
|||
{
|
||||
result= walk_queue(sr_fd, sr_fd->srf_ioctl_q,
|
||||
&sr_fd->srf_ioctl_q_tail, SR_CANCEL_IOCTL,
|
||||
proc_nr, ref);
|
||||
proc_nr, ref, SFF_IOCTL_FIRST);
|
||||
if (result != EAGAIN)
|
||||
return result;
|
||||
}
|
||||
|
@ -501,7 +528,7 @@ message *m;
|
|||
{
|
||||
result= walk_queue(sr_fd, sr_fd->srf_read_q,
|
||||
&sr_fd->srf_read_q_tail, SR_CANCEL_READ,
|
||||
proc_nr, ref);
|
||||
proc_nr, ref, SFF_READ_FIRST);
|
||||
if (result != EAGAIN)
|
||||
return result;
|
||||
}
|
||||
|
@ -511,7 +538,7 @@ message *m;
|
|||
{
|
||||
result= walk_queue(sr_fd, sr_fd->srf_write_q,
|
||||
&sr_fd->srf_write_q_tail, SR_CANCEL_WRITE,
|
||||
proc_nr, ref);
|
||||
proc_nr, ref, SFF_WRITE_FIRST);
|
||||
if (result != EAGAIN)
|
||||
return result;
|
||||
}
|
||||
|
@ -563,14 +590,80 @@ message *m;
|
|||
|
||||
return m_ops;
|
||||
}
|
||||
|
||||
PRIVATE void sr_status(m)
|
||||
message *m;
|
||||
{
|
||||
int fd, result;
|
||||
unsigned m_ops;
|
||||
sr_fd_t *sr_fd;
|
||||
mq_t *mq;
|
||||
|
||||
mq= repl_queue;
|
||||
if (mq != NULL)
|
||||
{
|
||||
repl_queue= mq->mq_next;
|
||||
|
||||
#if 0
|
||||
printf("sr_status: status %d for proc %d\n",
|
||||
mq->mq_mess.REP_STATUS, mq->mq_mess.REP_PROC_NR);
|
||||
#endif
|
||||
|
||||
PRIVATE int walk_queue(sr_fd, q_head, q_tail_ptr, type, proc_nr, ref)
|
||||
mq->mq_mess.m_type= DEV_REVIVE;
|
||||
result= send(mq->mq_mess.m_source, &mq->mq_mess);
|
||||
if (result != OK)
|
||||
ip_panic(("unable to send"));
|
||||
mq_free(mq);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
for (fd=0, sr_fd= sr_fd_table; fd<FD_NR; fd++, sr_fd++)
|
||||
{
|
||||
if ((sr_fd->srf_flags &
|
||||
(SFF_SELECT_R|SFF_SELECT_W|SFF_SELECT_X)) == 0)
|
||||
{
|
||||
/* Nothing to report */
|
||||
continue;
|
||||
}
|
||||
if (sr_fd->srf_select_proc != m->m_source)
|
||||
{
|
||||
/* Wrong process */
|
||||
continue;
|
||||
}
|
||||
|
||||
m_ops= 0;
|
||||
if (sr_fd->srf_flags & SFF_SELECT_R) m_ops |= SEL_RD;
|
||||
if (sr_fd->srf_flags & SFF_SELECT_W) m_ops |= SEL_WR;
|
||||
if (sr_fd->srf_flags & SFF_SELECT_X) m_ops |= SEL_ERR;
|
||||
|
||||
sr_fd->srf_flags &= ~(SFF_SELECT_R|SFF_SELECT_W|SFF_SELECT_X);
|
||||
|
||||
m->m_type= DEV_IO_READY;
|
||||
m->DEV_MINOR= fd;
|
||||
m->DEV_SEL_OPS= m_ops;
|
||||
|
||||
result= send(m->m_source, m);
|
||||
if (result != OK)
|
||||
ip_panic(("unable to send"));
|
||||
return;
|
||||
}
|
||||
|
||||
m->m_type= DEV_NO_STATUS;
|
||||
result= send(m->m_source, m);
|
||||
if (result != OK)
|
||||
ip_panic(("unable to send"));
|
||||
}
|
||||
#endif
|
||||
|
||||
PRIVATE int walk_queue(sr_fd, q_head, q_tail_ptr, type, proc_nr, ref,
|
||||
first_flag)
|
||||
sr_fd_t *sr_fd;
|
||||
mq_t *q_head, **q_tail_ptr;
|
||||
int type;
|
||||
int proc_nr;
|
||||
int ref;
|
||||
int first_flag;
|
||||
{
|
||||
mq_t *q_ptr_prv, *q_ptr;
|
||||
int result;
|
||||
|
@ -586,8 +679,15 @@ int ref;
|
|||
#endif
|
||||
if (!q_ptr_prv)
|
||||
{
|
||||
assert(!(sr_fd->srf_flags & first_flag));
|
||||
sr_fd->srf_flags |= first_flag;
|
||||
|
||||
result= (*sr_fd->srf_cancel)(sr_fd->srf_fd, type);
|
||||
assert(result == OK);
|
||||
|
||||
assert(sr_fd->srf_flags & first_flag);
|
||||
sr_fd->srf_flags &= ~first_flag;
|
||||
|
||||
return OK;
|
||||
}
|
||||
q_ptr_prv->mq_next= q_ptr->mq_next;
|
||||
|
@ -615,10 +715,10 @@ int minor;
|
|||
return loc_fd;
|
||||
}
|
||||
|
||||
PRIVATE void sr_reply (mq, status, can_enqueue)
|
||||
PRIVATE void sr_reply_(mq, status, is_revive)
|
||||
mq_t *mq;
|
||||
int status;
|
||||
int can_enqueue;
|
||||
int is_revive;
|
||||
{
|
||||
int result, proc, ref,operation;
|
||||
message reply, *mp;
|
||||
|
@ -634,7 +734,11 @@ int can_enqueue;
|
|||
assert(operation != DEV_CANCEL);
|
||||
#endif
|
||||
|
||||
if (can_enqueue)
|
||||
#if 0
|
||||
printf("sr_reply: for %d, is_revive = %d\n", proc, is_revive);
|
||||
#endif
|
||||
|
||||
if (is_revive)
|
||||
mp= &mq->mq_mess;
|
||||
else
|
||||
mp= &reply;
|
||||
|
@ -646,8 +750,15 @@ int can_enqueue;
|
|||
mp->REP_REF= ref;
|
||||
mp->REP_OPERATION= operation;
|
||||
#endif
|
||||
result= send(mq->mq_mess.m_source, mp);
|
||||
if (result == ELOCKED && can_enqueue)
|
||||
if (is_revive)
|
||||
{
|
||||
alert(mq->mq_mess.m_source);
|
||||
result= ELOCKED;
|
||||
}
|
||||
else
|
||||
result= send(mq->mq_mess.m_source, mp);
|
||||
|
||||
if (result == ELOCKED && is_revive)
|
||||
{
|
||||
mq->mq_next= NULL;
|
||||
if (repl_queue)
|
||||
|
@ -659,7 +770,7 @@ int can_enqueue;
|
|||
}
|
||||
if (result != OK)
|
||||
ip_panic(("unable to send"));
|
||||
if (can_enqueue)
|
||||
if (is_revive)
|
||||
mq_free(mq);
|
||||
}
|
||||
|
||||
|
@ -671,9 +782,8 @@ int for_ioctl;
|
|||
{
|
||||
sr_fd_t *loc_fd;
|
||||
mq_t **head_ptr, *m, *mq;
|
||||
int ip_flag, susp_flag;
|
||||
int result;
|
||||
int suspended;
|
||||
int ip_flag, susp_flag, first_flag;
|
||||
int result, suspended, is_revive;
|
||||
char *src;
|
||||
acc_t *acc;
|
||||
event_t *evp;
|
||||
|
@ -687,6 +797,7 @@ int for_ioctl;
|
|||
evp= &loc_fd->srf_ioctl_ev;
|
||||
ip_flag= SFF_IOCTL_IP;
|
||||
susp_flag= SFF_IOCTL_SUSP;
|
||||
first_flag= SFF_IOCTL_FIRST;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -694,6 +805,7 @@ int for_ioctl;
|
|||
evp= &loc_fd->srf_write_ev;
|
||||
ip_flag= SFF_WRITE_IP;
|
||||
susp_flag= SFF_WRITE_SUSP;
|
||||
first_flag= SFF_WRITE_FIRST;
|
||||
}
|
||||
|
||||
assert (loc_fd->srf_flags & ip_flag);
|
||||
|
@ -704,7 +816,8 @@ assert (loc_fd->srf_flags & ip_flag);
|
|||
mq= m->mq_next;
|
||||
*head_ptr= mq;
|
||||
result= (int)offset;
|
||||
sr_reply (m, result, 1);
|
||||
is_revive= !(loc_fd->srf_flags & first_flag);
|
||||
sr_reply_(m, result, is_revive);
|
||||
suspended= (loc_fd->srf_flags & susp_flag);
|
||||
loc_fd->srf_flags &= ~(ip_flag|susp_flag);
|
||||
if (suspended)
|
||||
|
@ -733,9 +846,8 @@ int for_ioctl;
|
|||
{
|
||||
sr_fd_t *loc_fd;
|
||||
mq_t **head_ptr, *m, *mq;
|
||||
int ip_flag, susp_flag;
|
||||
int result;
|
||||
int suspended;
|
||||
int ip_flag, susp_flag, first_flag;
|
||||
int result, suspended, is_revive;
|
||||
char *dst;
|
||||
event_t *evp;
|
||||
ev_arg_t arg;
|
||||
|
@ -748,6 +860,7 @@ int for_ioctl;
|
|||
evp= &loc_fd->srf_ioctl_ev;
|
||||
ip_flag= SFF_IOCTL_IP;
|
||||
susp_flag= SFF_IOCTL_SUSP;
|
||||
first_flag= SFF_IOCTL_FIRST;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -755,6 +868,7 @@ int for_ioctl;
|
|||
evp= &loc_fd->srf_read_ev;
|
||||
ip_flag= SFF_READ_IP;
|
||||
susp_flag= SFF_READ_SUSP;
|
||||
first_flag= SFF_READ_FIRST;
|
||||
}
|
||||
|
||||
assert (loc_fd->srf_flags & ip_flag);
|
||||
|
@ -765,7 +879,8 @@ int for_ioctl;
|
|||
mq= m->mq_next;
|
||||
*head_ptr= mq;
|
||||
result= (int)offset;
|
||||
sr_reply (m, result, 1);
|
||||
is_revive= !(loc_fd->srf_flags & first_flag);
|
||||
sr_reply_(m, result, is_revive);
|
||||
suspended= (loc_fd->srf_flags & susp_flag);
|
||||
loc_fd->srf_flags &= ~(ip_flag|susp_flag);
|
||||
if (suspended)
|
||||
|
@ -789,25 +904,15 @@ PRIVATE void sr_select_res(fd, ops)
|
|||
int fd;
|
||||
unsigned ops;
|
||||
{
|
||||
unsigned m_ops;
|
||||
sr_fd_t *sr_fd;
|
||||
message m;
|
||||
|
||||
sr_fd= &sr_fd_table[fd];
|
||||
|
||||
m_ops= 0;
|
||||
if (ops & SR_SELECT_READ) m_ops |= SEL_RD;
|
||||
if (ops & SR_SELECT_WRITE) m_ops |= SEL_WR;
|
||||
if (ops & SR_SELECT_EXCEPTION) m_ops |= SEL_ERR;
|
||||
if (ops & SR_SELECT_READ) sr_fd->srf_flags |= SFF_SELECT_R;
|
||||
if (ops & SR_SELECT_WRITE) sr_fd->srf_flags |= SFF_SELECT_W;
|
||||
if (ops & SR_SELECT_EXCEPTION) sr_fd->srf_flags |= SFF_SELECT_X;
|
||||
|
||||
m.NOTIFY_TYPE= DEV_SELECTED;
|
||||
m.NOTIFY_ARG= fd;
|
||||
m.NOTIFY_FLAGS= m_ops;
|
||||
|
||||
printf("sr_select_res: notifying caller %d with ops 0%o\n",
|
||||
sr_fd->srf_select_proc, m_ops);
|
||||
|
||||
notify(sr_fd->srf_select_proc, &m);
|
||||
alert(sr_fd->srf_select_proc);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -29,17 +29,23 @@ typedef struct sr_fd
|
|||
event_t srf_write_ev;
|
||||
} sr_fd_t;
|
||||
|
||||
# define SFF_FREE 0x00
|
||||
# define SFF_MINOR 0x01
|
||||
# define SFF_INUSE 0x02
|
||||
#define SFF_BUSY 0x1C
|
||||
# define SFF_IOCTL_IP 0x04
|
||||
# define SFF_READ_IP 0x08
|
||||
# define SFF_WRITE_IP 0x10
|
||||
# define SFF_FREE 0x00
|
||||
# define SFF_MINOR 0x01
|
||||
# define SFF_INUSE 0x02
|
||||
#define SFF_BUSY 0x1C
|
||||
# define SFF_IOCTL_IP 0x04
|
||||
# define SFF_READ_IP 0x08
|
||||
# define SFF_WRITE_IP 0x10
|
||||
#define SFF_SUSPENDED 0x1C0
|
||||
# define SFF_IOCTL_SUSP 0x40
|
||||
# define SFF_READ_SUSP 0x80
|
||||
# define SFF_WRITE_SUSP 0x100
|
||||
# define SFF_IOCTL_SUSP 0x40
|
||||
# define SFF_READ_SUSP 0x80
|
||||
# define SFF_WRITE_SUSP 0x100
|
||||
#define SFF_IOCTL_FIRST 0x200
|
||||
#define SFF_READ_FIRST 0x400
|
||||
#define SFF_WRITE_FIRST 0x800
|
||||
#define SFF_SELECT_R 0x1000
|
||||
#define SFF_SELECT_W 0x2000
|
||||
#define SFF_SELECT_X 0x4000
|
||||
|
||||
EXTERN sr_fd_t sr_fd_table[FD_NR];
|
||||
|
||||
|
|
Loading…
Reference in a new issue