enum {
S_IDLE = 0, /* Resource is not in use; owned by default owner */
S_REQUESTING, /* Requesting the resource from the default owner */
+ S_IMMREQUESTING, /* Immediate resource request from the default owner */
S_GRANTED, /* One or more clients have been granted the resource */
NO_CLIENT = 0xff,
return EBUSY;
addRequesting(id);
- if (call State.isIdle())
+ if (call State.requestState(S_REQUESTING) == SUCCESS)
signal ResourceDefaultOwner.requested();
- if (call State.isState(S_GRANTED))
+ else if (call State.isState(S_GRANTED))
post grantedTask();
return SUCCESS;
}
if (call RequestingVector.get(id) || call GrantedVector.get(id))
return EBUSY;
- if (call State.isIdle())
+ if (call State.requestState(S_IMMREQUESTING) == SUCCESS) {
signal ResourceDefaultOwner.immediateRequested();
+ if (call State.isState(S_IMMREQUESTING))
+ call State.toIdle();
+ }
if (call State.isState(S_GRANTED)) {
addGranted(id);
return SUCCESS;
async command error_t ResourceDefaultOwner.release()
{
- if (call State.requestState(S_GRANTED) == SUCCESS) {
+ if (call State.isState(S_REQUESTING)) {
+ call State.forceState(S_GRANTED);
post grantedTask();
return SUCCESS;
+ } else if (call State.isState(S_IMMREQUESTING)) {
+ call State.forceState(S_GRANTED);
+ return SUCCESS;
} else
return FAIL;
}