FS understanding revives and selects as alerts (new notifies)
This commit is contained in:
parent
dd7220f234
commit
08934187c9
4 changed files with 71 additions and 28 deletions
|
@ -5,6 +5,7 @@
|
||||||
* dev_open: FS opens a device
|
* dev_open: FS opens a device
|
||||||
* dev_close: FS closes a device
|
* dev_close: FS closes a device
|
||||||
* dev_io: FS does a read or write on a device
|
* dev_io: FS does a read or write on a device
|
||||||
|
* dev_status: FS processes callback request alert
|
||||||
* gen_opcl: generic call to a task to perform an open/close
|
* gen_opcl: generic call to a task to perform an open/close
|
||||||
* gen_io: generic call to a task to perform an I/O operation
|
* gen_io: generic call to a task to perform an I/O operation
|
||||||
* no_dev: open/close processing for devices that don't exist
|
* no_dev: open/close processing for devices that don't exist
|
||||||
|
@ -62,6 +63,47 @@ dev_t dev; /* device to close */
|
||||||
(void) (*dmap[(dev >> MAJOR) & BYTE].dmap_opcl)(DEV_CLOSE, dev, 0, 0);
|
(void) (*dmap[(dev >> MAJOR) & BYTE].dmap_opcl)(DEV_CLOSE, dev, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*===========================================================================*
|
||||||
|
* dev_status *
|
||||||
|
*===========================================================================*/
|
||||||
|
PUBLIC void dev_status(message *m)
|
||||||
|
{
|
||||||
|
message st;
|
||||||
|
int d, get_more = 1;
|
||||||
|
|
||||||
|
for(d = 0; d < NR_DEVICES; d++)
|
||||||
|
if(dmap[d].dmap_driver == m->m_source)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(d >= NR_DEVICES)
|
||||||
|
return;
|
||||||
|
|
||||||
|
do {
|
||||||
|
int r;
|
||||||
|
st.m_type = DEV_STATUS;
|
||||||
|
if((r=sendrec(m->m_source, &st)) != OK)
|
||||||
|
panic(__FILE__,"couldn't sendrec for DEV_STATUS", r);
|
||||||
|
|
||||||
|
switch(st.m_type) {
|
||||||
|
case DEV_REVIVE:
|
||||||
|
revive(st.REP_PROC_NR, st.REP_STATUS);
|
||||||
|
break;
|
||||||
|
case DEV_IO_READY:
|
||||||
|
select_notified(d, st.DEV_MINOR, st.DEV_SEL_OPS);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("FS: unrecognized reply %d to DEV_STATUS\n", st.m_type);
|
||||||
|
/* Fall through. */
|
||||||
|
case DEV_NO_STATUS:
|
||||||
|
get_more = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while(get_more);
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
* dev_io *
|
* dev_io *
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
|
@ -274,8 +316,8 @@ message *mess_ptr; /* pointer to message for task */
|
||||||
|
|
||||||
proc_nr = mess_ptr->PROC_NR;
|
proc_nr = mess_ptr->PROC_NR;
|
||||||
if (! isokprocnr(proc_nr)) {
|
if (! isokprocnr(proc_nr)) {
|
||||||
printf("FS: warning, got illegal process number from %d.\n",
|
printf("FS: warning, got illegal process number (%d) from %d\n",
|
||||||
mess_ptr->PROC_NR);
|
mess_ptr->PROC_NR, mess_ptr->m_source);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,11 +362,6 @@ message *mess_ptr; /* pointer to message for task */
|
||||||
/* Did the process we did the sendrec() for get a result? */
|
/* Did the process we did the sendrec() for get a result? */
|
||||||
if (mess_ptr->REP_PROC_NR == proc_nr) {
|
if (mess_ptr->REP_PROC_NR == proc_nr) {
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
if(mess_ptr->m_type == DEV_SELECTED) {
|
|
||||||
/* select() became possible.. This can happen. */
|
|
||||||
select_notified(mess_ptr);
|
|
||||||
} else if(mess_ptr->m_type == REVIVE) {
|
} else if(mess_ptr->m_type == REVIVE) {
|
||||||
/* Otherwise it should be a REVIVE. */
|
/* Otherwise it should be a REVIVE. */
|
||||||
revive(mess_ptr->REP_PROC_NR, mess_ptr->REP_STATUS);
|
revive(mess_ptr->REP_PROC_NR, mess_ptr->REP_STATUS);
|
||||||
|
@ -333,7 +370,7 @@ message *mess_ptr; /* pointer to message for task */
|
||||||
"fs: strange device reply from %d, type = %d, proc = %d (2)\n",
|
"fs: strange device reply from %d, type = %d, proc = %d (2)\n",
|
||||||
mess_ptr->m_source,
|
mess_ptr->m_source,
|
||||||
mess_ptr->m_type, mess_ptr->REP_PROC_NR);
|
mess_ptr->m_type, mess_ptr->REP_PROC_NR);
|
||||||
continue; /* XXX should this be a continue?? */
|
continue; /* XXX ? */
|
||||||
}
|
}
|
||||||
|
|
||||||
r = receive(task_nr, mess_ptr);
|
r = receive(task_nr, mess_ptr);
|
||||||
|
@ -437,3 +474,4 @@ int flags; /* mode bits and flags */
|
||||||
}
|
}
|
||||||
return(dev_mess.REP_STATUS);
|
return(dev_mess.REP_STATUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -74,8 +74,10 @@ PUBLIC void main()
|
||||||
*/
|
*/
|
||||||
fs_expire_timers(m_in.NOTIFY_TIMESTAMP);
|
fs_expire_timers(m_in.NOTIFY_TIMESTAMP);
|
||||||
} else if (call_nr == DEV_SELECTED) {
|
} else if (call_nr == DEV_SELECTED) {
|
||||||
/* Device notify()s us of fd that has become usable. */
|
printf("Old select device callback received - ignored\n");
|
||||||
select_notified(&m_in);
|
} else if ((call_nr & NOTIFY_MESSAGE)) {
|
||||||
|
/* Device notifies (alert()s) us of an event. */
|
||||||
|
dev_status(&m_in);
|
||||||
} else {
|
} else {
|
||||||
/* Call the internal function that does the work. */
|
/* Call the internal function that does the work. */
|
||||||
if (call_nr < 0 || call_nr >= NCALLS) {
|
if (call_nr < 0 || call_nr >= NCALLS) {
|
||||||
|
|
|
@ -41,6 +41,7 @@ _PROTOTYPE( int clone_opcl, (int op, Dev_t dev, int proc, int flags) );
|
||||||
_PROTOTYPE( void ctty_io, (int task_nr, message *mess_ptr) );
|
_PROTOTYPE( void ctty_io, (int task_nr, message *mess_ptr) );
|
||||||
_PROTOTYPE( int do_ioctl, (void) );
|
_PROTOTYPE( int do_ioctl, (void) );
|
||||||
_PROTOTYPE( int do_setsid, (void) );
|
_PROTOTYPE( int do_setsid, (void) );
|
||||||
|
_PROTOTYPE( void dev_status, (message *) );
|
||||||
|
|
||||||
/* dmp.c */
|
/* dmp.c */
|
||||||
_PROTOTYPE( int do_fkey_pressed, (void) );
|
_PROTOTYPE( int do_fkey_pressed, (void) );
|
||||||
|
@ -185,7 +186,7 @@ _PROTOTYPE( int select_callback, (struct filp *, int ops) );
|
||||||
_PROTOTYPE( void select_forget, (int fproc) );
|
_PROTOTYPE( void select_forget, (int fproc) );
|
||||||
_PROTOTYPE( void select_timeout_check, (timer_t *) );
|
_PROTOTYPE( void select_timeout_check, (timer_t *) );
|
||||||
_PROTOTYPE( void init_select, (void) );
|
_PROTOTYPE( void init_select, (void) );
|
||||||
_PROTOTYPE( int select_notified, (message *) );
|
_PROTOTYPE( int select_notified, (int major, int minor, int ops) );
|
||||||
|
|
||||||
/* timers.c */
|
/* timers.c */
|
||||||
_PROTOTYPE( void fs_set_timer, (timer_t *tp, int delta, tmr_func_t watchdog, int arg));
|
_PROTOTYPE( void fs_set_timer, (timer_t *tp, int delta, tmr_func_t watchdog, int arg));
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
* make select cancel disappearing fp's
|
* make select cancel disappearing fp's
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define DEBUG_SELECT 0
|
#define DEBUG_SELECT 1
|
||||||
|
|
||||||
#include "fs.h"
|
#include "fs.h"
|
||||||
#include "dmap.h"
|
#include "dmap.h"
|
||||||
|
@ -553,47 +553,49 @@ PUBLIC int select_callback(struct filp *fp, int ops)
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
* int select_notified *
|
* int select_notified *
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
PUBLIC int select_notified(message *m)
|
PUBLIC int select_notified(int major, int minor, int selected_ops)
|
||||||
{
|
{
|
||||||
int s, f, d, t;
|
int s, f, t;
|
||||||
|
|
||||||
for(d = 0; d < NR_DEVICES; d++)
|
#if DEBUG_SELECT
|
||||||
if(dmap[d].dmap_driver == m->m_source)
|
printf("select callback: %d, %d: %d\n", major, minor, selected_ops);
|
||||||
break;
|
#endif
|
||||||
|
|
||||||
if(d >= NR_DEVICES)
|
|
||||||
return OK;
|
|
||||||
|
|
||||||
for(t = 0; t < SEL_FDS; t++)
|
for(t = 0; t < SEL_FDS; t++)
|
||||||
if(!fdtypes[t].select_match && fdtypes[t].select_major == d)
|
if(!fdtypes[t].select_match && fdtypes[t].select_major == major)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if(t >= SEL_FDS)
|
if(t >= SEL_FDS) {
|
||||||
|
#if DEBUG_SELECT
|
||||||
|
printf("select callback: no fdtype found for device %d\n", major);
|
||||||
|
#endif
|
||||||
return OK;
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
/* We have a select callback from major device no.
|
/* We have a select callback from major device no.
|
||||||
* d, which corresponds to our select type t.
|
* d, which corresponds to our select type t.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for(s = 0; s < MAXSELECTS; s++) {
|
for(s = 0; s < MAXSELECTS; s++) {
|
||||||
int line, ops;
|
int s_minor, ops;
|
||||||
if(!selecttab[s].requestor)
|
if(!selecttab[s].requestor)
|
||||||
continue;
|
continue;
|
||||||
for(f = 0; f < selecttab[s].nfds; f++) {
|
for(f = 0; f < selecttab[s].nfds; f++) {
|
||||||
if(!selecttab[s].filps[f] ||
|
if(!selecttab[s].filps[f] ||
|
||||||
!select_major_match(d, selecttab[s].filps[f]))
|
!select_major_match(major, selecttab[s].filps[f]))
|
||||||
continue;
|
continue;
|
||||||
ops = tab2ops(f, &selecttab[s]);
|
ops = tab2ops(f, &selecttab[s]);
|
||||||
line = selecttab[s].filps[f]->filp_ino->i_zone[0] & BYTE;
|
s_minor = selecttab[s].filps[f]->filp_ino->i_zone[0] & BYTE;
|
||||||
if((line == m->NOTIFY_ARG) &&
|
if((s_minor == minor) &&
|
||||||
(m->NOTIFY_FLAGS & ops)) {
|
(selected_ops & ops)) {
|
||||||
select_callback(selecttab[s].filps[f], ops);
|
select_callback(selecttab[s].filps[f], (selected_ops & ops));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
* init_select *
|
* init_select *
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
|
|
Loading…
Reference in a new issue