Own fork of MbedSmartRestMain

Dependencies:   C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed

Fork of MbedSmartRestMain by Cumulocity Official

Committer:
vwochnik
Date:
Wed Oct 29 21:09:29 2014 +0000
Revision:
62:86a04c5bda18
Child:
63:010bbbb4732a
introduced operation store

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vwochnik 62:86a04c5bda18 1 #include "OperationStore.h"
vwochnik 62:86a04c5bda18 2 #include <stdlib.h>
vwochnik 62:86a04c5bda18 3 #include <string.h>
vwochnik 62:86a04c5bda18 4
vwochnik 62:86a04c5bda18 5 /*#define OPERATION_PENDING 0
vwochnik 62:86a04c5bda18 6 #define OPERATION_EXECUTING 1
vwochnik 62:86a04c5bda18 7 #define OPERATION_SUCCESS 2
vwochnik 62:86a04c5bda18 8 #define OPERATION_FAILURE 3
vwochnik 62:86a04c5bda18 9 #define OPERATION_STORE_SIZE 128*/
vwochnik 62:86a04c5bda18 10
vwochnik 62:86a04c5bda18 11 OperationStore::OperationStore() :
vwochnik 62:86a04c5bda18 12 _count(0),
vwochnik 62:86a04c5bda18 13 _offset(0)
vwochnik 62:86a04c5bda18 14 {
vwochnik 62:86a04c5bda18 15 }
vwochnik 62:86a04c5bda18 16
vwochnik 62:86a04c5bda18 17 bool OperationStore::enqueue(Operation& operation)
vwochnik 62:86a04c5bda18 18 {
vwochnik 62:86a04c5bda18 19 _mutex.lock();
vwochnik 62:86a04c5bda18 20 if ((full()) || (getByIdentifier(operation.identifier) != NULL) ||
vwochnik 62:86a04c5bda18 21 (operation.state != OPERATION_PENDING)) {
vwochnik 62:86a04c5bda18 22 _mutex.unlock();
vwochnik 62:86a04c5bda18 23 return false;
vwochnik 62:86a04c5bda18 24 }
vwochnik 62:86a04c5bda18 25
vwochnik 62:86a04c5bda18 26 memcpy(get(_count++), &operation, sizeof(OperationStore::Operation));
vwochnik 62:86a04c5bda18 27 _mutex.unlock();
vwochnik 62:86a04c5bda18 28 return true;
vwochnik 62:86a04c5bda18 29 }
vwochnik 62:86a04c5bda18 30
vwochnik 62:86a04c5bda18 31 bool OperationStore::takePending(Operation& operation)
vwochnik 62:86a04c5bda18 32 {
vwochnik 62:86a04c5bda18 33 size_t n;
vwochnik 62:86a04c5bda18 34 Operation *tmp;
vwochnik 62:86a04c5bda18 35
vwochnik 62:86a04c5bda18 36 _mutex.lock();
vwochnik 62:86a04c5bda18 37 for (n = 0; n < _count; n++) {
vwochnik 62:86a04c5bda18 38 tmp = get(n);
vwochnik 62:86a04c5bda18 39 if (tmp->state != OPERATION_PENDING)
vwochnik 62:86a04c5bda18 40 continue;
vwochnik 62:86a04c5bda18 41
vwochnik 62:86a04c5bda18 42 tmp->state = OPERATION_EXECUTING;
vwochnik 62:86a04c5bda18 43 memcpy(&operation, tmp, sizeof(OperationStore::Operation));
vwochnik 62:86a04c5bda18 44
vwochnik 62:86a04c5bda18 45 _mutex.unlock();
vwochnik 62:86a04c5bda18 46 return true;
vwochnik 62:86a04c5bda18 47 }
vwochnik 62:86a04c5bda18 48
vwochnik 62:86a04c5bda18 49 _mutex.unlock();
vwochnik 62:86a04c5bda18 50 return false;
vwochnik 62:86a04c5bda18 51 }
vwochnik 62:86a04c5bda18 52
vwochnik 62:86a04c5bda18 53 bool OperationStore::markAsDone(Operation& operation, bool successful)
vwochnik 62:86a04c5bda18 54 {
vwochnik 62:86a04c5bda18 55 Operation *tmp;
vwochnik 62:86a04c5bda18 56
vwochnik 62:86a04c5bda18 57 _mutex.lock();
vwochnik 62:86a04c5bda18 58 tmp = getByIdentifier(operation.identifier);
vwochnik 62:86a04c5bda18 59 if ((tmp == NULL) || (tmp->state != OPERATION_EXECUTING)) {
vwochnik 62:86a04c5bda18 60 _mutex.unlock();
vwochnik 62:86a04c5bda18 61 return false;
vwochnik 62:86a04c5bda18 62 }
vwochnik 62:86a04c5bda18 63
vwochnik 62:86a04c5bda18 64 tmp->state = (successful) ? OPERATION_SUCCESSFUL : OPERATION_FAILED;
vwochnik 62:86a04c5bda18 65 _mutex.unlock();
vwochnik 62:86a04c5bda18 66 return true;
vwochnik 62:86a04c5bda18 67 }
vwochnik 62:86a04c5bda18 68
vwochnik 62:86a04c5bda18 69 bool OperationStore::takeDone(Operation& operation)
vwochnik 62:86a04c5bda18 70 {
vwochnik 62:86a04c5bda18 71 Operation *tmp;
vwochnik 62:86a04c5bda18 72
vwochnik 62:86a04c5bda18 73 _mutex.lock();
vwochnik 62:86a04c5bda18 74 tmp = get(0);
vwochnik 62:86a04c5bda18 75 if ((tmp == NULL) || ((tmp->state != OPERATION_SUCCESSFUL) &&
vwochnik 62:86a04c5bda18 76 (tmp->state != OPERATION_FAILED))) {
vwochnik 62:86a04c5bda18 77 _mutex.unlock();
vwochnik 62:86a04c5bda18 78 return false;
vwochnik 62:86a04c5bda18 79 }
vwochnik 62:86a04c5bda18 80
vwochnik 62:86a04c5bda18 81 if (++_offset == OPERATION_STORE_SIZE)
vwochnik 62:86a04c5bda18 82 _offset = 0;
vwochnik 62:86a04c5bda18 83 _count--;
vwochnik 62:86a04c5bda18 84
vwochnik 62:86a04c5bda18 85 memcpy(&operation, tmp, sizeof(OperationStore::Operation));
vwochnik 62:86a04c5bda18 86
vwochnik 62:86a04c5bda18 87 _mutex.unlock();
vwochnik 62:86a04c5bda18 88 return true;
vwochnik 62:86a04c5bda18 89 }
vwochnik 62:86a04c5bda18 90
vwochnik 62:86a04c5bda18 91 bool OperationStore::full()
vwochnik 62:86a04c5bda18 92 {
vwochnik 62:86a04c5bda18 93 bool ret;
vwochnik 62:86a04c5bda18 94
vwochnik 62:86a04c5bda18 95 _mutex.lock();
vwochnik 62:86a04c5bda18 96 ret = (_count == OPERATION_STORE_SIZE);
vwochnik 62:86a04c5bda18 97 _mutex.unlock();
vwochnik 62:86a04c5bda18 98
vwochnik 62:86a04c5bda18 99 return ret;
vwochnik 62:86a04c5bda18 100 }
vwochnik 62:86a04c5bda18 101
vwochnik 62:86a04c5bda18 102 bool OperationStore::empty()
vwochnik 62:86a04c5bda18 103 {
vwochnik 62:86a04c5bda18 104 bool ret;
vwochnik 62:86a04c5bda18 105
vwochnik 62:86a04c5bda18 106 _mutex.lock();
vwochnik 62:86a04c5bda18 107 ret = (_count == 0);
vwochnik 62:86a04c5bda18 108 _mutex.unlock();
vwochnik 62:86a04c5bda18 109
vwochnik 62:86a04c5bda18 110 return ret;
vwochnik 62:86a04c5bda18 111 }
vwochnik 62:86a04c5bda18 112
vwochnik 62:86a04c5bda18 113 OperationStore::Operation * OperationStore::get(size_t index)
vwochnik 62:86a04c5bda18 114 {
vwochnik 62:86a04c5bda18 115 size_t i;
vwochnik 62:86a04c5bda18 116
vwochnik 62:86a04c5bda18 117 if (_offset + index < OPERATION_STORE_SIZE)
vwochnik 62:86a04c5bda18 118 i = _offset + index;
vwochnik 62:86a04c5bda18 119 else
vwochnik 62:86a04c5bda18 120 i = index - (OPERATION_STORE_SIZE - _offset);
vwochnik 62:86a04c5bda18 121
vwochnik 62:86a04c5bda18 122 return &_store[i];
vwochnik 62:86a04c5bda18 123 }
vwochnik 62:86a04c5bda18 124
vwochnik 62:86a04c5bda18 125 OperationStore::Operation * OperationStore::getByIdentifier(long identifier)
vwochnik 62:86a04c5bda18 126 {
vwochnik 62:86a04c5bda18 127 size_t n;
vwochnik 62:86a04c5bda18 128 Operation *tmp;
vwochnik 62:86a04c5bda18 129
vwochnik 62:86a04c5bda18 130 for (n = 0; n < _count; n++) {
vwochnik 62:86a04c5bda18 131 tmp = get(n);
vwochnik 62:86a04c5bda18 132 if (tmp->identifier == identifier)
vwochnik 62:86a04c5bda18 133 return tmp;
vwochnik 62:86a04c5bda18 134 }
vwochnik 62:86a04c5bda18 135
vwochnik 62:86a04c5bda18 136 return NULL;
vwochnik 62:86a04c5bda18 137 }