fcfsresourcequeuec.nc
来自「tinyos-2.x.rar」· NC 代码 · 共 86 行
NC
86 行
/*
* "Copyright (c) 2005 Washington University in St. Louis.
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose, without fee, and without written agreement is
* hereby granted, provided that the above copyright notice, the following
* two paragraphs and the author appear in all copies of this software.
*
* IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY
* FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
* OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON
* UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO
* OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
* MODIFICATIONS."
*/
/**
*
* @author Kevin Klues (klueska@cs.wustl.edu)
* @version $Revision: 1.6 $
* @date $Date: 2009/08/19 17:52:10 $
*/
#include "Resource.h"
generic module FcfsResourceQueueC(uint8_t size) @safe() {
provides {
interface Init;
interface ResourceQueue as FcfsQueue;
}
}
implementation {
enum {NO_ENTRY = 0xFF};
uint8_t resQ[size];
uint8_t qHead = NO_ENTRY;
uint8_t qTail = NO_ENTRY;
command error_t Init.init() {
memset(resQ, NO_ENTRY, sizeof(resQ));
return SUCCESS;
}
async command bool FcfsQueue.isEmpty() {
atomic return (qHead == NO_ENTRY);
}
async command bool FcfsQueue.isEnqueued(resource_client_id_t id) {
atomic return resQ[id] != NO_ENTRY || qTail == id;
}
async command resource_client_id_t FcfsQueue.dequeue() {
atomic {
if(qHead != NO_ENTRY) {
uint8_t id = qHead;
qHead = resQ[qHead];
if(qHead == NO_ENTRY)
qTail = NO_ENTRY;
resQ[id] = NO_ENTRY;
return id;
}
return NO_ENTRY;
}
}
async command error_t FcfsQueue.enqueue(resource_client_id_t id) {
atomic {
if(!(call FcfsQueue.isEnqueued(id))) {
if(qHead == NO_ENTRY)
qHead = id;
else
resQ[qTail] = id;
qTail = id;
return SUCCESS;
}
return EBUSY;
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?