Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > BestEffortMessaging
annotate LossyCom.c @ 0:29d8b41926f0
Initial commit - compiles but has still the wrong name
| author | Merten Sach <msach@mailbox.tu-berlin.de> |
|---|---|
| date | Wed, 07 Mar 2012 19:46:37 +0100 |
| parents | |
| children | 826448e34e80 |
| rev | line source |
|---|---|
| msach@0 | 1 |
| msach@0 | 2 /* |
| msach@0 | 3 * For a detailed description see header file. |
| msach@0 | 4 */ |
| msach@0 | 5 |
| msach@0 | 6 #include "LossyCom.h" |
| msach@0 | 7 |
| msach@0 | 8 #include "VMS_Implementations/VMS_impl/vmalloc.h" |
| msach@0 | 9 |
| msach@0 | 10 /* |
| msach@0 | 11 * Initializes the central exchange structure. |
| msach@0 | 12 * Allocates memory to fit the number of endpoints. |
| msach@0 | 13 * Returns NULL if an error occurs. |
| msach@0 | 14 */ |
| msach@0 | 15 lossyCom__exchange_t* lossyCom__initialize(uint16_t numEndpoints) |
| msach@0 | 16 { |
| msach@0 | 17 lossyCom__exchange_t* exchange; |
| msach@0 | 18 |
| msach@0 | 19 exchange = VMS_WL__malloc(sizeof(lossyCom__exchange_t)); |
| msach@0 | 20 if(exchange == NULL) |
| msach@0 | 21 return NULL; |
| msach@0 | 22 |
| msach@0 | 23 exchange->triggerCounter = 0; |
| msach@0 | 24 exchange->numEndpoints = numEndpoints; |
| msach@0 | 25 exchange->outboxArray = VMS_WL__malloc(sizeof(lossyCom__msg_t)*numEndpoints); |
| msach@0 | 26 if(exchange->outboxArray == NULL){ |
| msach@0 | 27 VMS_WL__free(exchange); |
| msach@0 | 28 return NULL; |
| msach@0 | 29 } |
| msach@0 | 30 |
| msach@0 | 31 return exchange; |
| msach@0 | 32 } |
| msach@0 | 33 |
| msach@0 | 34 void lossyCom__initialize_endpoint(lossyCom__endpoint_t* localEndpoint, |
| msach@0 | 35 lossyCom__exchange_t* centralExchange, |
| msach@0 | 36 lossyCom__endpointID_t endpointID, |
| msach@0 | 37 lossyCom__msgHandler* msgHandler) |
| msach@0 | 38 { |
| msach@0 | 39 localEndpoint->localTriggerCopy = 0; |
| msach@0 | 40 localEndpoint->endpointID = endpointID; |
| msach@0 | 41 localEndpoint->centralExchangePtr = centralExchange; |
| msach@0 | 42 localEndpoint->msgHandler = msgHandler; |
| msach@0 | 43 } |
| msach@0 | 44 |
| msach@0 | 45 void inline lossyCom__broadcastMsg(lossyCom__endpoint_t* localEndpoint, |
| msach@0 | 46 lossyCom__msgBody_t msg) |
| msach@0 | 47 { |
| msach@0 | 48 lossyCom__sendMsg(localEndpoint, |
| msach@0 | 49 BROADCAST_ID, |
| msach@0 | 50 msg); |
| msach@0 | 51 } |
| msach@0 | 52 |
| msach@0 | 53 void inline lossyCom__sendMsg(lossyCom__endpoint_t* localEndpoint, |
| msach@0 | 54 lossyCom__endpointID_t receiverEndpointID, |
| msach@0 | 55 lossyCom__msgBody_t msg) |
| msach@0 | 56 { |
| msach@0 | 57 lossyCom__msg_t msgDraft; |
| msach@0 | 58 uint16_t triggerCopy; |
| msach@0 | 59 |
| msach@0 | 60 msgDraft = (0 | msg); |
| msach@0 | 61 msgDraft |= ((lossyCom__msg_t)receiverEndpointID << ENDPOINT_ID_SHIFT); |
| msach@0 | 62 |
| msach@0 | 63 triggerCopy = localEndpoint->centralExchangePtr->triggerCounter +1; |
| msach@0 | 64 msgDraft |= ((lossyCom__msg_t)triggerCopy << TRIGGER_SHIFT); |
| msach@0 | 65 |
| msach@0 | 66 //write msg to central exchange |
| msach@0 | 67 localEndpoint->centralExchangePtr->outboxArray[localEndpoint->endpointID] = |
| msach@0 | 68 msgDraft; |
| msach@0 | 69 |
| msach@0 | 70 localEndpoint->centralExchangePtr->triggerCounter = triggerCopy; |
| msach@0 | 71 } |
| msach@0 | 72 |
| msach@0 | 73 void inline lossyCom__receiveMsg(lossyCom__endpoint_t* localEndpoint) |
| msach@0 | 74 { |
| msach@0 | 75 uint16_t remoteTriggerCopy; |
| msach@0 | 76 lossyCom__endpointID_t senderEndpointID; |
| msach@0 | 77 lossyCom__msg_t msgCopy; |
| msach@0 | 78 uint16_t msgTrigger; |
| msach@0 | 79 lossyCom__msgBody_t msgBody; |
| msach@0 | 80 |
| msach@0 | 81 senderEndpointID = 0; |
| msach@0 | 82 remoteTriggerCopy = localEndpoint->centralExchangePtr->triggerCounter; |
| msach@0 | 83 //new message arrived if trigger counter is higher than the last time read |
| msach@0 | 84 while(senderEndpointID < localEndpoint->centralExchangePtr->numEndpoints) |
| msach@0 | 85 { |
| msach@0 | 86 if(senderEndpointID != localEndpoint->endpointID) |
| msach@0 | 87 { |
| msach@0 | 88 msgCopy = localEndpoint->centralExchangePtr->outboxArray[senderEndpointID]; |
| msach@0 | 89 msgTrigger = 0xFFFF & (msgCopy >> TRIGGER_SHIFT); |
| msach@0 | 90 if(msgTrigger > localEndpoint->localTriggerCopy && |
| msach@0 | 91 msgTrigger <= remoteTriggerCopy) |
| msach@0 | 92 { |
| msach@0 | 93 msgBody = 0xFFFFFFFF & msgCopy; |
| msach@0 | 94 (*(localEndpoint->msgHandler))(senderEndpointID, msgBody); |
| msach@0 | 95 } |
| msach@0 | 96 } |
| msach@0 | 97 senderEndpointID++; |
| msach@0 | 98 } |
| msach@0 | 99 //save last parsed msg |
| msach@0 | 100 localEndpoint->localTriggerCopy = remoteTriggerCopy; |
| msach@0 | 101 } |
