[Tinyos-devel] Bug in Resource.request interaction with ResourceRequested.requested
Eric Decker
cire831 at gmail.com
Tue Aug 12 22:51:35 PDT 2008
Works.
Why not the check for RES_BUSY in request?
eric
On Tue, Aug 12, 2008 at 12:36 AM, Kevin Klues <klueska at gmail.com> wrote:
> I agree this is in fact a bug. I think the correct solution would be
> to add one line inside of resource.release() for resId=NO_RES while in
> the process of granting the resource. Can you try this out and let me
> know if it fixes the problem. I'll check it in if you can verify that
> it solves it.
>
> inside Resource.release()
>
> if(call Queue.isEmpty() == FALSE) {
> reqResId = call Queue.dequeue();
> resId = NO_RES;
> state = RES_GRANTING;
> post grantedTask();
> call ResourceConfigure.unconfigure[id]();
> }
>
> Kevin
>
> On Mon, Aug 11, 2008 at 5:21 PM, Eric Decker <cire831 at gmail.com> wrote:
> > I am making heavy use of arbitration in a T2 based mote. I've discovered
> > what looks
> > like incorrect behaviour. The code looks like:
> > =>async command error_t Resource.request[uint8_t id]() {
> > signal ResourceRequested.requested[resId]();
> > atomic {
> > if(state == RES_CONTROLLED) {
> > state = RES_GRANTING;
> > reqResId = id;
> > }
> > else return call Queue.enqueue(id);
> > }
> > signal ResourceDefaultOwner.requested();
> > return SUCCESS;
> > }
> >
> > The problem is ResourceRequested.requested[resId]() gets signaled
> > no matter what. "resId" holds the value of the last holder of the
> resource
> > it doesn't get modified when a resource owner does a release.
> > I would assert that a ResourceRequested.requested shouldn't be signaled
> > unless the resource is actively owned by resId. ie. signal only if
> state
> > == RES_BUSY.
> > So if a resource owner does a release it is possible (Resource.request is
> > async) for a
> > request to come in. If ResourceRequested.requested is signaled, I assert
> > that
> > this is wrong.
> > This can be protected inside of the ResourceRequested.requested
> > event by checking for ownership but I think it would be cleaner to check
> for
> > RES_BUSY
> > inside of Resource.request. I would assert ResourceRequested.requested
> > should
> > only be signaled when the resource is owned and a new request comes in.
> It
> > only should
> > be signaled to the current owner.
> > I observed the failure when executing the following code:
> > call UARTResource.release();
> > call GPSMsg.reset();
> > call GPSTimer.startOneShot(DT_GPS_MAX_REQUEST_TO);
> > call UARTResource.request();
> > Even though we do the release, when the request is executed, I observe
> that
> > UARTResourceRequested.requested is getting signalled which seems odd.
> > thoughts,
> > eric
> >
> > --
> > Eric B. Decker
> > Senior (over 50 :-) Researcher
> > Autonomous Systems Lab
> > Jack Baskin School of Engineering
> > UCSC
> >
> >
>
>
>
> --
> ~Kevin
>
--
Eric B. Decker
Senior (over 50 :-) Researcher
Autonomous Systems Lab
Jack Baskin School of Engineering
UCSC
-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://www.millennium.berkeley.edu/pipermail/tinyos-devel/attachments/20080812/d5da830f/attachment.htm
More information about the Tinyos-devel
mailing list