CMSDK 2.0.1
Cross-platform C++ base library and SDK for the Psyclone AIOS platform
Loading...
Searching...
No Matches
DataMapsMemory.cpp
Go to the documentation of this file.
1
4
5#include "DataMapsMemory.h"
6
7namespace cmlabs {
8
10 mutex = NULL;
11 this->master = master;
12 header = NULL;
13 memorySize = 0;
14 port = 0;
15 serial = 0;
16 typeMapHeader = NULL;
17 contextMapHeader = NULL;
18 tagMapHeader = NULL;
19 crankMapHeader = NULL;
20// componentMapHeader = NULL;
21 requestMapHeader = NULL;
22}
23
25 if (mutex)
26 mutex->enter(5000, __FUNCTION__);
27
28 typeMapHeader = NULL;
29 contextMapHeader = NULL;
30 tagMapHeader = NULL;
31 crankMapHeader = NULL;
32// componentMapHeader = NULL;
33 requestMapHeader = NULL;
34
35 if (memorySize)
36 utils::CloseSharedMemorySegment((char*) header, memorySize);
37 header = NULL;
38 if (mutex)
39 mutex->leave();
40 delete(mutex);
41 mutex = NULL;
42}
43
44bool DataMapsMemory::getMemoryUsage(uint64& alloc, uint64& usage) {
45 if (!mutex || !mutex->enter(5000, __FUNCTION__))
46 return false;
48
49 alloc = memorySize;
50 usage =
51 typeMapHeader->count * sizeof(TypeMapEntry) +
52 contextMapHeader->count * sizeof(ContextMapEntry) +
53 tagMapHeader->count * sizeof(TagMapEntry) +
54 crankMapHeader->count * sizeof(CrankMapEntry) +
55 requestMapHeader->count * sizeof(RequestMapEntry);
56
57 mutex->leave();
58 return true;
59}
60
61
62bool DataMapsMemory::create(uint32 typesMaxCount, uint32 contextsMaxCount, uint32 tagsMaxCount, uint32 cranksMaxCount, uint32 requestsMaxCount) {
63 serial = master->incrementDataMapsShmemSerial();
64 return resize(master->port, serial, typesMaxCount, contextsMaxCount, tagsMaxCount, cranksMaxCount, requestsMaxCount);
65}
66
68 serial = master->getDataMapsShmemSerial();
69 uint64 size = master->getDataMapsShmemSize();
70 this->port = master->port;
71
72 bool createdMutex = false;
73 if (!mutex) {
74 // LogPrint(0,LOG_MEMORY,0," --------- Opening new DataMapsMemory section serial %u --------", serial);
75 mutex = new utils::Mutex(utils::StringFormat("PsycloneDataMapsMemoryMutex_%u", port).c_str());
76 createdMutex = true;
77 if (!mutex->enter(5000, __FUNCTION__))
78 return false;
79 }
80 else
81 LogPrint(0,LOG_MEMORY,0," --------- Reopening DataMapsMemory section serial %u --------", serial);
82
83 DataMapsMemoryStruct* newHeader = (DataMapsMemoryStruct*) utils::OpenSharedMemorySegment(utils::StringFormat("PsycloneDataMapsMemory_%u_%u", port, serial).c_str(), size);
84 if (!newHeader) {
85 if (createdMutex)
86 mutex->leave();
87 return false;
88 }
89 if (newHeader->cid != DATAMAPSMEMORYID) {
90 utils::CloseSharedMemorySegment((char*)newHeader, size);
91 if (createdMutex)
92 mutex->leave();
93 return false;
94 }
95
96 typeMapHeader = (GenericMapHeader*)(((char*)newHeader) + sizeof(DataMapsMemoryStruct));
97 contextMapHeader = (GenericMapHeader*)(((char*)typeMapHeader) + typeMapHeader->size);
98 tagMapHeader = (GenericMapHeader*)(((char*)contextMapHeader) + contextMapHeader->size);
99 crankMapHeader = (GenericMapHeader*)(((char*)tagMapHeader) + tagMapHeader->size);
100 requestMapHeader = (GenericMapHeader*)(((char*)crankMapHeader) + crankMapHeader->size);
101
102 memorySize = size;
103 if (header)
104 utils::CloseSharedMemorySegment((char*)header, header->size);
105 header = newHeader;
106 if (createdMutex)
107 mutex->leave();
108 // else leave mutex locked as we are calling from within the object
109 return true;
110}
111
112
114 if (!mutex || !mutex->enter(5000, __FUNCTION__))
115 return false;
117
118 double factor = 2.0;
119
120 uint32 newTypeCount = header->typesMaxCount;
121 uint32 newContextCount = header->contextsMaxCount;
122 uint32 newTagCount = header->tagsMaxCount;
123 uint32 newCrankCount = header->cranksMaxCount;
124// uint32 newComponentCount = 0;
125 uint32 newRequestCount = header->requestsMaxCount;
126
127 bool shouldResize = false;
128 if (header->typesMaxCount - typeMapHeader->count < (header->typesMaxCount * 0.1)) {
129 newTypeCount = (uint32)(header->typesMaxCount * factor);
130 shouldResize = true;
131 }
132 if (header->contextsMaxCount - contextMapHeader->count < (header->contextsMaxCount * 0.1)) {
133 newContextCount = (uint32)(header->contextsMaxCount * factor);
134 shouldResize = true;
135 }
136 if (header->tagsMaxCount - tagMapHeader->count < (header->tagsMaxCount * 0.1)) {
137 newTagCount = (uint32)(header->tagsMaxCount * factor);
138 shouldResize = true;
139 }
140 if (header->cranksMaxCount - crankMapHeader->count < (header->cranksMaxCount * 0.1)) {
141 newCrankCount = (uint32)(header->cranksMaxCount * factor);
142 shouldResize = true;
143 }
144// if (header->componentsMaxCount - componentMapHeader->count < (header->componentsMaxCount * 0.1))
145// newComponentCount = (uint32)(header->componentsMaxCount * factor);
146 if (header->requestsMaxCount - requestMapHeader->count < (header->requestsMaxCount * 0.1)) {
147 newRequestCount = (uint32)(header->requestsMaxCount * factor);
148 shouldResize = true;
149 }
150
151 if (shouldResize)
152 resize(master->port, serial = master->incrementDataMapsShmemSerial(), newTypeCount, newContextCount, newTagCount, newCrankCount, newRequestCount);
153
154 mutex->leave();
155 return true;
156}
157
158
159bool DataMapsMemory::resize(uint16 port, uint32 serial, uint32 typesMaxCount, uint32 contextsMaxCount, uint32 tagsMaxCount, uint32 cranksMaxCount, uint32 requestsMaxCount) {
160 // Create and lock new mutex
161 if (!mutex)
162 mutex = new utils::Mutex(utils::StringFormat("PsycloneDataMapsMemoryMutex_%u", port).c_str(), true);
163 if (!mutex->enter(5000, __FUNCTION__)) {
164 LogPrint(0,LOG_MEMORY,0,"DataMaps Memory Mutex could not be created and locked...");
165 return false;
166 }
167
168 uint32 typesBitFieldSize = utils::Calc32BitFieldSize(typesMaxCount);
169 uint32 typesSize = sizeof(GenericMapHeader) + typesBitFieldSize + typesMaxCount*sizeof(TypeMapEntry);
170 uint32 contextsBitFieldSize = utils::Calc32BitFieldSize(contextsMaxCount);
171 uint32 contextsSize = sizeof(GenericMapHeader) + contextsBitFieldSize + contextsMaxCount*sizeof(ContextMapEntry);
172 uint32 tagsBitFieldSize = utils::Calc32BitFieldSize(tagsMaxCount);
173 uint32 tagsSize = sizeof(GenericMapHeader) + tagsBitFieldSize + tagsMaxCount*sizeof(TagMapEntry);
174 uint32 cranksBitFieldSize = utils::Calc32BitFieldSize(cranksMaxCount);
175 uint32 cranksSize = sizeof(GenericMapHeader) + cranksBitFieldSize + cranksMaxCount*sizeof(CrankMapEntry);
176// uint32 componentsBitFieldSize = utils::Calc32BitFieldSize(componentsMaxCount);
177// uint32 componentsSize = sizeof(GenericMapHeader) + componentsBitFieldSize + componentsMaxCount*sizeof(ComponentMapEntry);
178 uint32 requestsBitFieldSize = utils::Calc32BitFieldSize(requestsMaxCount);
179 uint32 requestsSize = sizeof(GenericMapHeader) + requestsBitFieldSize + requestsMaxCount*sizeof(RequestMapEntry);
180
181 uint32 newMemorySize = typesSize + contextsSize + tagsSize + cranksSize + requestsSize + sizeof(DataMapsMemoryStruct);
182
183 if (newMemorySize > 100000000) {
184 LogPrint(0,LOG_MEMORY,0,"Memory Error: DataMaps Memory requested size %s denied...", utils::BytifySize(newMemorySize).c_str());
185 mutex->leave();
186 return false;
187 }
188 else if (newMemorySize > 50000000) {
189 LogPrint(0,LOG_MEMORY,2,"Memory Warning: DataMaps Memory now %s...", utils::BytifySize(newMemorySize).c_str());
190 }
191
192 //DataMapsMemoryStruct* newHeader = (DataMapsMemoryStruct*) utils::OpenSharedMemorySegment(utils::StringFormat("PsycloneDataMapsMemory_%u_%u", port, serial).c_str(), memorySize);
193 //if (newHeader) {
194 // //utils::CloseSharedMemorySegment((char*)newHeader, newMemorySize);
195 // LogPrint(0,LOG_MEMORY,0,"DataMapsMemory removing stale shared memory (%u/%u)...", port, serial);
196 //}
197
198 DataMapsMemoryStruct* newHeader = (DataMapsMemoryStruct*) utils::CreateSharedMemorySegment(utils::StringFormat("PsycloneDataMapsMemory_%u_%u", port, serial).c_str(), newMemorySize, true);
199 if (!newHeader) {
200 mutex->leave();
201 LogPrint(0,LOG_MEMORY,0,"DataMaps Memory could not be created...");
202 return false;
203 }
204
205 memset(newHeader, 0, (size_t)memorySize);
206 newHeader->size = memorySize;
207 newHeader->cid = DATAMAPSMEMORYID;
208 newHeader->createdTime = GetTimeNow();
209 newHeader->typesMaxCount = typesMaxCount;
210 newHeader->typesBitFieldSize = typesBitFieldSize;
211 newHeader->typesSize = typesSize;
212 newHeader->contextsMaxCount = contextsMaxCount;
213 newHeader->contextsBitFieldSize = contextsBitFieldSize;
214 newHeader->contextsSize = contextsSize;
215 newHeader->tagsMaxCount = tagsMaxCount;
216 newHeader->tagsBitFieldSize = tagsBitFieldSize;
217 newHeader->tagsSize = tagsSize;
218 newHeader->cranksMaxCount = cranksMaxCount;
219 newHeader->cranksBitFieldSize = cranksBitFieldSize;
220 newHeader->cranksSize = cranksSize;
221// newHeader->componentsMaxCount = componentsMaxCount;
222// newHeader->componentsBitFieldSize = componentsBitFieldSize;
223// newHeader->componentsSize = componentsSize;
224 newHeader->requestsMaxCount = requestsMaxCount;
225 newHeader->requestsBitFieldSize = requestsBitFieldSize;
226 newHeader->requestsSize = requestsSize;
227
228 this->port = port;
229
230 GenericMapHeader* oldSubHeader = typeMapHeader;
231 typeMapHeader = (GenericMapHeader*)(((char*)newHeader) + sizeof(DataMapsMemoryStruct));
232 typeMapHeader->bitFieldSize = typesBitFieldSize;
233 typeMapHeader->size = typesSize;
234 typeMapHeader->maxID = typesMaxCount;
235 memset(((char*)typeMapHeader)+sizeof(GenericMapHeader), 255, typesBitFieldSize);
236 // Position 0 is not allowed, used to indicate error or unused
237 utils::SetBit(0, BITOCCUPIED, ((char*)typeMapHeader + sizeof(GenericMapHeader)), typeMapHeader->bitFieldSize);
238
239 if (header) {
240 // Copy bitfield
241 memcpy((char*)typeMapHeader + sizeof(GenericMapHeader),
242 (char*)oldSubHeader + sizeof(GenericMapHeader),
243 oldSubHeader->bitFieldSize);
244 // Copy data
245 memcpy((char*)typeMapHeader + sizeof(GenericMapHeader) + typesBitFieldSize,
246 (char*)oldSubHeader + sizeof(GenericMapHeader) + oldSubHeader->bitFieldSize,
247 (size_t)(oldSubHeader->size - sizeof(GenericMapHeader) - oldSubHeader->bitFieldSize));
248 }
249
250 oldSubHeader = contextMapHeader;
251 contextMapHeader = (GenericMapHeader*)(((char*)typeMapHeader) + typesSize);
252 contextMapHeader->bitFieldSize = contextsBitFieldSize;
253 contextMapHeader->size = contextsSize;
254 contextMapHeader->maxID = contextsMaxCount;
255 memset(((char*)contextMapHeader)+sizeof(GenericMapHeader), 255, contextsBitFieldSize);
256 // Position 0 is not allowed, used to indicate error or unused
257 utils::SetBit(0, BITOCCUPIED, ((char*)contextMapHeader + sizeof(GenericMapHeader)), contextMapHeader->bitFieldSize);
258 if (header) {
259 // Copy bitfield
260 memcpy((char*)contextMapHeader + sizeof(GenericMapHeader),
261 (char*)oldSubHeader + sizeof(GenericMapHeader),
262 oldSubHeader->bitFieldSize);
263 // Copy data
264 memcpy((char*)contextMapHeader + sizeof(GenericMapHeader) + contextsBitFieldSize,
265 (char*)oldSubHeader + sizeof(GenericMapHeader) + oldSubHeader->bitFieldSize,
266 (size_t)(oldSubHeader->size - sizeof(GenericMapHeader) - oldSubHeader->bitFieldSize));
267 }
268
269 oldSubHeader = tagMapHeader;
270 tagMapHeader = (GenericMapHeader*)(((char*)contextMapHeader) + contextsSize);
271 tagMapHeader->bitFieldSize = tagsBitFieldSize;
272 tagMapHeader->size = tagsSize;
273 tagMapHeader->maxID = tagsMaxCount;
274 memset(((char*)tagMapHeader)+sizeof(GenericMapHeader), 255, tagsBitFieldSize);
275 // Position 0 is not allowed, used to indicate error or unused
276 utils::SetBit(0, BITOCCUPIED, ((char*)tagMapHeader + sizeof(GenericMapHeader)), tagMapHeader->bitFieldSize);
277 if (header) {
278 // Copy bitfield
279 memcpy((char*)tagMapHeader + sizeof(GenericMapHeader),
280 (char*)oldSubHeader + sizeof(GenericMapHeader),
281 oldSubHeader->bitFieldSize);
282 // Copy data
283 memcpy((char*)tagMapHeader + sizeof(GenericMapHeader) + tagsBitFieldSize,
284 (char*)oldSubHeader + sizeof(GenericMapHeader) + oldSubHeader->bitFieldSize,
285 (size_t)(oldSubHeader->size - sizeof(GenericMapHeader) - oldSubHeader->bitFieldSize));
286 }
287
288 oldSubHeader = crankMapHeader;
289 crankMapHeader = (GenericMapHeader*)(((char*)tagMapHeader) + tagsSize);
290 crankMapHeader->bitFieldSize = cranksBitFieldSize;
291 crankMapHeader->size = cranksSize;
292 crankMapHeader->maxID = cranksMaxCount;
293 memset(((char*)crankMapHeader)+sizeof(GenericMapHeader), 255, cranksBitFieldSize);
294 // Position 0 is not allowed, used to indicate error or unused
295 utils::SetBit(0, BITOCCUPIED, ((char*)crankMapHeader + sizeof(GenericMapHeader)), crankMapHeader->bitFieldSize);
296 if (header) {
297 // Copy bitfield
298 memcpy((char*)crankMapHeader + sizeof(GenericMapHeader),
299 (char*)oldSubHeader + sizeof(GenericMapHeader),
300 oldSubHeader->bitFieldSize);
301 // Copy data
302 memcpy((char*)crankMapHeader + sizeof(GenericMapHeader) + cranksBitFieldSize,
303 (char*)oldSubHeader + sizeof(GenericMapHeader) + oldSubHeader->bitFieldSize,
304 (size_t)(oldSubHeader->size - sizeof(GenericMapHeader) - oldSubHeader->bitFieldSize));
305 }
306
307 //oldSubHeader = componentMapHeader;
308 //componentMapHeader = (GenericMapHeader*)(((char*)crankMapHeader) + cranksSize);
309 //componentMapHeader->bitFieldSize = componentsBitFieldSize;
310 //componentMapHeader->size = componentsSize;
311 //if (header) {
312 // // Copy bitfield
313 // memcpy((char*)componentMapHeader + sizeof(GenericMapHeader),
314 // (char*)oldSubHeader + sizeof(GenericMapHeader),
315 // oldSubHeader->bitFieldSize);
316 // // Copy data
317 // memcpy((char*)componentMapHeader + sizeof(GenericMapHeader) + componentsBitFieldSize,
318 // (char*)oldSubHeader + sizeof(GenericMapHeader) + oldSubHeader->bitFieldSize,
319 // oldSubHeader->size - sizeof(GenericMapHeader) - oldSubHeader->bitFieldSize);
320 //}
321
322 oldSubHeader = requestMapHeader;
323 requestMapHeader = (GenericMapHeader*)(((char*)crankMapHeader) + cranksSize);
324 requestMapHeader->bitFieldSize = requestsBitFieldSize;
325 requestMapHeader->size = requestsSize;
326 requestMapHeader->maxID = requestsMaxCount;
327 memset(((char*)requestMapHeader)+sizeof(GenericMapHeader), 255, requestsBitFieldSize);
328 // Position 0 is not allowed, used to indicate error or unused
329 utils::SetBit(0, BITOCCUPIED, ((char*)requestMapHeader + sizeof(GenericMapHeader)), requestMapHeader->bitFieldSize);
330 if (header) {
331 // Copy bitfield
332 memcpy((char*)requestMapHeader + sizeof(GenericMapHeader),
333 (char*)oldSubHeader + sizeof(GenericMapHeader),
334 oldSubHeader->bitFieldSize);
335 // Copy data
336 memcpy((char*)requestMapHeader + sizeof(GenericMapHeader) + requestsBitFieldSize,
337 (char*)oldSubHeader + sizeof(GenericMapHeader) + oldSubHeader->bitFieldSize,
338 (size_t)(oldSubHeader->size - sizeof(GenericMapHeader) - oldSubHeader->bitFieldSize));
339 }
340
341 if (header)
342 utils::CloseSharedMemorySegment((char*)header, header->size);
343 header = newHeader;
344 memorySize = newMemorySize;
345
346 //utils::Sleep(10);
347 master->setDataMapsShmemSize(memorySize);
348 mutex->leave();
349 return true;
350}
351
352
353
354
355
356
358 if (!mutex || !mutex->enter(5000, __FUNCTION__))
359 return false;
361 bool result = GenericMemoryMap<TypeMapEntry, uint16>::ConfirmEntry((char*)typeMapHeader, id);
362 mutex->leave();
363 return result;
364}
365
367 if (!mutex || !mutex->enter(5000, __FUNCTION__))
368 return false;
370 bool result = GenericMemoryMap<TypeMapEntry, uint16>::CancelEntry((char*)typeMapHeader, id);
371 mutex->leave();
372 return result;
373}
374
376 if (!mutex || !mutex->enter(5000, __FUNCTION__))
377 return false;
379 bool result = GenericMemoryMap<TypeMapEntry, uint16>::WriteAllIDsToMsg("subtype", (char*)typeMapHeader, msg);
380 if (!result) {
381 mutex->leave();
382 return result;
383 }
384 result = GenericMemoryMap<TypeMapEntry, uint16>::WriteAllIDsToMsg("subcontext", (char*)contextMapHeader, msg);
385 mutex->leave();
386 return result;
387}
388
389
391 if (!mutex || !mutex->enter(5000, __FUNCTION__))
392 return false;
394 bool result = GenericMemoryMap<TypeMapEntry, uint16>::WriteAllEntriesToMsg((char*)typeMapHeader, msg);
395 mutex->leave();
396 return result;
397}
398
400 int64 n = 0;
401 uint16 id;
402 const char* name;
403 uint64 time;
404 uint16 exID;
405 while ( (id = (uint16)msg->getInt(n, "ID")) && (name = msg->getString(n, "Name")) && (time = msg->getTime(n, "CreatedTime"))) {
406 if (!createNewTypeLevel(id, name, time, exID))
407 return false;
409 n++;
410 }
411 return true;
412}
413
415 if (!mutex || !mutex->enter(5000, __FUNCTION__))
416 return false;
418 bool result = GenericMemoryMap<TypeMapEntry, uint16>::WriteAllEntriesToMsg((char*)contextMapHeader, msg);
419 mutex->leave();
420 return result;
421}
422
424 int64 n = 0;
425 uint16 id;
426 const char* name;
427 uint64 time;
428 uint16 exID;
429 while ((id = (uint16)msg->getInt(n, "ID")) && (name = msg->getString(n, "Name")) && (time = msg->getTime(n, "CreatedTime"))) {
430 if (!createNewContextLevel(id, name, time, exID))
431 return false;
433 n++;
434 }
435 return true;
436}
437
439 if (!mutex || !mutex->enter(5000, __FUNCTION__))
440 return false;
442 bool result = GenericMemoryMap<TypeMapEntry, uint16>::WriteAllEntriesToMsg((char*)tagMapHeader, msg);
443 mutex->leave();
444 return result;
445}
446
448 int64 n = 0;
449 uint16 id;
450 const char* name;
451 uint64 time;
452 uint32 exID;
453 while ((id = (uint16)msg->getInt(n, "ID")) && (name = msg->getString(n, "Name")) && (time = msg->getTime(n, "CreatedTime"))) {
454 if (!createNewTag(id, name, time, exID))
455 return false;
456 confirmTagID(id);
457 n++;
458 }
459 return true;
460}
461
463 if (!mutex || !mutex->enter(5000, __FUNCTION__))
464 return false;
466 bool result = GenericMemoryMap<TypeMapEntry, uint16>::WriteAllEntriesToMsg((char*)crankMapHeader, msg);
467 mutex->leave();
468 return result;
469}
470
472 int64 n = 0;
473 uint16 id;
474 const char* name, *function, *libraryFilename, *language, *script;
475 uint64 time;
476 uint16 exID;
477 while ((id = (uint16)msg->getInt(n, "ID")) && (name = msg->getString(n, "Name")) && (time = msg->getTime(n, "CreatedTime"))) {
478 function = msg->getString(n, "Function");
479 libraryFilename = msg->getString(n, "LibraryFilename");
480 language = msg->getString(n, "Language");
481 script = msg->getString(n, "Script");
482 if (!createNewCrank(id, (uint16) msg->getInt(n, "CompID"), name, function ? function : "",
483 libraryFilename ? libraryFilename : "", language ? language : "", script ? script : "", time, exID))
484 return false;
485 confirmCrankID(id);
486 n++;
487 }
488 return true;
489}
490
491
492bool DataMapsMemory::createNewTypeLevel(uint16 id, const char* name, uint64 time, uint16& existingID) {
493 if (!mutex || !mutex->enter(5000, __FUNCTION__))
494 return false;
496
497 existingID = GenericMemoryMap<TypeMapEntry, uint16>::GetEntryID((char*)typeMapHeader, name, true);
498 if (existingID && (existingID != id)) {
499 mutex->leave();
500 return false;
501 }
502
503 if (id > header->typesMaxCount) {
504 // printf("createNewTypeLevel ID %u > typesMax %u\n", id, header->typesMaxCount);
505 if (!resize(port, serial = master->incrementDataMapsShmemSerial(), id + 1024, header->contextsMaxCount, header->tagsMaxCount, header->cranksMaxCount, header->requestsMaxCount)) {
506 mutex->leave();
507 printf("createNewTypeLevel resize failed\n");
508 return false;
509 }
510 // printf("createNewTypeLevel typesMax %u after resize\n", header->typesMaxCount);
511 }
512
513 TypeMapEntry* entry = GenericMemoryMap<TypeMapEntry, uint16>::CreateEntry((char*)typeMapHeader, id, name);
514 if (!entry) {
515 entry = GenericMemoryMap<TypeMapEntry, uint16>::GetEntry((char*)typeMapHeader, id);
516 if (!entry) {
517 printf("createNewTypeLevel '%s' %u failed\n", name, id); fflush(stdout);
518 }
519 else {
520 printf("createNewTypeLevel '%s' %u failed - existing entry: '%s'\n", name, id, entry->name); fflush(stdout);
521 }
522 mutex->leave();
523 return false;
524 }
525 //printf("createNewTypeLevel '%s' %u success\n", name, id); fflush(stdout);
526 if (time)
527 entry->time = time;
528 mutex->leave();
529 return true;
530}
531
532
533bool DataMapsMemory::getTypeLevelName(uint16 id, char* name, uint32 maxSize) {
534 if (!mutex || !mutex->enter(5000, __FUNCTION__))
535 return false;
537 if (GenericMemoryMap<TypeMapEntry, uint16>::GetEntryName((char*)typeMapHeader, id, name, maxSize)) {
538 mutex->leave();
539 return true;
540 }
541 else {
542 mutex->leave();
543 return false;
544 }
545}
546
547
548bool DataMapsMemory::getTypeLevelID(const char* name, uint16 &id) {
549 if (!mutex || !mutex->enter(5000, __FUNCTION__))
550 return false;
552 id = GenericMemoryMap<TypeMapEntry, uint16>::GetEntryID((char*)typeMapHeader, name);
553 if (id) {
554 mutex->leave();
555 return true;
556 }
557 else {
558 mutex->leave();
559 return false;
560 }
561}
562
563
564uint8 DataMapsMemory::lookupTypeLevelID(const char* name, uint16 &id) { // status = 0: not there, 1: in-sync, 2: ready
565 if (!mutex || !mutex->enter(5000, __FUNCTION__))
566 return false;
568 uint8 status = GenericMemoryMap<TypeMapEntry, uint16>::LookupEntryID((char*)typeMapHeader, name, id);
569 mutex->leave();
570 return status;
571}
572
573
574bool DataMapsMemory::deleteTypeLevel(const char* name) {
575 if (!mutex || !mutex->enter(5000, __FUNCTION__))
576 return false;
578 uint16 id = GenericMemoryMap<TypeMapEntry, uint16>::GetEntryID((char*)typeMapHeader, name);
579 if (id && GenericMemoryMap<TypeMapEntry, uint16>::DeleteEntry((char*)typeMapHeader, id)) {
580 mutex->leave();
581 return true;
582 }
583 else {
584 mutex->leave();
585 return false;
586 }
587}
588
589
591 if (!mutex || !mutex->enter(5000, __FUNCTION__))
592 return false;
594 if (GenericMemoryMap<TypeMapEntry, uint16>::DeleteEntry((char*)typeMapHeader, id)) {
595 mutex->leave();
596 return true;
597 }
598 else {
599 mutex->leave();
600 return false;
601 }
602}
603
604
606 if (!mutex || !mutex->enter(5000, __FUNCTION__))
607 return false;
609 uint64 t = GenericMemoryMap<TypeMapEntry, uint16>::GetEntryTime((char*)typeMapHeader, id);
610 mutex->leave();
611 return t;
612}
613
615 std::string str;
616 if (!mutex || !mutex->enter(5000, __FUNCTION__))
617 return str;
620 mutex->leave();
621 return str;
622}
623
624
625
627// ContextMap //
629
630
632 if (!mutex || !mutex->enter(5000, __FUNCTION__))
633 return false;
635 bool result = GenericMemoryMap<ContextMapEntry, uint16>::ConfirmEntry((char*)contextMapHeader, id);
636 mutex->leave();
637 return result;
638}
639
641 if (!mutex || !mutex->enter(5000, __FUNCTION__))
642 return false;
644 bool result = GenericMemoryMap<ContextMapEntry, uint16>::CancelEntry((char*)contextMapHeader, id);
645 mutex->leave();
646 return result;
647}
648
649bool DataMapsMemory::createNewContextLevel(uint16 id, const char* name, uint64 time, uint16& existingID) {
650 if (!mutex || !mutex->enter(5000, __FUNCTION__))
651 return false;
653
654 existingID = GenericMemoryMap<ContextMapEntry, uint16>::GetEntryID((char*)contextMapHeader, name, true);
655 if (existingID && (existingID != id)) {
656 mutex->leave();
657 return false;
658 }
659
660 if (id > header->contextsMaxCount) {
661 if (!resize(port, serial = master->incrementDataMapsShmemSerial(), header->typesMaxCount, id + 1024, header->tagsMaxCount, header->cranksMaxCount, header->requestsMaxCount)) {
662 mutex->leave();
663 return false;
664 }
665 }
666
667 ContextMapEntry* entry = GenericMemoryMap<ContextMapEntry, uint16>::CreateEntry((char*)contextMapHeader, id, name);
668 if (!entry) {
669 mutex->leave();
670 return false;
671 }
672 if (time)
673 entry->time = time;
674 mutex->leave();
675 return true;
676}
677
678
679bool DataMapsMemory::getContextLevelName(uint16 id, char* name, uint32 maxSize) {
680 if (!mutex || !mutex->enter(5000, __FUNCTION__))
681 return false;
683 if (GenericMemoryMap<ContextMapEntry, uint16>::GetEntryName((char*)contextMapHeader, id, name, maxSize)) {
684 mutex->leave();
685 return true;
686 }
687 else {
688 mutex->leave();
689 return false;
690 }
691}
692
693
694bool DataMapsMemory::getContextLevelID(const char* name, uint16 &id) {
695 if (!mutex || !mutex->enter(5000, __FUNCTION__))
696 return false;
698 id = GenericMemoryMap<ContextMapEntry, uint16>::GetEntryID((char*)contextMapHeader, name);
699 if (id) {
700 mutex->leave();
701 return true;
702 }
703 else {
704 mutex->leave();
705 return false;
706 }
707}
708
709uint8 DataMapsMemory::lookupContextLevelID(const char* name, uint16 &id) { // status = 0: not there, 1: in-sync, 2: ready
710 if (!mutex || !mutex->enter(5000, __FUNCTION__))
711 return false;
713 uint8 status = GenericMemoryMap<ContextMapEntry, uint16>::LookupEntryID((char*)contextMapHeader, name, id);
714 mutex->leave();
715 return status;
716}
717
719 if (!mutex || !mutex->enter(5000, __FUNCTION__))
720 return false;
722 uint16 id = GenericMemoryMap<ContextMapEntry, uint16>::GetEntryID((char*)contextMapHeader, name);
723 if (id && GenericMemoryMap<ContextMapEntry, uint16>::DeleteEntry((char*)contextMapHeader, id)) {
724 mutex->leave();
725 return true;
726 }
727 else {
728 mutex->leave();
729 return false;
730 }
731}
732
733
735 if (!mutex || !mutex->enter(5000, __FUNCTION__))
736 return false;
738 if (GenericMemoryMap<ContextMapEntry, uint16>::DeleteEntry((char*)contextMapHeader, id)) {
739 mutex->leave();
740 return true;
741 }
742 else {
743 mutex->leave();
744 return false;
745 }
746}
747
748
750 if (!mutex || !mutex->enter(5000, __FUNCTION__))
751 return false;
753 uint64 t = GenericMemoryMap<ContextMapEntry, uint16>::GetEntryTime((char*)contextMapHeader, id);
754 mutex->leave();
755 return t;
756}
757
759 std::string str;
760 if (!mutex || !mutex->enter(5000, __FUNCTION__))
761 return str;
763 str = GenericMemoryMap<TypeMapEntry, uint16>::PrintAllEntries((char*)contextMapHeader);
764 mutex->leave();
765 return str;
766}
767
768
769
771// TagMap //
773
774
776 if (!mutex || !mutex->enter(5000, __FUNCTION__))
777 return false;
779 bool result = GenericMemoryMap<TagMapEntry, uint16>::ConfirmEntry((char*)tagMapHeader, id);
780 mutex->leave();
781 return result;
782}
783
785 if (!mutex || !mutex->enter(5000, __FUNCTION__))
786 return false;
788 bool result = GenericMemoryMap<TagMapEntry, uint16>::CancelEntry((char*)tagMapHeader, id);
789 mutex->leave();
790 return result;
791}
792
793bool DataMapsMemory::createNewTag(uint32 id, const char* name, uint64 time, uint32& existingID) {
794 if (!mutex || !mutex->enter(5000, __FUNCTION__))
795 return false;
797
798 existingID = GenericMemoryMap<TagMapEntry, uint16>::GetEntryID((char*)tagMapHeader, name, true);
799 if (existingID && (existingID != id)) {
800 mutex->leave();
801 return false;
802 }
803
804 if (id > header->tagsMaxCount) {
805 if (!resize(port, serial = master->incrementDataMapsShmemSerial(), header->typesMaxCount, header->contextsMaxCount, id + 1024, header->cranksMaxCount, header->requestsMaxCount)) {
806 mutex->leave();
807 return false;
808 }
809 }
810
811 TagMapEntry* entry = GenericMemoryMap<TagMapEntry, uint16>::CreateEntry((char*)tagMapHeader, id, name);
812 if (!entry) {
813 mutex->leave();
814 return false;
815 }
816 if (time)
817 entry->time = time;
818 mutex->leave();
819 return true;
820}
821
822
823bool DataMapsMemory::getTagName(uint32 id, char* name, uint32 maxSize) {
824 if (!mutex || !mutex->enter(5000, __FUNCTION__))
825 return false;
827 if (GenericMemoryMap<TagMapEntry, uint16>::GetEntryName((char*)tagMapHeader, id, name, maxSize)) {
828 mutex->leave();
829 return true;
830 }
831 else {
832 mutex->leave();
833 return false;
834 }
835}
836
837
838bool DataMapsMemory::getTagID(const char* name, uint32 &id) {
839 if (!mutex || !mutex->enter(5000, __FUNCTION__))
840 return false;
842 id = GenericMemoryMap<TagMapEntry, uint16>::GetEntryID((char*)tagMapHeader, name);
843 if (id) {
844 mutex->leave();
845 return true;
846 }
847 else {
848 mutex->leave();
849 return false;
850 }
851}
852
853
854uint8 DataMapsMemory::lookupTagID(const char* name, uint32 &id) { // status = 0: not there, 1: in-sync, 2: ready
855 if (!mutex || !mutex->enter(5000, __FUNCTION__))
856 return false;
858 uint8 status = GenericMemoryMap<TagMapEntry, uint32>::LookupEntryID((char*)tagMapHeader, name, id);
859 mutex->leave();
860 return status;
861}
862
863
864bool DataMapsMemory::deleteTag(const char* name) {
865 if (!mutex || !mutex->enter(5000, __FUNCTION__))
866 return false;
868 uint32 id = GenericMemoryMap<TagMapEntry, uint16>::GetEntryID((char*)tagMapHeader, name);
869 if (id && GenericMemoryMap<TagMapEntry, uint16>::DeleteEntry((char*)tagMapHeader, id)) {
870 mutex->leave();
871 return true;
872 }
873 else {
874 mutex->leave();
875 return false;
876 }
877}
878
879
881 if (!mutex || !mutex->enter(5000, __FUNCTION__))
882 return false;
884 if (GenericMemoryMap<TagMapEntry, uint16>::DeleteEntry((char*)tagMapHeader, id)) {
885 mutex->leave();
886 return true;
887 }
888 else {
889 mutex->leave();
890 return false;
891 }
892}
893
894
896 if (!mutex || !mutex->enter(5000, __FUNCTION__))
897 return false;
899 uint64 t = GenericMemoryMap<TagMapEntry, uint16>::GetEntryTime((char*)tagMapHeader, id);
900 mutex->leave();
901 return t;
902}
903
904
905
906
907
908
910// CrankMap //
912
913
915 if (!mutex || !mutex->enter(5000, __FUNCTION__))
916 return false;
918 bool result = GenericMemoryMap<CrankMapEntry, uint16>::ConfirmEntry((char*)crankMapHeader, id);
919 mutex->leave();
920 return result;
921}
922
924 if (!mutex || !mutex->enter(5000, __FUNCTION__))
925 return false;
927 bool result = GenericMemoryMap<CrankMapEntry, uint16>::CancelEntry((char*)crankMapHeader, id);
928 mutex->leave();
929 return result;
930}
931
932bool DataMapsMemory::createNewCrank(uint16 id, uint32 compID, const char* name, const char* function, const char* libraryFilename, const char* language, const char* script, uint64 time, uint16& existingID) {
933 if (!mutex || !mutex->enter(5000, __FUNCTION__))
934 return false;
936
937 existingID = GenericMemoryMap<CrankMapEntry, uint16>::GetEntryID((char*)crankMapHeader, name, true);
938 if (existingID && (existingID != id)) {
939 mutex->leave();
940 return false;
941 }
942
943 if (id > header->cranksMaxCount) {
944 if (!resize(port, serial = master->incrementDataMapsShmemSerial(), header->typesMaxCount, header->contextsMaxCount, header->tagsMaxCount, id + 1024, header->requestsMaxCount)) {
945 mutex->leave();
946 return false;
947 }
948 }
949
950 CrankMapEntry* entry = GenericMemoryMap<CrankMapEntry, uint16>::CreateEntry((char*)crankMapHeader, id, name);
951 if (!entry) {
952 mutex->leave();
953 return false;
954 }
955 entry->compID = compID;
956 if (time)
957 entry->time = time;
958 utils::strcpyavail(entry->language, language, MAXKEYNAMELEN, false);
959 utils::strcpyavail(entry->function, function, MAXKEYNAMELEN, false);
960 utils::strcpyavail(entry->libraryFilename, libraryFilename, MAXKEYNAMELEN, false);
961 utils::strcpyavail(entry->script, script, MAXSCRIPTLEN, false);
962 mutex->leave();
963 return true;
964}
965
966bool DataMapsMemory::getCrankFunction(uint16 id, char* function, uint32 maxSize) {
967 if (!mutex || !mutex->enter(5000, __FUNCTION__))
968 return false;
970 CrankMapEntry* entry = GenericMemoryMap<CrankMapEntry, uint16>::GetEntry((char*)crankMapHeader, id);
971 if (entry) {
972 utils::strcpyavail(function, entry->function, maxSize, false);
973 mutex->leave();
974 return true;
975 }
976 else {
977 mutex->leave();
978 return false;
979 }
980}
981
982bool DataMapsMemory::getCrankLanguage(uint16 id, char* language, uint32 maxSize) {
983 if (!mutex || !mutex->enter(5000, __FUNCTION__))
984 return false;
986 CrankMapEntry* entry = GenericMemoryMap<CrankMapEntry, uint16>::GetEntry((char*)crankMapHeader, id);
987 if (entry) {
988 utils::strcpyavail(language, entry->language, maxSize, false);
989 mutex->leave();
990 return true;
991 }
992 else {
993 mutex->leave();
994 return false;
995 }
996}
997
998//static
999bool DataMapsMemory::getCrankLibraryFilename(uint16 id, char* libraryFilename, uint32 maxSize) {
1000 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1001 return false;
1003 CrankMapEntry* entry = GenericMemoryMap<CrankMapEntry, uint16>::GetEntry((char*)crankMapHeader, id);
1004 if (entry) {
1005 utils::strcpyavail(libraryFilename, entry->libraryFilename, maxSize, false);
1006 mutex->leave();
1007 return true;
1008 }
1009 else {
1010 mutex->leave();
1011 return false;
1012 }
1013}
1014
1015
1016bool DataMapsMemory::getCrankScript(uint16 id, char* script, uint32 maxSize) {
1017 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1018 return false;
1020 CrankMapEntry* entry = GenericMemoryMap<CrankMapEntry, uint16>::GetEntry((char*)crankMapHeader, id);
1021 if (entry) {
1022 utils::strcpyavail(script, entry->script, maxSize, false);
1023 mutex->leave();
1024 return true;
1025 }
1026 else {
1027 mutex->leave();
1028 return false;
1029 }
1030}
1031
1032
1033bool DataMapsMemory::getCrankName(uint16 id, char* name, uint32 maxSize) {
1034 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1035 return false;
1037 if (GenericMemoryMap<CrankMapEntry, uint16>::GetEntryName((char*)crankMapHeader, id, name, maxSize)) {
1038 mutex->leave();
1039 return true;
1040 }
1041 else {
1042 mutex->leave();
1043 return false;
1044 }
1045}
1046
1047
1048bool DataMapsMemory::getCrankID(const char* name, uint16 &id) {
1049 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1050 return false;
1052 id = GenericMemoryMap<CrankMapEntry, uint16>::GetEntryID((char*)crankMapHeader, name);
1053 if (id) {
1054 mutex->leave();
1055 return true;
1056 }
1057 else {
1058 mutex->leave();
1059 return false;
1060 }
1061}
1062
1063uint8 DataMapsMemory::lookupCrankID(const char* name, uint16 &id) { // status = 0: not there, 1: in-sync, 2: ready
1064 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1065 return false;
1067 uint8 status = GenericMemoryMap<CrankMapEntry, uint16>::LookupEntryID((char*)crankMapHeader, name, id);
1068 mutex->leave();
1069 return status;
1070}
1071
1073 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1074 return 0;
1076 CrankMapEntry* entry = GenericMemoryMap<CrankMapEntry, uint16>::GetEntry((char*)crankMapHeader, id);
1077 if (entry) {
1078 uint32 compID = entry->compID;
1079 mutex->leave();
1080 return compID;
1081 }
1082 else {
1083 mutex->leave();
1084 return 0;
1085 }
1086}
1087
1088bool DataMapsMemory::deleteCrank(const char* name) {
1089 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1090 return false;
1092 uint16 id = GenericMemoryMap<CrankMapEntry, uint16>::GetEntryID((char*)crankMapHeader, name);
1093 if (id && GenericMemoryMap<CrankMapEntry, uint16>::DeleteEntry((char*)crankMapHeader, id)) {
1094 mutex->leave();
1095 return true;
1096 }
1097 else {
1098 mutex->leave();
1099 return false;
1100 }
1101}
1102
1103
1105 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1106 return false;
1108 if (GenericMemoryMap<CrankMapEntry, uint16>::DeleteEntry((char*)crankMapHeader, id)) {
1109 mutex->leave();
1110 return true;
1111 }
1112 else {
1113 mutex->leave();
1114 return false;
1115 }
1116}
1117
1118
1120 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1121 return false;
1123 uint64 t = GenericMemoryMap<CrankMapEntry, uint16>::GetEntryTime((char*)crankMapHeader, id);
1124 mutex->leave();
1125 return t;
1126}
1127
1128
1129
1130
1131
1132
1134// RequestMap //
1136
1137bool DataMapsMemory::createNewRequest(uint32 from, uint32 to, uint32 remoteID, uint32 &id) {
1138 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1139 return false;
1141
1142 RequestMapEntry* entry = GenericMemoryMap<RequestMapEntry, uint32>::CreateFirstFreeEntry((char*)requestMapHeader, id, NULL);
1143 if (!entry) {
1144 if (!maintenance()) {
1145 mutex->leave();
1146 return false;
1147 }
1149 if (!(entry = GenericMemoryMap<RequestMapEntry, uint32>::CreateFirstFreeEntry((char*)requestMapHeader, id, NULL))) {
1150 mutex->leave();
1151 return false;
1152 }
1153 }
1154 entry->status = REQ_CREATED;
1155 entry->time = GetTimeNow();
1156 entry->from = from;
1157 entry->to = to;
1158 entry->remoteID = remoteID;
1159 entry->lastUpdate = 0;
1160 entry->status = 2; // No need to sync between nodes, so just confirm the entry id as valid
1161 snprintf(entry->name, MAXKEYNAMELEN, "ReqPsycloneProcessMemoryRequest_%u_%u", port, id);
1162 LogPrint(0,LOG_MEMORY,5,"Creating request (%p) id %u...", entry, id);
1163 mutex->leave();
1164 return true;
1165}
1166
1167bool DataMapsMemory::getRequestInfo(uint32 id, uint32& from, uint32& to, uint32& remoteID) {
1168 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1169 return false;
1171 RequestMapEntry* entry = GenericMemoryMap<RequestMapEntry, uint32>::GetEntry((char*)requestMapHeader, id);
1172 if (entry) {
1173 from = entry->from;
1174 to = entry->to;
1175 remoteID = entry->remoteID;
1176 mutex->leave();
1177 return true;
1178 }
1179 else {
1180 mutex->leave();
1181 return false;
1182 }
1183}
1184
1185bool DataMapsMemory::getRequestStatus(uint32 id, uint8& status, uint64& time, uint64& msgID, uint64& msgEOL) {
1186 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1187 return false;
1189 RequestMapEntry* entry = GenericMemoryMap<RequestMapEntry, uint32>::GetEntry((char*)requestMapHeader, id);
1190 if (entry) {
1191 status = entry->status;
1192 time = entry->lastUpdate;
1193 msgID = entry->dataMessageID;
1194 msgEOL = entry->dataMessageEOL;
1195 mutex->leave();
1196 return true;
1197 }
1198 else {
1199 mutex->leave();
1200 return false;
1201 }
1202}
1203
1204bool DataMapsMemory::setRequestStatus(uint32 id, uint8 status) {
1205 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1206 return false;
1208 RequestMapEntry* entry = GenericMemoryMap<RequestMapEntry, uint32>::GetEntry((char*)requestMapHeader, id);
1209 if (entry) {
1210 entry->status = status;
1211 entry->lastUpdate = GetTimeNow();
1212 mutex->leave();
1213 utils::SignalSemaphore(entry->name);
1214 return true;
1215 }
1216 else {
1217 mutex->leave();
1218 return false;
1219 }
1220}
1221
1222bool DataMapsMemory::setRequestStatus(uint32 id, uint8 status, uint64 msgID, uint64 msgEOL) {
1223 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1224 return false;
1226 RequestMapEntry* entry = GenericMemoryMap<RequestMapEntry, uint32>::GetEntry((char*)requestMapHeader, id);
1227 if (entry) {
1228 entry->status = status;
1229 entry->lastUpdate = GetTimeNow();
1230 entry->dataMessageID = msgID;
1231 entry->dataMessageEOL = msgEOL;
1232 LogPrint(0,LOG_MEMORY,5,"setRequestStatus (%p) id %u status %u (last update %s)", entry, id, status, PrintTimeString(entry->lastUpdate).c_str());
1233 mutex->leave();
1234 utils::SignalSemaphore(entry->name);
1235 return true;
1236 }
1237 else {
1238 LogPrint(0,LOG_MEMORY,0,"setRequestStatus id %u failed", id);
1239 mutex->leave();
1240 return false;
1241 }
1242}
1243
1244bool DataMapsMemory::waitForRequestReply(uint32 id, uint32 timeout, uint8& status, uint64& time, uint64& msgID, uint64& msgEOL) {
1245 uint64 start = GetTimeNow();
1246 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1247 return false;
1249 RequestMapEntry* entry = GenericMemoryMap<RequestMapEntry, uint32>::GetEntry((char*)requestMapHeader, id);
1250 if (!entry) {
1251 mutex->leave();
1252 return false;
1253 }
1254
1255 LogPrint(0,LOG_MEMORY,5,"Start waitForRequestReply (%p) id %u status %u (last update %s)", entry, id, entry->status, PrintTimeString(time).c_str());
1256
1257 int32 timeleft;
1258 while ( (entry->status < REQ_REPLY_READY) && ( (timeleft = timeout - GetTimeAgeMS(start)) > 0) ) {
1259 // get semaphore
1260 mutex->leave();
1261 // wait for timeleft for semaphore
1262 utils::WaitForSemaphore(entry->name, timeleft);
1263 if (!mutex->enter(5000, __FUNCTION__)) {
1264 // printf("MUTEX!");
1265 return false;
1266 }
1268 if (!(entry = GenericMemoryMap<RequestMapEntry, uint32>::GetEntry((char*)requestMapHeader, id))) {
1269 // printf("ENTRY!");
1270 mutex->leave();
1271 return false;
1272 }
1273 }
1274
1275 // Here we will have the mutex
1276 status = entry->status;
1277 time = entry->lastUpdate;
1278 msgID = entry->dataMessageID;
1279 msgEOL = entry->dataMessageEOL;
1280
1281 mutex->leave();
1282 if (!(status >= REQ_REPLY_READY))
1283 LogPrint(0,LOG_MEMORY,0,"waitForRequestReply (%p) id %u timed out, status %u (last update %s)", entry, id, status, PrintTimeString(time).c_str());
1284 return (status >= REQ_REPLY_READY);
1285}
1286
1288 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1289 return false;
1291 LogPrint(0,LOG_MEMORY,5,"Deleting request id %u...", id);
1292 if (id && GenericMemoryMap<RequestMapEntry, uint32>::DeleteEntry((char*)requestMapHeader, id)) {
1293 mutex->leave();
1294 return true;
1295 }
1296 else {
1297 mutex->leave();
1298 return false;
1299 }
1300}
1301
1303 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1304 return false;
1306 uint32 count = GenericMemoryMap<RequestMapEntry, uint32>::GetCount((char*)requestMapHeader);
1307 mutex->leave();
1308 return count;
1309}
1310
1311
1313 std::string str;
1314 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1315 return str;
1317 str = "<B>Types</B><BR><table border=1>";
1319 str += "</table><B>Contexts</B><BR><table border=1>";
1321 str += "</table><B>Tags</B><BR><table border=1>";
1323 str += "</table><B>Crank</B><BR><table border=1>";
1325 str += "</table><B>Requests</B><BR><table border=1>";
1327 mutex->leave();
1328 return str;
1329}
1330
1332 std::string xml;
1333 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1334 return xml;
1336 xml += GenericMemoryMap<TypeMapEntry, uint16>::ToXML((char*)typeMapHeader);
1337 xml += GenericMemoryMap<ContextMapEntry, uint16>::ToXML((char*)contextMapHeader);
1338 xml += GenericMemoryMap<TagMapEntry, uint16>::ToXML((char*)tagMapHeader);
1339 xml += GenericMemoryMap<CrankMapEntry, uint16>::ToXML((char*)crankMapHeader);
1340 // xml += GenericMemoryMap<RequestMapEntry, uint16>::ToXML((char*)requestMapHeader);
1341 mutex->leave();
1342 return utils::StringFormat("<ids>\n%s</ids>\n", xml.c_str());
1343}
1344
1345
1346} // namespace cmlabs
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
Shared-memory name/id maps: message types, contexts, tags, cranks and cross-process requests.
#define REQ_REPLY_READY
#define REQ_CREATED
#define CHECKDATAMAPSMEMORYSERIAL
Re-open the data-maps segment if the master's resize serial no longer matches ours; bails out of the ...
#define DATAMAPSMEMORYID
Definition ObjectIDs.h:51
#define BITOCCUPIED
Definition Types.h:34
#define MAXKEYNAMELEN
Definition Utils.h:85
#define LOG_MEMORY
Definition Utils.h:199
#define LogPrint
Definition Utils.h:313
#define MAXSCRIPTLEN
Definition Utils.h:91
bool getTypeLevelID(const char *name, uint16 &id)
bool syncContextLevels(DataMessage *msg)
bool waitForRequestReply(uint32 id, uint32 timeout, uint8 &status, uint64 &time, uint64 &msgID, uint64 &msgEOL)
bool confirmContextLevelID(uint16 id)
DataMapsMemory(MasterMemory *master)
bool createNewCrank(uint16 id, uint32 compID, const char *name, const char *function, const char *libraryFilename, const char *language, const char *script, uint64 time, uint16 &existingID)
bool getRequestStatus(uint32 id, uint8 &status, uint64 &time, uint64 &msgID, uint64 &msgEOL)
bool createNewTag(uint32 id, const char *name, uint64 time, uint32 &existingID)
bool getTagName(uint32 id, char *name, uint32 maxSize)
bool create(uint32 typesMaxCount, uint32 contextsMaxCount, uint32 tagsMaxCount, uint32 cranksMaxCount, uint32 requestsMaxCount)
Create the segment (master only) with the given per-map capacities.
bool writeTagsToMsg(DataMessage *msg)
bool getTagID(const char *name, uint32 &id)
bool deleteContextLevel(const char *name)
uint64 getTagCreateTime(uint32 id)
uint64 getTypeLevelCreateTime(uint16 id)
uint8 lookupTagID(const char *name, uint32 &id)
bool deleteRequest(uint32 id)
bool cancelCrankID(uint16 id)
bool getContextLevelName(uint16 id, char *name, uint32 maxSize)
bool maintenance()
Periodic cleanup (e.g.
bool confirmTypeLevelID(uint16 id)
uint8 lookupTypeLevelID(const char *name, uint16 &id)
bool writeContextLevelsToMsg(DataMessage *msg)
bool open()
Attach to the existing data-maps segment.
bool getRequestInfo(uint32 id, uint32 &from, uint32 &to, uint32 &remoteID)
bool createNewTypeLevel(uint16 id, const char *name, uint64 time, uint16 &existingID)
bool getCrankFunction(uint16 id, char *function, uint32 maxSize)
bool writeIDsToMsg(DataMessage *msg)
Write all map names/ids into msg for cluster sync.
bool syncCranks(DataMessage *msg)
bool cancelContextLevelID(uint16 id)
bool getCrankLanguage(uint16 id, char *language, uint32 maxSize)
bool confirmTagID(uint32 id)
bool setRequestStatus(uint32 id, uint8 status)
bool writeTypeLevelsToMsg(DataMessage *msg)
bool syncTags(DataMessage *msg)
bool getContextLevelID(const char *name, uint16 &id)
bool confirmCrankID(uint16 id)
uint32 getCrankCompID(uint16 id)
bool getMemoryUsage(uint64 &alloc, uint64 &usage)
Report allocation/usage.
uint64 getCrankCreateTime(uint16 id)
bool cancelTagID(uint32 id)
bool syncTypeLevels(DataMessage *msg)
bool deleteTag(const char *name)
bool cancelTypeLevelID(uint16 id)
bool createNewContextLevel(uint16 id, const char *name, uint64 time, uint16 &existingID)
uint8 lookupContextLevelID(const char *name, uint16 &id)
bool getCrankID(const char *name, uint16 &id)
bool getCrankName(uint16 id, char *name, uint32 maxSize)
bool getCrankLibraryFilename(uint16 id, char *libraryFilename, uint32 maxSize)
uint64 getContextLevelCreateTime(uint16 id)
bool writeCranksToMsg(DataMessage *msg)
uint8 lookupCrankID(const char *name, uint16 &id)
bool getCrankScript(uint16 id, char *script, uint32 maxSize)
bool createNewRequest(uint32 from, uint32 to, uint32 remoteID, uint32 &id)
bool getTypeLevelName(uint16 id, char *name, uint32 maxSize)
bool deleteTypeLevel(const char *name)
The central Psyclone data container: a self-contained binary message with typed, named user entries.
bool getInt(const char *key, int64 &value)
getInt(const char* key, int64& value)
uint64 getTime(const char *key)
getTime(const char* key)
const char * getString(const char *key)
getString(const char* key)
static bool GetEntryName(char *data, ID id, char *name, uint32 maxSize)
Copy the entry name.
static T * CreateEntry(char *data, ID id, const char *name)
Reserve entry id with name (status 1).
static bool ConfirmEntry(char *data, ID id)
Mark entry ready (status 2).
static bool WriteAllEntriesToMsg(char *data, DataMessage *msg)
Serialize all entries into msg.
static ID GetEntryID(char *data, const char *name, bool force=false)
Case-insensitive reverse lookup: find the id registered under name.
static std::string ToXML(char *data)
Serialize all occupied entries as XML by delegating to each entry's toXML(), wrapped in the outer ele...
static T * CreateFirstFreeEntry(char *data, ID &id, const char *name)
Reserve the first free id.
static bool DeleteEntry(char *data, ID id)
Free the entry and its bit.
static uint32 GetCount(char *data)
Number of entries currently registered in the map (from the header's count field).
static uint8 LookupEntryID(char *data, const char *name, ID &id)
Case-insensitive lookup returning the entry's sync status rather than filtering by it.
static std::string PrintAllEntries(char *data)
Human-readable text dump of all occupied entries, one per line ("id = name (time)"; unconfirmed entri...
static T * GetEntry(char *data, ID id)
Fetch the confirmed entry at index id.
static bool WriteAllIDsToMsg(const char *arrayname, char *data, DataMessage *msg)
Write just names into msg under arrayname.
static uint64 GetEntryTime(char *data, ID id)
Creation timestamp of entry id.
static bool CancelEntry(char *data, ID id)
Roll back a reserved entry.
static std::string PrintAllEntriesHTML(char *data)
Dump all occupied entries as HTML table rows (no surrounding table element); used by the node's monit...
Handle to the node's master shared-memory segment (MemoryMasterStruct).
Recursive mutual-exclusion lock, optionally named for cross-process use.
Definition Utils.h:463
bool leave()
Release the mutex.
Definition Utils.cpp:1194
bool enter()
Block until the mutex is acquired.
Definition Utils.cpp:1059
std::string PrintTimeString(uint64 t, bool local=true, bool us=true, bool ms=true)
Definition PsyTime.cpp:676
uint64 GetTimeNow()
Return the current absolute time (µs since year 0) according to the TMC.
Definition PsyTime.cpp:69
int32 GetTimeAgeMS(uint64 t)
Age of a timestamp relative to now, in milliseconds.
Definition PsyTime.cpp:35
bool SignalSemaphore(const char *name)
Signal a named global semaphore.
Definition Utils.cpp:804
bool WaitForSemaphore(const char *name, uint32 ms, bool autocreate=true)
Wait on a named global semaphore.
Definition Utils.cpp:765
char * OpenSharedMemorySegment(const char *name, uint64 size)
Open and map an existing named shared memory segment.
Definition Utils.cpp:2259
char * CreateSharedMemorySegment(const char *name, uint64 size, bool force=false)
Create a named shared memory segment and map it into this process.
Definition Utils.cpp:2156
bool CloseSharedMemorySegment(char *data, uint64 size)
Unmap a segment previously created/opened here.
Definition Utils.cpp:2374
std::string BytifySize(double val)
Format a byte count with binary units, e.g.
Definition Utils.cpp:7724
std::string StringFormat(const char *format,...)
printf into a std::string.
Definition Utils.cpp:6626
bool SetBit(uint32 loc, bit value, char *bitfield, uint32 bytesize)
Set bit loc to value.
Definition Utils.cpp:2569
uint32 Calc32BitFieldSize(uint32 bitsize)
Compute the byte size needed for a bitfield of bitsize bits, rounded up to a 32-bit boundary.
Definition Utils.cpp:2435
uint32 strcpyavail(char *dst, const char *src, uint32 maxlen, bool copyAvailable)
Bounded strcpy that always NUL-terminates.
Definition Utils.cpp:6056
Context-map entry: one registered psychological/system context name/id.
uint64 time
Crank-map entry: one registered crank (user callback/script) with its function, library and inline sc...
uint32 compID
char function[MAXKEYNAMELEN+1]
uint64 time
char language[MAXKEYNAMELEN+1]
char script[MAXSCRIPTLEN+1]
char libraryFilename[MAXKEYNAMELEN+1]
Root header of the data-maps segment; records capacity/size of each contained map.
uint32 cid
Check/magic id validated on attach.
Common header of every map inside the data-maps segment.
Request-map entry tracking one cross-component request/reply transaction.
Tag-map entry: one registered tag name/id.
uint64 time
Type-map entry: one registered message type name/id.
uint64 time
char name[MAXKEYNAMELEN+1]