Component responses
As we've seen, a combine message really consists of a number
of regular
resource manager messages combined
into one large contiguous message.
The resource manager library handles
each component in the combine message separately by
extracting the individual components and then out calling to
the handlers you've specified in the connect and I/O
function tables, as appropriate, for each component.
This generally doesn't present any new wrinkles for the message handlers themselves, except in one case. Consider the readblock() combine message:
- Client call:
- readblock()
- Message(s):
- _IO_LSEEK , _IO_READ
- Callouts:
- io_lock_ocb, io_lseek, io_read, io_unlock_ocb
Ordinarily, after processing the _IO_LSEEK message, your handler would return the current position within the file. However, the next message (the _IO_READ) also returns data. By convention, only the last data-returning message within a combine message will actually return data. The intermediate messages are allowed to return only a pass/fail indication.
The impact of this is that the _IO_LSEEK message handler has to be aware of whether or not it's being invoked as part of combine message handling. If it is, it should only return either an EOK (indicating that the lseek() operation succeeded) or an error indication to indicate some form of failure.
But if the _IO_LSEEK handler isn't being invoked as part of combine message handling, it should return the EOK and the new offset (or, in case of error, an error indication only).
int iofunc_lseek_default (resmgr_context_t *ctp,
io_lseek_t *msg,
iofunc_ocb_t *ocb)
{
/*
* performs the lseek processing here may "early-out" on error conditions
*/
...
/* decision re: combine messages done here */
if (msg -> i.combine_len & _IO_COMBINE_FLAG) {
return (EOK);
}
msg -> o = offset;
return (_RESMGR_PTR (ctp, &msg -> o, sizeof (msg -> o)));
}
if (msg -> i.combine_len & _IO_COMBINE_FLAG)
If the _IO_COMBINE_FLAG bit is set in the combine_len member, this indicates that the message is being processed as part of a combine message.
When the resource manager library is processing the individual components of the combine message, it looks at the error return from the individual message handlers. If a handler returns anything other than EOK, then processing of further combine message components is aborted. The error that was returned from the failing component's handler is returned to the client.