#include "AM.h"
-generic module AMQueueImplP(int numClients) {
+generic module AMQueueImplP(int numClients) @safe() {
provides interface Send[uint8_t client];
uses{
interface AMSend[am_id_t id];
implementation {
typedef struct {
- message_t* msg;
+ message_t* ONE_NOK msg;
} queue_entry_t;
uint8_t current = numClients; // mark as empty
}
}
- void sendDone(uint8_t last, message_t *msg, error_t err) {
+ void sendDone(uint8_t last, message_t * ONE msg, error_t err) {
queue[last].msg = NULL;
tryToSend();
signal Send.sendDone[last](msg, err);
}
event void AMSend.sendDone[am_id_t id](message_t* msg, error_t err) {
- if(queue[current].msg == msg) {
- sendDone(current, msg, err);
- }
- else {
- dbg("PointerBug", "%s received send done for %p, signaling for %p.\n",
- __FUNCTION__, msg, queue[current].msg);
- }
+ // Bug fix from John Regehr: if the underlying radio mixes things
+ // up, we don't want to read memory incorrectly. This can occur
+ // on the mica2.
+ // Note that since all AM packets go through this queue, this
+ // means that the radio has a problem. -pal
+ if (current >= numClients) {
+ return;
+ }
+ if(queue[current].msg == msg) {
+ sendDone(current, msg, err);
+ }
+ else {
+ dbg("PointerBug", "%s received send done for %p, signaling for %p.\n",
+ __FUNCTION__, msg, queue[current].msg);
+ }
}
command uint8_t Send.maxPayloadLength[uint8_t id]() {
return call AMSend.maxPayloadLength[0]();
}
- command void* Send.getPayload[uint8_t id](message_t* m) {
- return call AMSend.getPayload[0](m);
+ command void* Send.getPayload[uint8_t id](message_t* m, uint8_t len) {
+ return call AMSend.getPayload[0](m, len);
}
default event void Send.sendDone[uint8_t id](message_t* msg, error_t err) {
// Do nothing
}
+ default command error_t AMSend.send[uint8_t id](am_addr_t am_id, message_t* msg, uint8_t len) {
+ return FAIL;
+ }
}