
Own fork of MbedSmartRestMain
Dependencies: C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed
Fork of MbedSmartRestMain by
operation/OperationStore.cpp@62:86a04c5bda18, 2014-10-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |