KERNEL - has_pending() not exposed
- has_pending() takes a special argument that tells the code whether we are scanning for asynchronous message or something else. - has_pending() is not used directly anymore - the new functions are wrappings around has_pending() to make the use more comfortable. - these functions should become static inline eventually
This commit is contained in:
parent
8d0a1f71bf
commit
e4d46a2146
3 changed files with 35 additions and 12 deletions
|
@ -702,7 +702,7 @@ endpoint_t src_dst_e; /* src or dst process */
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
* has_pending *
|
* has_pending *
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
PUBLIC int has_pending(sys_map_t *map, int src_p)
|
PRIVATE int has_pending(sys_map_t *map, int src_p, int asynm)
|
||||||
{
|
{
|
||||||
/* Check to see if there is a pending message from the desired source
|
/* Check to see if there is a pending message from the desired source
|
||||||
* available.
|
* available.
|
||||||
|
@ -734,6 +734,33 @@ PUBLIC int has_pending(sys_map_t *map, int src_p)
|
||||||
return(id);
|
return(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*===========================================================================*
|
||||||
|
* has_pending_notify *
|
||||||
|
*===========================================================================*/
|
||||||
|
PUBLIC int has_pending_notify(struct proc * caller, int src_p)
|
||||||
|
{
|
||||||
|
sys_map_t * map = &priv(caller)->s_notify_pending;
|
||||||
|
return has_pending(map, src_p, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================*
|
||||||
|
* has_pending_asend *
|
||||||
|
*===========================================================================*/
|
||||||
|
PUBLIC int has_pending_asend(struct proc * caller, int src_p)
|
||||||
|
{
|
||||||
|
sys_map_t * map = &priv(caller)->s_asyn_pending;
|
||||||
|
return has_pending(map, src_p, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================*
|
||||||
|
* unset_notify_pending *
|
||||||
|
*===========================================================================*/
|
||||||
|
PUBLIC void unset_notify_pending(struct proc * caller, int src_p)
|
||||||
|
{
|
||||||
|
sys_map_t * map = &priv(caller)->s_notify_pending;
|
||||||
|
unset_sys_bit(*map, src_p);
|
||||||
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
* mini_send *
|
* mini_send *
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
|
@ -844,7 +871,6 @@ PRIVATE int mini_receive(struct proc * caller_ptr,
|
||||||
* is available block the caller.
|
* is available block the caller.
|
||||||
*/
|
*/
|
||||||
register struct proc **xpp;
|
register struct proc **xpp;
|
||||||
sys_map_t *map;
|
|
||||||
int r, src_id, src_proc_nr, src_p;
|
int r, src_id, src_proc_nr, src_p;
|
||||||
|
|
||||||
assert(!(caller_ptr->p_misc_flags & MF_DELIVERMSG));
|
assert(!(caller_ptr->p_misc_flags & MF_DELIVERMSG));
|
||||||
|
@ -871,10 +897,9 @@ PRIVATE int mini_receive(struct proc * caller_ptr,
|
||||||
|
|
||||||
/* Check if there are pending notifications, except for SENDREC. */
|
/* Check if there are pending notifications, except for SENDREC. */
|
||||||
if (! (caller_ptr->p_misc_flags & MF_REPLY_PEND)) {
|
if (! (caller_ptr->p_misc_flags & MF_REPLY_PEND)) {
|
||||||
map = &priv(caller_ptr)->s_notify_pending;
|
|
||||||
|
|
||||||
/* Check for pending notifications */
|
/* Check for pending notifications */
|
||||||
if ((src_id = has_pending(map, src_p)) != NULL_PRIV_ID) {
|
if ((src_id = has_pending_notify(caller_ptr, src_p)) != NULL_PRIV_ID) {
|
||||||
endpoint_t hisep;
|
endpoint_t hisep;
|
||||||
|
|
||||||
src_proc_nr = id_to_nr(src_id); /* get source proc */
|
src_proc_nr = id_to_nr(src_id); /* get source proc */
|
||||||
|
@ -883,7 +908,7 @@ PRIVATE int mini_receive(struct proc * caller_ptr,
|
||||||
printf("mini_receive: sending notify from NONE\n");
|
printf("mini_receive: sending notify from NONE\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
unset_sys_bit(*map, src_id); /* no longer pending */
|
unset_notify_pending(caller_ptr, src_id); /* no longer pending */
|
||||||
|
|
||||||
/* Found a suitable source, deliver the notification message. */
|
/* Found a suitable source, deliver the notification message. */
|
||||||
hisep = proc_addr(src_proc_nr)->p_endpoint;
|
hisep = proc_addr(src_proc_nr)->p_endpoint;
|
||||||
|
@ -902,9 +927,7 @@ PRIVATE int mini_receive(struct proc * caller_ptr,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for pending asynchronous messages */
|
/* Check for pending asynchronous messages */
|
||||||
map = &priv(caller_ptr)->s_asyn_pending;
|
if (has_pending_asend(caller_ptr, src_p) != NULL_PRIV_ID) {
|
||||||
|
|
||||||
if (has_pending(map, src_p) != NULL_PRIV_ID) {
|
|
||||||
if (src_p != ANY)
|
if (src_p != ANY)
|
||||||
r = try_one(proc_addr(src_p), caller_ptr);
|
r = try_one(proc_addr(src_p), caller_ptr);
|
||||||
else
|
else
|
||||||
|
|
|
@ -47,8 +47,10 @@ _PROTOTYPE( void bsp_finish_booting, (void) );
|
||||||
|
|
||||||
_PROTOTYPE( int do_ipc, (reg_t r1, reg_t r2, reg_t r3) );
|
_PROTOTYPE( int do_ipc, (reg_t r1, reg_t r2, reg_t r3) );
|
||||||
_PROTOTYPE( void proc_init, (void) );
|
_PROTOTYPE( void proc_init, (void) );
|
||||||
_PROTOTYPE( int has_pending, (sys_map_t *map, int src_p) );
|
|
||||||
_PROTOTYPE( int cancel_async, (struct proc *src, struct proc *dst) );
|
_PROTOTYPE( int cancel_async, (struct proc *src, struct proc *dst) );
|
||||||
|
_PROTOTYPE( int has_pending_notify, (struct proc * caller, int src_p) );
|
||||||
|
_PROTOTYPE( int has_pending_asend, (struct proc * caller, int src_p) );
|
||||||
|
_PROTOTYPE( void unset_notify_pending, (struct proc * caller, int src_p));
|
||||||
_PROTOTYPE( int mini_notify, (const struct proc *src, endpoint_t dst) );
|
_PROTOTYPE( int mini_notify, (const struct proc *src, endpoint_t dst) );
|
||||||
_PROTOTYPE( void enqueue, (struct proc *rp) );
|
_PROTOTYPE( void enqueue, (struct proc *rp) );
|
||||||
_PROTOTYPE( void dequeue, (struct proc *rp) );
|
_PROTOTYPE( void dequeue, (struct proc *rp) );
|
||||||
|
|
|
@ -554,12 +554,10 @@ int caller_ret; /* code to return on callers */
|
||||||
/* Clear IPC references for a given process slot. */
|
/* Clear IPC references for a given process slot. */
|
||||||
struct proc *rp; /* iterate over process table */
|
struct proc *rp; /* iterate over process table */
|
||||||
int src_id;
|
int src_id;
|
||||||
sys_map_t *map;
|
|
||||||
|
|
||||||
/* Tell processes that sent asynchronous messages to 'rc' they are not
|
/* Tell processes that sent asynchronous messages to 'rc' they are not
|
||||||
* going to be delivered */
|
* going to be delivered */
|
||||||
map = &priv(rc)->s_asyn_pending;
|
while ((src_id = has_pending_asend(rc, ANY)) != NULL_PRIV_ID)
|
||||||
while ((src_id = has_pending(map, ANY)) != NULL_PRIV_ID)
|
|
||||||
cancel_async(proc_addr(id_to_nr(src_id)), rc);
|
cancel_async(proc_addr(id_to_nr(src_id)), rc);
|
||||||
|
|
||||||
for (rp = BEG_PROC_ADDR; rp < END_PROC_ADDR; rp++) {
|
for (rp = BEG_PROC_ADDR; rp < END_PROC_ADDR; rp++) {
|
||||||
|
|
Loading…
Reference in a new issue