X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fsystem%2FSharedArbiterP.nc;h=b912fa19b5df67bfd594f7d4af1362a9dc82fd1c;hb=ae00d087aa959de065570bcd79090480097b69e6;hp=c3503131cde02a93edb6d775de6a5b9d807ad0d6;hpb=d8f0e6966930184e8b584a6c9d39849a2f47986c;p=tinyos-2.x.git diff --git a/tos/system/SharedArbiterP.nc b/tos/system/SharedArbiterP.nc index c3503131..b912fa19 100644 --- a/tos/system/SharedArbiterP.nc +++ b/tos/system/SharedArbiterP.nc @@ -33,14 +33,11 @@ * switched subsystem. For example, a communications bus that can handle IO * for multiple clients simultaneously, but is powered down when not in use. * - * p_dfltOwnerId = uniqueCount() use by the resource. see SharedArbiterC - * * @author R. Steve McKown */ -generic module SharedArbiterP(uint8_t p_dfltOwnerId) { +generic module SharedArbiterP() { provides { - interface Init; interface Resource[uint8_t id]; interface ResourceDefaultOwner; interface ArbiterInfo; @@ -55,6 +52,7 @@ implementation { 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, @@ -119,33 +117,37 @@ implementation { } } - command error_t Init.init() - { - call GrantedVector.clearAll(); - call RequestingVector.clearAll(); - return SUCCESS; - } - async command error_t Resource.request[uint8_t id]() { + /* The Resource docs do not say what happens when a user calls + * Resource.request() after the resource has already been granted. We + * elect to call EBUSY, as if the request was still in process. + */ if (call RequestingVector.get(id) || call GrantedVector.get(id)) - return FAIL; + 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; } async command error_t Resource.immediateRequest[uint8_t id]() { + /* The Resource docs do not say what happens when a user calls + * Resource.request() after the resource has already been granted. We + * elect to call EBUSY, as if the request was still in process. + */ if (call RequestingVector.get(id) || call GrantedVector.get(id)) - return FAIL; + 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; @@ -167,14 +169,15 @@ implementation { async command error_t ResourceDefaultOwner.release() { - atomic { - if (m_requesting > 0) { - call State.forceState(S_GRANTED); - post grantedTask(); - return SUCCESS; - } else - return FAIL; - } + 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; } async command bool ArbiterInfo.inUse()