/* rywait.c - ROSY: wait */
static char *rcsid
= "$Header: /f/osi/rosy/RCS/rywait.c,v 7.4 91/02/22 09:42:07 mrose Interim $";
* $Header: /f/osi/rosy/RCS/rywait.c,v 7.4 91/02/22 09:42:07 mrose Interim $
* Revision 7.4 91/02/22 09:42:07 mrose
* Revision 7.3 90/12/23 18:42:50 mrose
* Revision 7.2 90/07/09 14:48:09 mrose
* Revision 7.1 90/07/01 21:06:41 mrose
* Revision 7.0 89/11/23 22:22:05 mrose
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
return rosaplose (roi, ROS_PARAMETER, NULLCP, \
"mandatory parameter \"%s\" missing", "p"); \
int RyWait (sd
, id
, out
, secs
, roi
)
struct RoSAPindication
*roi
;
register struct opsblk
*opb
;
if ((opb
= findopblk (sd
, *id
, OPB_INITIATOR
)) == NULLOPB
)
return rosaplose (roi
, ROS_PARAMETER
, NULLCP
,
"invocation %d not in progress on association %d",
if (out
&& opb
&& (opb
-> opb_flags
& OPB_EVENT
)) {
*roi
= opb
-> opb_event
; /* struct copy */
switch (result
= RoWaitRequest (sd
, secs
, roi
)) {
reason
= roi
-> roi_preject
.rop_reason
;
loseopblk (sd
, ROS_IP_RELEASE
);
result
= RyWaitAux (sd
, opb
, out
, secs
, roi
);
result
= rosaplose (roi
, ROS_PROTOCOL
, NULLCP
,
"unknown return from RoWaitRequest=%d", result
);
int RyWaitAux (sd
, opb
, out
, secs
, roi
)
register struct opsblk
*opb
;
struct RoSAPindication
*roi
;
register struct dspblk
*dsb
;
register struct opsblk
*op2
;
register struct RyError
**rye
;
register struct RyOperation
*ryo
;
switch (roi
-> roi_type
) {
register struct RoSAPinvoke
*rox
= &roxs
;
*rox
= roi
-> roi_invoke
; /* struct copy */
if (op2
= findopblk (sd
, rox
-> rox_id
, OPB_RESPONDER
)) {
(void) rosaplose (roi
, result
= ROS_IP_DUP
, NULLCP
,
"duplicate invocation %d", rox
-> rox_id
);
(void) RoURejectRequest (sd
, &rox
-> rox_id
, result
,
if ((dsb
= finddsblk (sd
, rox
-> rox_op
)) == NULLDSB
&& (dsb
= finddsblk (NOTOK
, rox
-> rox_op
))
(void) rosaplose (roi
, result
= ROS_IP_UNRECOG
, NULLCP
,
"unexpected invocation %d of operation %d",
rox
-> rox_id
, rox
-> rox_op
);
if (!ryo
-> ryo_arg_mod
) { /* XXX: MISTYPED? */
if (!ryo
-> ryo_arg_decode
) { /* XXX: MISTYPED? */
(void) rosaplose (roi
, result
= ROS_IP_MISTYPED
,
"unexpected argument for invocation %d of operation %s/%d",
rox
-> rox_id
, ryo
-> ryo_name
, ryo
-> ryo_op
);
if (dec_f (ryo
-> ryo_arg_index
, ryo
-> ryo_arg_mod
,
rox
-> rox_args
, 1, NULLIP
, NULLVP
, &in
)
if ((*ryo
-> ryo_arg_decode
) (rox
-> rox_args
, 1, NULLIP
,
(void) rosaplose (roi
, result
= ROS_IP_MISTYPED
,
"mistyped argument for invocation %d of operation %s/%d [%s]",
rox
-> rox_id
, ryo
-> ryo_name
, ryo
-> ryo_op
,
if (ryo
-> ryo_result
|| ryo
-> ryo_errors
) {
if ((op2
= newopblk (sd
, rox
-> rox_id
)) == NULLOPB
) {
(void) rosaplose (roi
, result
= ROS_IP_LIMIT
, NULLCP
,
"unable to allocate opblock for invocation %d of operation %s/%d",
rox
-> rox_id
, ryo
-> ryo_name
, ryo
-> ryo_op
);
op2
-> opb_flags
&= ~OPB_INITIATOR
;
op2
-> opb_flags
|= OPB_RESPONDER
;
result
= (*dsb
-> dsb_vector
) (sd
, ryo
, rox
, in
, roi
);
if (in
&& ryo
-> ryo_arg_mod
)
-> md_dtab
[ryo
-> ryo_arg_index
],
if (in
&& ryo
-> ryo_arg_free
)
(void) (*ryo
-> ryo_arg_free
) (in
);
result
= rosaplose (roi
, ROS_PROTOCOL
, NULLCP
,
"%s invoke dispatch for invoke id %d returns %d",
ryo
-> ryo_name
, rox
-> rox_id
, result
);
register struct RoSAPresult
*ror
= &roi
-> roi_result
;
if ((op2
= findopblk (sd
, ror
-> ror_id
, OPB_INITIATOR
))
|| (op2
-> opb_flags
& OPB_EVENT
)) {
(void) RoURejectRequest (sd
, &ror
-> ror_id
,
ROS_RRP_UNRECOG
, ROS_NOPRIO
, roi
);
if (!ryo
-> ryo_result
) {
if (ryo
-> ryo_res_mod
) { /* XXX: MISTYPED? */
if (ryo
-> ryo_res_decode
) { /* XXX: MISTYPED? */
if (!ror
-> ror_result
) {
result
= ROS_RRP_MISTYPED
;
result
= dec_f (ryo
-> ryo_res_index
,
ryo
-> ryo_res_mod
, ror
-> ror_result
,
1, NULLIP
, NULLVP
, &op2
-> opb_out
);
op2
-> opb_free_index
= ryo
-> ryo_res_index
;
op2
-> opb_free_mod
= ryo
-> ryo_res_mod
;
result
= (*ryo
-> ryo_res_decode
) (ror
-> ror_result
, 1,
NULLIP
, NULLVP
, &op2
-> opb_out
);
op2
-> opb_free
= ryo
-> ryo_res_free
;
result
= ROS_RRP_MISTYPED
;
op2
-> opb_pe
= ror
-> ror_result
, ror
-> ror_result
= NULLPE
;
result
= ROS_RRP_MISTYPED
;
result
= (*op2
-> opb_resfnx
) (sd
, op2
-> opb_id
,
RY_RESULT
, op2
-> opb_out
,
id
= ror
-> ror_id
, cp
= "result";
result
= rosaplose (roi
, ROS_PROTOCOL
, NULLCP
,
"%s %s dispatch for invoke id %d returns %d",
ryo
-> ryo_name
, cp
, id
, result
);
if (opb
== NULLOPB
|| opb
== op2
) {
op2
-> opb_flags
|= OPB_EVENT
;
op2
-> opb_event
= *roi
; /* struct copy */
return rosaplose (roi
, ROS_WAITING
, NULLCP
, NULLCP
);
op2
-> opb_flags
|= OPB_EVENT
;
op2
-> opb_event
= *roi
; /* struct copy */
register struct RoSAPerror
*roe
= &roi
-> roi_error
;
if ((op2
= findopblk (sd
, roe
-> roe_id
, OPB_INITIATOR
))
|| (op2
-> opb_flags
& OPB_EVENT
)) {
(void) RoURejectRequest (sd
, &roe
-> roe_id
,
ROS_REP_UNRECOG
, ROS_NOPRIO
, roi
);
if (!(rye
= ryo
-> ryo_errors
)) {
if ((*rye
) -> rye_err
== roe
-> roe_error
)
result
= ROS_REP_UNEXPERR
;
if ((*rye
) -> rye_param_mod
) { /* XXX: MISTYPED? */
if ((*rye
) -> rye_param_decode
) { /* XXX: MISTYPED? */
result
= ROS_REP_MISTYPED
;
result
= dec_f( (*rye
) -> rye_param_index
,
(*rye
) -> rye_param_mod
, roe
-> roe_param
,
result
= (*(*rye
) -> rye_param_decode
) (roe
-> roe_param
,
1, NULLIP
, NULLVP
, &op2
-> opb_out
);
op2
-> opb_free_index
= (*rye
) -> rye_param_index
;
op2
-> opb_free_mod
= (*rye
) -> rye_param_mod
;
op2
-> opb_free
= (*rye
) -> rye_param_free
;
result
= ROS_REP_MISTYPED
;
op2
-> opb_pe
= roe
-> roe_param
, roe
-> roe_param
= NULLPE
;
result
= ROS_REP_MISTYPED
;
result
= (*op2
-> opb_errfnx
) (sd
, op2
-> opb_id
,
id
= roe
-> roe_id
, cp
= "error";
if (opb
== NULLOPB
|| opb
== op2
) {
op2
-> opb_flags
|= OPB_EVENT
;
op2
-> opb_event
= *roi
; /* struct copy */
register struct RoSAPureject
*rou
= &roi
-> roi_ureject
;
if ((op2
= findopblk (sd
, rou
-> rou_id
, OPB_INITIATOR
))
|| (op2
-> opb_flags
& OPB_EVENT
))
result
= (*op2
-> opb_errfnx
) (sd
, id
= op2
-> opb_id
,
(caddr_t
) rou
-> rou_reason
,
if (opb
== NULLOPB
|| opb
== op2
) {
op2
-> opb_flags
|= OPB_EVENT
;
op2
-> opb_event
= *roi
; /* struct copy */
return rosaplose (roi
, ROS_PROTOCOL
, NULLCP
,
"unknown indication type=%d", roi
-> roi_type
);
register struct RoSAPureject
*rou
= &roi
-> roi_ureject
;
(void) RoURejectRequest (op2
-> opb_fd
, &op2
-> opb_id
,
result
, ROS_NOPRIO
, roi
);
roi
-> roi_type
= ROI_UREJECT
;
rou
-> rou_id
= op2
-> opb_id
;
rou
-> rou_reason
= result
;
result
= (*op2
-> opb_errfnx
) (sd
, id
= op2
-> opb_id
, RY_REJECT
,
(caddr_t
) rou
->rou_reason
, roi
);
if (opb
== NULLOPB
|| opb
== op2
) {
op2
-> opb_flags
|= OPB_EVENT
;
op2
-> opb_event
= *roi
; /* struct copy */
return rosaplose (roi
, ROS_TIMER
, NULLCP
, NULLCP
);
switch (result
= RoWaitRequest (sd
, NOTOK
, roi
)) {
reason
= roi
-> roi_preject
.rop_reason
;
loseopblk (sd
, ROS_IP_RELEASE
);
result
= rosaplose (roi
, ROS_PROTOCOL
, NULLCP
,
"unknown return from RoWaitRequest=%d", result
);