CMSDK 2.0.1
Cross-platform C++ base library and SDK for the Psyclone AIOS platform
Loading...
Searching...
No Matches
ComponentData.cpp
Go to the documentation of this file.
1
4
5#include "ComponentData.h"
6#include "PsyTime.h"
7#include "UnitTestFramework.h"
8
9namespace cmlabs {
10
11
12// Static
13ComponentData* ComponentData::CreateComponent(uint32 id, const char* name, uint32 size, uint16 nodeID, uint16 procID) {
14
15 ComponentData* compData = GetComponentData(id);
16 if (compData != NULL) {
17 if (_stricmp(name, compData->header->name) == 0) {
18 if ((nodeID != compData->header->nodeID) && (compData->header->nodeID)) {
19 delete(compData);
20 return false;
21 }
22 }
23 compData->header->nodeID = nodeID;
24 compData->header->procID = procID;
25 }
26 else {
27 // Create the page
28 uint32 pageID = 0;
29 char* data = MemoryManager::CreateAndLockNewSystemPage(size, pageID);
30 if (data == NULL)
31 return NULL;
32
33 // Record the pageID into the list
34 InsertComponentPageID(id, pageID, nodeID, procID, name);
35
36 struct COMPONENTDATAHEADER* header = (struct COMPONENTDATAHEADER*) data;
37 header->cid = id;
38 header->createdTime = GetTimeNow();
39 header->size = size;
40 header->nodeID = nodeID;
41 header->procID = procID;
42 header->pageID = pageID;
43 utils::strcpyavail(header->name, name, MAXKEYNAMELEN-1, false);
44
45 // Initialise the component data
46 compData = new ComponentData(data);
47 }
48
49 // Do not unlock the data, ComponentData destructor will do this
50 return compData;
51}
52
53// static
54bool ComponentData::RecordRemoteComponent(uint32 id, const char* name, uint16 nodeID, uint64 time) {
55
56 ComponentData* compData = GetComponentData(id);
57 if (compData != NULL) {
58 if (_stricmp(name, compData->header->name) == 0) {
59 if (nodeID == compData->header->nodeID) {
60 delete(compData);
61 return true;
62 }
63 else if (compData->header->nodeID == 0) {
64 compData->header->nodeID = nodeID;
65 delete(compData);
66 return true;
67 }
68 }
69 delete(compData);
70 return false;
71 }
72
73 // Create the page
74 uint32 pageID = 0;
75 char* data = MemoryManager::CreateAndLockNewSystemPage(sizeof(COMPONENTDATAHEADER), pageID);
76 if (data == NULL)
77 return NULL;
78
79 // Record the pageID into the list
80 InsertComponentPageID(id, pageID, nodeID, 0, name);
81
82 struct COMPONENTDATAHEADER* header = (struct COMPONENTDATAHEADER*) data;
83 header->cid = id;
84 header->createdTime = time;
85 header->size = 0;
86 header->nodeID = nodeID;
87 header->procID = 0;
88 header->pageID = pageID;
89 utils::strcpyavail(header->name, name, MAXKEYNAMELEN-1, false);
90 MemoryManager::UnlockSystemBlock(pageID);
91 return true;
92}
93
94// static
95bool ComponentData::ReserveComponentID(uint32 id, const char* name) {
96
97 ComponentData* compData = GetComponentData(id);
98 if (compData != NULL) {
99 delete(compData);
100 return false;
101 }
102
103 // Create the page
104 uint32 pageID = 0;
105 char* data = MemoryManager::CreateAndLockNewSystemPage(sizeof(COMPONENTDATAHEADER), pageID);
106 if (data == NULL)
107 return NULL;
108
109 // Record the pageID into the list
110 InsertComponentPageID(id, pageID, 0, 0, name);
111
112 struct COMPONENTDATAHEADER* header = (struct COMPONENTDATAHEADER*) data;
113 header->cid = id;
114 header->createdTime = 0;
115 header->size = 0;
116 header->nodeID = 0;
117 header->procID = 0;
118 header->pageID = pageID;
119 utils::strcpyavail(header->name, name, MAXKEYNAMELEN-1, false);
120 MemoryManager::UnlockSystemBlock(pageID);
121 return true;
122}
123
124// static
125char* ComponentData::GetAndRemoveComponent(uint32 cid, uint32& dataSize) {
126 uint32 pageID = 0;
127 if (!GetComponentPageID(cid, pageID))
128 return NULL;
129 uint32 size = 0;
130 char* data = MemoryManager::GetAndLockSystemBlock(pageID, size);
131 if (data == NULL)
132 return NULL;
133
134 char* newData = (char*)malloc(size);
135 memcpy(newData, data, size);
136
137 MemoryManager::UnlockSystemBlock(pageID);
138 MemoryManager::DestroySystemPage(pageID);
139 dataSize = size;
140 return newData;
141}
142
143// static
144bool ComponentData::AddExistingComponent(uint32 cid, uint16 nodeID, uint16 procID, char* oldData, uint32 dataSize) {
145 // Create the page
146 uint32 pageID = 0;
147 char* data = MemoryManager::CreateAndLockNewSystemPage(dataSize, pageID);
148 if (data == NULL)
149 return false;
150
151 struct COMPONENTDATAHEADER* header = (struct COMPONENTDATAHEADER*) oldData;
152
153 // Record the pageID into the list
154 InsertComponentPageID(cid, pageID, nodeID, procID, header->name);
155 memcpy(data, oldData, dataSize);
156
157 header = (struct COMPONENTDATAHEADER*) data;
158 header->cid = cid;
159 header->nodeID = nodeID;
160 header->procID = procID;
161 header->pageID = pageID;
162
163 MemoryManager::UnlockSystemBlock(pageID);
164 return true;
165}
166
167
168// static
169bool ComponentData::UpdateRemoteComponent(uint32 cid, uint16 nodeID, uint16 procID, const char* name) {
170 // Record the component into the list
171 InsertComponentPageID(cid, 0, nodeID, procID, name);
172 return true;
173}
174
175// static
176bool ComponentData::AddComponentStats(uint32 cid, uint64 userCPU, uint64 kernelCPU, DataMessage* inputMsg, DataMessage* outputMsg, uint32 runCount) {
177 uint32 pageID = 0;
178 uint32 size = 0;
179 COMPONENTDATAHEADER* header;
180
181 if (!GetComponentPageID(cid, pageID))
182 return false;
183 if ( (!(header = (COMPONENTDATAHEADER*)MemoryManager::GetAndLockSystemBlock(pageID, size))) || (header->procID == 0))
184 return false;
185
186 header->stats.time = GetTimeNow();
187 header->stats.runCount += runCount;
188 header->stats.runUserTime += userCPU;
189 header->stats.runKernelTime += kernelCPU;
190 if (inputMsg) {
191 header->stats.msgInCount++;
192 header->stats.msgInBytes += inputMsg->getSize();
193 memcpy(((char*)header->stats.recentInMsg)+sizeof(DataMessageHeader), (char*)header->stats.recentInMsg, 9*sizeof(DataMessageHeader));
194 memcpy(header->stats.recentInMsg, inputMsg->data, sizeof(DataMessageHeader));
195 }
196 if (outputMsg) {
197 header->stats.msgOutCount++;
198 header->stats.msgOutBytes += outputMsg->getSize();
199 memcpy(((char*)header->stats.recentOutMsg)+sizeof(DataMessageHeader), (char*)header->stats.recentOutMsg, 9*sizeof(DataMessageHeader));
200 memcpy(header->stats.recentOutMsg, outputMsg->data, sizeof(DataMessageHeader));
201 }
202
203 MemoryManager::UnlockSystemBlock(pageID);
204 return true;
205}
206
207
208// Static
210 ComponentData* comp = GetComponentData(cid);
211 if (comp == NULL) {
212 // Not a local component, just remove entry
213 FreeComponentID(cid);
214 return true;
215 }
216 if (!comp->destroyComponent()) {
217 delete(comp);
218 return false;
219 }
220 delete(comp);
221 return true;
222}
223
224// Static
226 uint32 pageID = 0;
227 if (!GetComponentPageID(cid, pageID))
228 return NULL;
229 uint32 size = 0;
230 char* data = MemoryManager::GetAndLockSystemBlock(pageID, size);
231 if (data == NULL)
232 return NULL;
233 // Do not unlock the data, ComponentData destructor will do this
234 return new ComponentData(data);
235}
236
237
238// Static
239bool ComponentData::GetComponentPageID(uint32 cid, uint32& pageID) {
240 ComponentMapEntry* entry = GetAndLockComponentEntry(cid);
241 if ((entry != NULL) && (entry->id == cid) && (entry->time != 0)) {
242 pageID = entry->pageID;
243 UnlockComponentMap();
244 return true;
245 }
246 else {
247 if (entry)
248 UnlockComponentMap();
249 return false;
250 }
251}
252
253// Static
254bool ComponentData::InsertComponentPageID(uint32 cid, uint32 pageID, uint16 nodeID, uint16 procID, const char* name) {
255 uint32 dataSize;
256 char* data = MemoryManager::GetAndLockSystemBlock(ID_COMPMAPPAGE, dataSize);
257 if (data == NULL)
258 return false;
259 // Insert Component PageID from list
260 ComponentMapHeader* cmHeader = (ComponentMapHeader*)data;
261
262 // Calc offset
263 uint32 offset = sizeof(ComponentMapHeader) + cmHeader->bitFieldSize +
264 cid * sizeof(ComponentMapEntry);
265 if (offset > cmHeader->size) {
266 MemoryManager::UnlockSystemBlock(ID_COMPMAPPAGE);
267 return false;
268 }
269 ComponentMapEntry* entry = (ComponentMapEntry*) (data+offset);
270 if ((entry->id == cid) || (entry->time == 0)) {
271 entry->id = cid;
272 entry->time = GetTimeNow();
273 entry->nodeID = nodeID;
274 entry->procID = procID;
275 entry->pageID = pageID;
276 uint16 nameLen = (uint16)strlen(name);
277 if (nameLen > MAXKEYNAMELEN) {
278 memcpy(entry->name, name, MAXKEYNAMELEN);
279 entry->name[MAXKEYNAMELEN] = 0;
280 }
281 else
282 strcpy(entry->name, name);
283 cmHeader->count++;
284 utils::SetBit(cid, BITOCCUPIED, (uint32*)((char*)cmHeader + sizeof(ComponentMapHeader)), cmHeader->bitFieldSize);
285 MemoryManager::UnlockSystemBlock(ID_COMPMAPPAGE);
286 return true;
287 }
288 else {
289 MemoryManager::UnlockSystemBlock(ID_COMPMAPPAGE);
290 return false;
291 }
292}
293
294// Static
295bool ComponentData::GetNextAvailableComponentID(uint32& cid) {
296 uint32 dataSize;
297 char* data = MemoryManager::GetAndLockSystemBlock(ID_COMPMAPPAGE, dataSize);
298 if (data == NULL)
299 return false;
300 // Get next available Component ID from list
301 ComponentMapHeader* cmHeader = (ComponentMapHeader*)data;
302 uint32 loc;
303 if (!utils::GetFirstFreeBitLoc((uint32*)((char*)cmHeader + sizeof(ComponentMapHeader)), cmHeader->bitFieldSize, loc)) {
304 MemoryManager::UnlockSystemBlock(ID_COMPMAPPAGE);
305 return false;
306 }
307 // Reserve it
308 utils::SetBit(cid, BITOCCUPIED, (uint32*)((char*)cmHeader + sizeof(ComponentMapHeader)), cmHeader->bitFieldSize);
309 cid = loc;
310 MemoryManager::UnlockSystemBlock(ID_COMPMAPPAGE);
311 return true;
312}
313
314
315// Static
316bool ComponentData::FreeComponentID(uint32 cid) {
317 uint32 dataSize;
318 char* data = MemoryManager::GetAndLockSystemBlock(ID_COMPMAPPAGE, dataSize);
319 if (data == NULL)
320 return false;
321 // Get next available Component ID from list
322 ComponentMapHeader* cmHeader = (ComponentMapHeader*)data;
323 ComponentMapEntry* entry;
324
325 // Calc offset
326 uint32 offset = sizeof(ComponentMapHeader) + cmHeader->bitFieldSize +
327 cid * sizeof(ComponentMapEntry);
328 if (offset > cmHeader->size) {
329 MemoryManager::UnlockSystemBlock(ID_COMPMAPPAGE);
330 return false;
331 }
332
333 // Free it
334 entry = (ComponentMapEntry*) (data+offset);
335 entry->time = 0;
336 entry->name[0] = 0;
337
338 cmHeader->count--;
339 utils::SetBit(cid, BITFREE, (uint32*)((char*)cmHeader + sizeof(ComponentMapHeader)), cmHeader->bitFieldSize);
340 MemoryManager::UnlockSystemBlock(ID_COMPMAPPAGE);
341 // Does not delete the old page from memory!!!
342 return true;
343}
344
345
346
347// static
349 ComponentMapEntry* entry = GetAndLockComponentEntry(cid);
350 if ((entry != NULL) && (entry->id == cid) && (entry->time != 0)) {
351 uint16 nodeID = entry->nodeID;
352 UnlockComponentMap();
353 return nodeID;
354 }
355 else {
356 UnlockComponentMap();
357 return 0;
358 }
359}
360
361// static
363 ComponentMapEntry* entry = GetAndLockComponentEntry(cid);
364 if ((entry != NULL) && (entry->id == cid) && (entry->time != 0) && (entry->pageID != 0)) {
365 uint16 procID = entry->procID;
366 UnlockComponentMap();
367 return procID;
368 }
369 else {
370 UnlockComponentMap();
371 return 0;
372 }
373}
374
375
376// static
378 ComponentMapEntry* entry = GetAndLockComponentEntry(cid);
379 if ((entry != NULL) && (entry->id == cid) && (entry->time != 0)) {
380 uint16 procID = entry->procID;
381 UnlockComponentMap();
382 return (procID != 0);
383 }
384 else {
385 UnlockComponentMap();
386 return false;
387 }
388}
389
390// static
391bool ComponentData::GetComponentName(uint32 cid, char* name, uint32 maxNameLen) {
392 ComponentMapEntry* entry = GetAndLockComponentEntry(cid);
393 if ((entry != NULL) && (entry->id == cid) && (entry->time != 0)) {
394 if (strlen(entry->name) < maxNameLen)
395 strcpy(name, entry->name);
396 else {
397 memcpy(name, entry->name, maxNameLen-1);
398 name[maxNameLen-1] = 0;
399 }
400 UnlockComponentMap();
401 return true;
402 }
403 else {
404 UnlockComponentMap();
405 return false;
406 }
407}
408
409// static
411 ComponentStats stats;
412 uint32 pageID = 0;
413 uint32 size = 0;
414 char* data;
415 if (GetComponentPageID(cid, pageID)) {
416 if ((data = MemoryManager::GetAndLockSystemBlock(pageID, size)) &&
417 (((COMPONENTDATAHEADER*)data)->procID != 0))
418 memcpy(&stats, &((COMPONENTDATAHEADER*)data)->stats, sizeof(ComponentStats));
419 else
420 memset(&stats, 0, sizeof(ComponentStats));
421 }
422 MemoryManager::UnlockSystemBlock(pageID);
423 return stats;
424}
425
426// static
428 uint32 pageID = 0;
429 uint32 size = 0;
430 char* data;
431 if (GetComponentPageID(cid, pageID)) {
432 if ((data = MemoryManager::GetAndLockSystemBlock(pageID, size)) &&
433 (((COMPONENTDATAHEADER*)data)->procID != 0)) {
434 memcpy(&((COMPONENTDATAHEADER*)data)->stats, &stats, sizeof(ComponentStats));
435 MemoryManager::UnlockSystemBlock(pageID);
436 return true;
437 }
438 }
439 MemoryManager::UnlockSystemBlock(pageID);
440 return false;
441}
442
443// static
444bool ComponentData::GetComponentID(const char* name, uint32 &cid) {
445 uint32 dataSize;
446 char* data = MemoryManager::GetAndLockSystemBlock(ID_COMPMAPPAGE, dataSize);
447 if (data == NULL)
448 return false;
449 ComponentMapHeader* header = (ComponentMapHeader*)data;
450 ComponentMapEntry* entry;
451
452 entry = (ComponentMapEntry*) (data + sizeof(ComponentMapHeader) + header->bitFieldSize);
453 char* endEntry = data + dataSize;
454 while ((char*)entry < endEntry) {
455 if (strcmp(name, entry->name) == 0) {
456 cid = entry->id;
457 MemoryManager::UnlockSystemBlock(ID_COMPMAPPAGE);
458 return true;
459 }
460 entry = entry + 1; // sizeof(ComponentMapEntry);
461 }
462
463 MemoryManager::UnlockSystemBlock(ID_COMPMAPPAGE);
464 return false;
465}
466
467
468
469
470
471
472
473
474
475
476
477
479 header = (struct COMPONENTDATAHEADER*) data;
480}
481
485
487 if (header == NULL)
488 return true;
489 MemoryManager::UnlockSystemBlock(header->pageID);
490 header = NULL;
491 return true;
492}
493
495 return (header->size - sizeof(COMPONENTDATAHEADER) - header->paramSize - header->dataSize);
496}
497
498bool ComponentData::resize(uint32 increase) {
499 uint32 newSize = header->size + increase;
500 uint32 pageID = 0;
501 char* data = MemoryManager::CreateAndLockNewSystemPage(newSize, pageID);
502 if (data == NULL)
503 return false;
504
505 // Record the pageID into the list, overwrite
506 InsertComponentPageID(header->cid, pageID, header->nodeID, header->procID, header->name);
507
508 struct COMPONENTDATAHEADER* newHeader = (struct COMPONENTDATAHEADER*) data;
509 memcpy((char*)newHeader, (char*)header, header->size);
510 newHeader->size = newSize;
511 newHeader->pageID = pageID;
512
513 uint32 oldPageID = header->pageID;
514 // Unlock and delete the old page
515 MemoryManager::UnlockSystemBlock(oldPageID);
516 MemoryManager::DestroySystemPage(oldPageID);
517 // Swap the new data into place
518 header = newHeader;
519 // Do not unlock the new data, ComponentData destructor will do this
520 return true;
521}
522
524 FreeComponentID(header->cid);
525 uint32 oldPageID = header->pageID;
526 // Unlock and delete the old page
527 MemoryManager::UnlockSystemBlock(oldPageID);
528 MemoryManager::DestroySystemPage(oldPageID);
529 header = NULL;
530 return true;
531}
532
533
534
535
536char* ComponentData::makeRoomForPrivateData(uint32 newSize) {
537 if (getAvailableDataSize() < newSize) {
538 if ((!resize(newSize)) || (getAvailableDataSize() < newSize))
539 return NULL;
540 }
541 // space available after private data so just use this
542 return (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize + header->dataSize;
543}
544
545char* ComponentData::makeRoomForParameter(uint32 newSize) {
546 if (getAvailableDataSize() < newSize) {
547 if ((!resize(newSize)) || (getAvailableDataSize() < newSize))
548 return NULL;
549 }
550 char* paramSrc = (char*)header + sizeof(COMPONENTDATAHEADER);
551 char* dataSrc = (char*)paramSrc + header->paramSize;
552 // space available after private data, so we need to move the private data down
553 // to make a gap btw this and the parameter data
554 memcpy(dataSrc+newSize, dataSrc, header->dataSize);
555 // fill the gap with 0s
556 memset(dataSrc, 0, newSize);
557 // return pointer to the new gap
558 return dataSrc;
559}
560
561
562
563// Private Data
564bool ComponentData::setPrivateData(const char* name, const char* data, uint32 size) {
565 char* src = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
566 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize + header->dataSize;
567
568 // Does the data entry exist already?
569 uint32 offset = 0;
570 while ( src < srcEnd ) {
571 if (_stricmp(name, src + sizeof(uint32)) == 0)
572 return replacePrivateData(name, data, size, offset);
573 offset += *(uint32*)src;
574 src += *(uint32*)src;
575 }
576
577 // Check for required space
578 uint32 nameLen = (uint32)strlen(name);
579 uint32 newSize = sizeof(uint32) + nameLen + 1 + size;
580 char* newData = makeRoomForPrivateData(newSize);
581 if (newData == NULL)
582 return false;
583
584 // Copy in new data
585 *(uint32*) newData = newSize;
586 memcpy(newData + sizeof(uint32), name, nameLen+1); // incl. 0 at the end of the string
587 memcpy(newData + sizeof(uint32) + nameLen+1, data, size);
588
589 header->dataCount++;
590 header->dataSize += newSize;
591 return true;
592}
593
594uint32 ComponentData::getPrivateDataSize(const char* name) {
595 char* src = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
596 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize + header->dataSize;
597
598 // Does the data entry exist already?
599 while ( src < srcEnd ) {
600 if (_stricmp(name, src + sizeof(uint32)) == 0)
601 return *(uint32*)src - sizeof(uint32) - (uint32)strlen(src + sizeof(uint32)) - 1;
602 src += *(uint32*)src;
603 }
604 return 0;
605}
606
607bool ComponentData::getPrivateDataCopy(const char* name, char* data, uint32 maxSize) {
608 char* src = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
609 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize + header->dataSize;
610
611 uint32 size, nameLen;
612 // Does the data entry exist already?
613 while ( src < srcEnd ) {
614 if (_stricmp(name, src + sizeof(uint32)) == 0) {
615 nameLen = (uint32)strlen(src + sizeof(uint32));
616 size = *(uint32*)src - sizeof(uint32) - nameLen - 1;
617 if (size > maxSize)
618 return false;
619 memcpy((void*)data, src + sizeof(uint32) + nameLen+1, size);
620 return true;
621 }
622 src += *(uint32*)src;
623 }
624 return false;
625}
626
627bool ComponentData::replacePrivateData(const char* name, const char* data, uint32 size) {
628 char* src = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
629 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize + header->dataSize;
630
631 uint32 offset = 0;
632 while ( src < srcEnd ) {
633 if (_stricmp(name, src + sizeof(uint32)) == 0)
634 return replacePrivateData(name, data, size, offset);
635 offset += *(uint32*)src;
636 src += *(uint32*)src;
637 }
638 return false;
639}
640
641bool ComponentData::replacePrivateData(const char* name, const char* data, uint32 size, uint32 offset) {
642
643 char* src = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize + offset;
644 uint32 nameLen = (uint32)strlen(src + sizeof(uint32));
645 uint32 oldSize = *(uint32*)src - sizeof(uint32) - nameLen - 1;
646 if (oldSize == size) {
647 memcpy(src + sizeof(uint32) + nameLen + 1, data, size);
648 return true;
649 }
650 else {
651 deletePrivateData(name);
652 return setPrivateData(name, data, size);
653 }
654}
655
656bool ComponentData::deletePrivateData(const char* name) {
657 char* src = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
658 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize + header->dataSize;
659
660 uint32 delSize;
661 uint32 copySize = header->dataSize;
662 while ( src < srcEnd ) {
663 copySize -= *(uint32*)src;
664 if (_stricmp(name, src + sizeof(uint32)) == 0) {
665 delSize = *(uint32*)src;
666 memcpy(src, src + *(uint32*)src, copySize);
667 header->dataCount--;
668 header->dataSize -= delSize;
669 srcEnd -= delSize;
670 memset(srcEnd, 0, delSize);
671 return true;
672 }
673 src += *(uint32*)src;
674 }
675 return false;
676}
677
678
679
680
681
682
683
684
685
686
687// Parameters
688bool ComponentData::createParameter(const char* name, const char* val, const char* defaultValue) {
689 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
690 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
691
692 // Does the data entry exist already?
693 while ( src < srcEnd ) {
694 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0)
695 return false;
696 src += *(uint32*)src;
697 }
698
699 // Calculate required size
700 uint32 nameLen = (uint32)strlen(name);
701 uint32 newSize = nameLen + 1 + sizeof(PARAMHEADER) + (uint32)strlen(val) + 1;
702 if (defaultValue != NULL)
703 newSize += (uint32)strlen(defaultValue) + 1;
704 else
705 newSize += (uint32)strlen(val) + 1;
706
707 char* newData = makeRoomForParameter(newSize);
708 if (newData == NULL)
709 return false;
710
711 // Copy in new data
712 PARAMHEADER* pHeader = (PARAMHEADER*) newData;
713 pHeader->size = newSize;
714 pHeader->type = PARAM_STRING;
715 memcpy(newData + sizeof(PARAMHEADER), name, nameLen+1); // incl. 0 at the end of the string
716
717 src = newData + sizeof(PARAMHEADER) + nameLen + 1;
718
719 // copy in main value
720 strcpy(src, val);
721 src += strlen(val) + 1;
722 // copy in default value
723 if (defaultValue != NULL)
724 strcpy(src, defaultValue);
725 else
726 strcpy(src, val);
727
728 header->paramCount++;
729 header->paramSize += newSize;
730 return true;
731}
732
733bool ComponentData::createParameter(const char* name, const char* val, uint32 count, uint32 defaultIndex) {
734 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
735 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
736
737 // Does the data entry exist already?
738 while ( src < srcEnd ) {
739 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0)
740 return false;
741 src += *(uint32*)src;
742 }
743
744 // Calculate required size
745 uint32 n, len;
746 uint32 nameLen = (uint32)strlen(name);
747 uint32 newSize = nameLen + 1 + sizeof(PARAMHEADER) + sizeof(PARAMCOLLHEADER);
748 uint32 dataSize = 0;
749 const char* pVal = val;
750 for (n=0; n<count; n++) {
751 len = (uint32)strlen(pVal) + 1;
752 dataSize += len;
753 pVal += len;
754 }
755 newSize += dataSize;
756
757 char* newData = makeRoomForParameter(newSize);
758 if (newData == NULL)
759 return false;
760
761 // Copy in new data
762 PARAMHEADER* pHeader = (PARAMHEADER*) newData;
763 pHeader->size = newSize;
764 pHeader->type = PARAM_STRING_COLL;
765 memcpy(newData + sizeof(PARAMHEADER), name, nameLen+1); // incl. 0 at the end of the string
766
767 PARAMCOLLHEADER* dHeader = (PARAMCOLLHEADER*) (newData + sizeof(PARAMHEADER) + nameLen + 1);
768 dHeader->index = defaultIndex;
769 dHeader->defaultIndex = defaultIndex;
770 dHeader->count = count;
771
772 // copy in data values
773 memcpy((char*)dHeader + sizeof(PARAMCOLLHEADER), val, dataSize);
774
775 header->paramCount++;
776 header->paramSize += newSize;
777 return true;
778}
779
780bool ComponentData::createParameter(const char* name, std::vector<std::string> values, const char* defaultValue) {
781 uint32 n, dlen, len = 0, dataSize = 0, defaultIndex = 0;
782 uint32 count = (uint32)values.size();
783 for (n=0; n<count; n++)
784 dataSize += (uint32)values[n].size() + 1;
785 char* val = new char[dataSize];
786 for (n=0; n<count; n++) {
787 dlen = (uint32)values[n].size()+1;
788 memcpy(val+len, values[n].c_str(), dlen);
789 len += dlen;
790 if (values[n] == defaultValue)
791 defaultIndex = n;
792 }
793 bool res = createParameter(name, val, count, defaultIndex);
794 delete [] val;
795 return res;
796}
797
798bool ComponentData::createParameter(const char* name, std::vector<std::string> values, int64 defaultValue) {
799 uint32 n, defaultIndex = 0;
800 uint32 count = (uint32)values.size();
801 int64* val = new int64[count];
802 for (n=0; n<count; n++) {
803 val[n] = utils::Ascii2Int64(values[n].c_str());
804 if (val[n] == defaultValue)
805 defaultIndex = n;
806 }
807 bool res = createParameter(name, val, count, defaultIndex);
808 delete [] val;
809 return res;
810}
811
812bool ComponentData::createParameter(const char* name, std::vector<std::string> values, float64 defaultValue) {
813 uint32 n, defaultIndex = 0;
814 uint32 count = (uint32)values.size();
815 float64* val = new float64[count];
816 for (n=0; n<count; n++) {
817 val[n] = utils::Ascii2Float64(values[n].c_str());
818 if (val[n] == defaultValue)
819 defaultIndex = n;
820 }
821 bool res = createParameter(name, val, count, defaultIndex);
822 delete [] val;
823 return res;
824}
825
826bool ComponentData::createParameter(const char* name, int64* val, uint32 count, uint32 defaultIndex) {
827 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
828 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
829
830 // Does the data entry exist already?
831 while ( src < srcEnd ) {
832 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0)
833 return false;
834 src += *(uint32*)src;
835 }
836
837 // Calculate required size
838 uint32 nameLen = (uint32)strlen(name);
839 uint32 newSize = nameLen + 1 + sizeof(PARAMHEADER) + sizeof(PARAMCOLLHEADER) + (count * sizeof(int64));
840
841 char* newData = makeRoomForParameter(newSize);
842 if (newData == NULL)
843 return false;
844
845 // Copy in new data
846 PARAMHEADER* pHeader = (PARAMHEADER*) newData;
847 pHeader->size = newSize;
848 pHeader->type = PARAM_INTEGER_COLL;
849 memcpy(newData + sizeof(PARAMHEADER), name, nameLen+1); // incl. 0 at the end of the string
850
851 PARAMCOLLHEADER* dHeader = (PARAMCOLLHEADER*) (newData + sizeof(PARAMHEADER) + nameLen + 1);
852 dHeader->index = defaultIndex;
853 dHeader->defaultIndex = defaultIndex;
854 dHeader->count = count;
855
856 // copy in data values
857 memcpy((char*)dHeader + sizeof(PARAMCOLLHEADER), val, count * sizeof(int64));
858
859 header->paramCount++;
860 header->paramSize += newSize;
861 return true;
862}
863
864bool ComponentData::createParameter(const char* name, float64* val, uint32 count, uint32 defaultIndex) {
865 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
866 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
867
868 // Does the data entry exist already?
869 while ( src < srcEnd ) {
870 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0)
871 return false;
872 src += *(uint32*)src;
873 }
874
875 // Calculate required size
876 uint32 nameLen = (uint32)strlen(name);
877 uint32 newSize = nameLen + 1 + sizeof(PARAMHEADER) + sizeof(PARAMCOLLHEADER) + (count * sizeof(float64));
878
879 char* newData = makeRoomForParameter(newSize);
880 if (newData == NULL)
881 return false;
882
883 // Copy in new data
884 PARAMHEADER* pHeader = (PARAMHEADER*) newData;
885 pHeader->size = newSize;
886 pHeader->type = PARAM_FLOAT_COLL;
887 memcpy(newData + sizeof(PARAMHEADER), name, nameLen+1); // incl. 0 at the end of the string
888
889 PARAMCOLLHEADER* dHeader = (PARAMCOLLHEADER*) (newData + sizeof(PARAMHEADER) + nameLen + 1);
890 dHeader->index = defaultIndex;
891 dHeader->defaultIndex = defaultIndex;
892 dHeader->count = count;
893
894 // copy in data values
895 memcpy((char*)dHeader + sizeof(PARAMCOLLHEADER), val, count * sizeof(float64));
896
897 header->paramCount++;
898 header->paramSize += newSize;
899 return true;
900}
901
902bool ComponentData::createParameter(const char* name, int64 val, int64 min, int64 max, int64 interval) {
903 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
904 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
905
906 // Does the data entry exist already?
907 while ( src < srcEnd ) {
908 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0)
909 return false;
910 src += *(uint32*)src;
911 }
912
913 // Calculate required size
914 uint32 nameLen = (uint32)strlen(name);
915 uint32 newSize = nameLen + 1 + sizeof(PARAMHEADER) + sizeof(PARAMINTEGERHEADER);
916
917 char* newData = makeRoomForParameter(newSize);
918 if (newData == NULL)
919 return false;
920
921 // Copy in new data
922 PARAMHEADER* pHeader = (PARAMHEADER*) newData;
923 pHeader->size = newSize;
924 pHeader->type = PARAM_INTEGER;
925 memcpy(newData + sizeof(PARAMHEADER), name, nameLen+1); // incl. 0 at the end of the string
926
927 PARAMINTEGERHEADER* dHeader = (PARAMINTEGERHEADER*) (newData + sizeof(PARAMHEADER) + nameLen + 1);
928
929 // copy in values
930 dHeader->val = val;
931 dHeader->defaultVal = val;
932 dHeader->minVal = min;
933 dHeader->maxVal = max;
934 dHeader->interval = interval;
935
936 header->paramCount++;
937 header->paramSize += newSize;
938 return true;
939}
940
941bool ComponentData::createParameter(const char* name, float64 val, float64 min, float64 max, float64 interval) {
942 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
943 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
944
945 // Does the data entry exist already?
946 while ( src < srcEnd ) {
947 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0)
948 return false;
949 src += *(uint32*)src;
950 }
951
952 // Calculate required size
953 uint32 nameLen = (uint32)strlen(name);
954 uint32 newSize = nameLen + 1 + sizeof(PARAMHEADER) + sizeof(PARAMFLOATHEADER);
955
956 char* newData = makeRoomForParameter(newSize);
957 if (newData == NULL)
958 return false;
959
960 // Copy in new data
961 PARAMHEADER* pHeader = (PARAMHEADER*) newData;
962 pHeader->size = newSize;
963 pHeader->type = PARAM_FLOAT;
964 memcpy(newData + sizeof(PARAMHEADER), name, nameLen+1); // incl. 0 at the end of the string
965
966 PARAMFLOATHEADER* dHeader = (PARAMFLOATHEADER*) (newData + sizeof(PARAMHEADER) + nameLen + 1);
967
968 // copy in values
969 dHeader->val = val;
970 dHeader->defaultVal = val;
971 dHeader->minVal = min;
972 dHeader->maxVal = max;
973 dHeader->interval = interval;
974
975 header->paramCount++;
976 header->paramSize += newSize;
977 return true;
978}
979
980bool ComponentData::hasParameter(const char* name) {
981 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
982 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
983
984 while ( src < srcEnd ) {
985 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0)
986 return true;
987 src += *(uint32*)src;
988 }
989 return false;
990}
991
992bool ComponentData::deleteParameter(const char* name) {
993 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
994 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
995
996 uint32 delSize;
997 uint32 copySize = header->paramSize + header->dataSize;
998 while ( src < srcEnd ) {
999 copySize -= *(uint32*)src;
1000 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0) {
1001 delSize = *(uint32*)src;
1002 memcpy(src, src + delSize, copySize);
1003 header->paramCount--;
1004 header->paramSize -= delSize;
1005 // fill data at end with 0s
1006 srcEnd -= delSize + header->dataSize;
1007 memset(srcEnd, 0, delSize);
1008 return true;
1009 }
1010 src += *(uint32*)src;
1011 }
1012 return false;
1013}
1014
1016 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
1017 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
1018
1019 while ( src < srcEnd ) {
1020 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0) {
1021 PARAMHEADER* pHeader = (PARAMHEADER*) src;
1022 return pHeader->type;
1023 }
1024 src += *(uint32*)src;
1025 }
1026 return 0;
1027}
1028
1030 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
1031 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
1032
1033 char* pSrc;
1034 while ( src < srcEnd ) {
1035 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0) {
1036 PARAMHEADER* pHeader = (PARAMHEADER*) src;
1037 pSrc = src + sizeof(PARAMHEADER) + strlen(src + sizeof(PARAMHEADER)) + 1;
1038 if ( (pHeader->type == PARAM_INTEGER) || (pHeader->type == PARAM_INTEGER_COLL) )
1039 return sizeof(int64);
1040 else if ( (pHeader->type == PARAM_FLOAT) || (pHeader->type == PARAM_FLOAT_COLL) )
1041 return sizeof(float64);
1042 else if (pHeader->type == PARAM_STRING) {
1043 return ((uint32)strlen(pSrc) + 1);
1044 }
1045 else {
1046 PARAMCOLLHEADER* cHeader = (PARAMCOLLHEADER*) pSrc;
1047 for (uint32 n=0; n<cHeader->index; n++)
1048 pSrc += strlen(pSrc) + 1;
1049 return (uint32)strlen(pSrc) + 1;
1050 }
1051 }
1052 src += *(uint32*)src;
1053 }
1054 return 0;
1055}
1056
1057bool ComponentData::getParameter(const char* name, char* val, uint32 maxSize) {
1058 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
1059 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
1060
1061 char* pSrc;
1062 while ( src < srcEnd ) {
1063 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0) {
1064 PARAMHEADER* pHeader = (PARAMHEADER*) src;
1065 pSrc = src + sizeof(PARAMHEADER) + strlen(src + sizeof(PARAMHEADER)) + 1;
1066 if (pHeader->type == PARAM_STRING) {
1067 if (maxSize < strlen(pSrc) + 1)
1068 return false;
1069 strcpy(val, pSrc);
1070 return true;
1071 }
1072 else if (pHeader->type == PARAM_STRING_COLL) {
1073 PARAMCOLLHEADER* cHeader = (PARAMCOLLHEADER*) pSrc;
1074 pSrc += sizeof(PARAMCOLLHEADER);
1075 for (uint32 n=0; n<cHeader->index; n++)
1076 pSrc += strlen(pSrc) + 1;
1077 if (maxSize < strlen(pSrc) + 1)
1078 return false;
1079 strcpy(val, pSrc);
1080 return true;
1081 }
1082 else
1083 return false;
1084 }
1085 src += *(uint32*)src;
1086 }
1087 return false;
1088}
1089
1090bool ComponentData::getParameter(const char* name, int64& val) {
1091 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
1092 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
1093
1094 char* pSrc;
1095 while ( src < srcEnd ) {
1096 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0) {
1097 PARAMHEADER* pHeader = (PARAMHEADER*) src;
1098 pSrc = src + sizeof(PARAMHEADER) + strlen(src + sizeof(PARAMHEADER)) + 1;
1099 if (pHeader->type == PARAM_INTEGER) {
1100 val = *(int64*)(pSrc);
1101 return true;
1102 }
1103 else if (pHeader->type == PARAM_INTEGER_COLL) {
1104 PARAMCOLLHEADER* cHeader = (PARAMCOLLHEADER*) pSrc;
1105 pSrc += sizeof(PARAMCOLLHEADER) + (cHeader->index*sizeof(int64));
1106 val = *(int64*) pSrc;
1107 return true;
1108 }
1109 else
1110 return false;
1111 }
1112 src += *(uint32*)src;
1113 }
1114 return false;
1115}
1116
1117bool ComponentData::getParameter(const char* name, float64& val) {
1118 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
1119 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
1120
1121 char* pSrc;
1122 while ( src < srcEnd ) {
1123 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0) {
1124 PARAMHEADER* pHeader = (PARAMHEADER*) src;
1125 pSrc = src + sizeof(PARAMHEADER) + strlen(src + sizeof(PARAMHEADER)) + 1;
1126 if (pHeader->type == PARAM_FLOAT) {
1127 val = *(float64*)(pSrc);
1128 return true;
1129 }
1130 else if (pHeader->type == PARAM_FLOAT_COLL) {
1131 PARAMCOLLHEADER* cHeader = (PARAMCOLLHEADER*) pSrc;
1132 pSrc += sizeof(PARAMCOLLHEADER) + (cHeader->index*sizeof(float64));
1133 val = *(float64*) pSrc;
1134 return true;
1135 }
1136 else
1137 return false;
1138 }
1139 src += *(uint32*)src;
1140 }
1141 return false;
1142}
1143
1144
1145bool ComponentData::setParameter(const char* name, const char* val) {
1146 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
1147 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
1148
1149 char* pSrc;
1150 uint32 index, oldSize;
1151 while ( src < srcEnd ) {
1152 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0) {
1153 PARAMHEADER* pHeader = (PARAMHEADER*) src;
1154 pSrc = src + sizeof(PARAMHEADER) + strlen(src + sizeof(PARAMHEADER)) + 1;
1155 if (pHeader->type == PARAM_STRING) {
1156 oldSize = (uint32)strlen(pSrc);
1157 if (strlen(val) == oldSize) {
1158 strcpy(pSrc, val);
1159 return true;
1160 }
1161 // we need to recreate the parameter with the new size
1162 uint32 defaultSize = (uint32)strlen(pSrc + oldSize + 1) + 1;
1163 char* defaultValue = new char[defaultSize];
1164 strcpy(defaultValue, pSrc + oldSize + 1);
1165 // delete the old parameter
1166 if (!deleteParameter(name)) {
1167 delete [] defaultValue;
1168 return false;
1169 }
1170 // create the new one
1171 if (!createParameter(name, val, defaultValue)) {
1172 delete [] defaultValue;
1173 return false;
1174 }
1175 // clean up
1176 delete [] defaultValue;
1177 return true;
1178 }
1179 else if (pHeader->type == PARAM_STRING_COLL) {
1180 // See if the requested value is in the list
1181 PARAMCOLLHEADER* cHeader = (PARAMCOLLHEADER*) pSrc;
1182 index = 0;
1183 pSrc += sizeof(PARAMCOLLHEADER);
1184 while (index < cHeader->count) {
1185 if (_stricmp(val, pSrc) == 0) {
1186 // if so, set the index to the correct entry
1187 cHeader->index = index;
1188 return true;
1189 }
1190 index++;
1191 pSrc += strlen(pSrc) + 1;
1192 }
1193 return false;
1194 }
1195 else
1196 return false;
1197 }
1198 src += *(uint32*)src;
1199 }
1200 return false;
1201}
1202
1203bool ComponentData::setParameter(const char* name, int64 val) {
1204 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
1205 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
1206
1207 char* pSrc;
1208 uint32 index;
1209 while ( src < srcEnd ) {
1210 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0) {
1211 PARAMHEADER* pHeader = (PARAMHEADER*) src;
1212 pSrc = src + sizeof(PARAMHEADER) + strlen(src + sizeof(PARAMHEADER)) + 1;
1213 if (pHeader->type == PARAM_INTEGER) {
1214 ((PARAMINTEGERHEADER*) pSrc)->val = val;
1215 }
1216 else if (*(uint8*)pSrc == PARAM_INTEGER_COLL) {
1217 // See if the requested value is in the list
1218 PARAMCOLLHEADER* cHeader = (PARAMCOLLHEADER*) pSrc;
1219 index = 0;
1220 pSrc += sizeof(PARAMCOLLHEADER);
1221 while (index < cHeader->count) {
1222 if (*(int64*)pSrc == val) {
1223 // if so, set the index to the correct entry
1224 cHeader->index = index;
1225 return true;
1226 }
1227 index++;
1228 pSrc += sizeof(int64);
1229 }
1230 return false;
1231 }
1232 else
1233 return false;
1234 }
1235 src += *(uint32*)src;
1236 }
1237 return false;
1238}
1239
1240bool ComponentData::setParameter(const char* name, float64 val) {
1241 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
1242 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
1243
1244 char* pSrc;
1245 uint32 index;
1246 while ( src < srcEnd ) {
1247 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0) {
1248 PARAMHEADER* pHeader = (PARAMHEADER*) src;
1249 pSrc = src + sizeof(PARAMHEADER) + strlen(src + sizeof(PARAMHEADER)) + 1;
1250 if (pHeader->type == PARAM_FLOAT) {
1251 PARAMFLOATHEADER* dHeader = (PARAMFLOATHEADER*) pSrc;
1252 dHeader->val = val;
1253 }
1254 else if (*(uint8*)pSrc == PARAM_INTEGER_COLL) {
1255 // See if the requested value is in the list
1256 PARAMCOLLHEADER* cHeader = (PARAMCOLLHEADER*) pSrc;
1257 index = 0;
1258 pSrc += sizeof(PARAMCOLLHEADER);
1259 while (index < cHeader->count) {
1260 if (*(float64*)pSrc == val) {
1261 // if so, set the index to the correct entry
1262 cHeader->index = index;
1263 return true;
1264 }
1265 index++;
1266 pSrc += sizeof(int64);
1267 }
1268 return false;
1269 }
1270 else
1271 return false;
1272 }
1273 src += *(uint32*)src;
1274 }
1275 return false;
1276}
1277
1278
1279bool ComponentData::resetParameter(const char* name) {
1280 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
1281 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
1282
1283 char* pSrc;
1284 while ( src < srcEnd ) {
1285 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0) {
1286 PARAMHEADER* pHeader = (PARAMHEADER*) src;
1287 pSrc = src + sizeof(PARAMHEADER) + strlen(src + sizeof(PARAMHEADER)) + 1;
1288 if (pHeader->type == PARAM_INTEGER) {
1289 ((PARAMINTEGERHEADER*)pSrc)->val = ((PARAMINTEGERHEADER*)pSrc)->defaultVal;
1290 }
1291 else if (*(uint8*)pSrc == PARAM_INTEGER_COLL) {
1292 // Set index to default index
1293 ((PARAMCOLLHEADER*)pSrc)->index = ((PARAMCOLLHEADER*)pSrc)->defaultIndex;
1294 return true;
1295 }
1296 else if (*(uint8*)pSrc == PARAM_FLOAT) {
1297 ((PARAMFLOATHEADER*)pSrc)->val = ((PARAMFLOATHEADER*)pSrc)->defaultVal;
1298 }
1299 else if (*(uint8*)pSrc == PARAM_FLOAT_COLL) {
1300 // Set index to default index
1301 ((PARAMCOLLHEADER*)pSrc)->index = ((PARAMCOLLHEADER*)pSrc)->defaultIndex;
1302 return true;
1303 }
1304 else if (*(uint8*)pSrc == PARAM_STRING) {
1305 return setParameter(name, pSrc + strlen(pSrc) + 1);
1306 }
1307 else if (*(uint8*)pSrc == PARAM_STRING_COLL) {
1308 // Set index to default index
1309 ((PARAMCOLLHEADER*)pSrc)->index = ((PARAMCOLLHEADER*)pSrc)->defaultIndex;
1310 return true;
1311 }
1312 else
1313 return false;
1314 }
1315 src += *(uint32*)src;
1316 }
1317 return false;
1318}
1319
1320bool ComponentData::tweakParameter(const char* name, int32 tweak) {
1321 char* src = (char*)header + sizeof(COMPONENTDATAHEADER);
1322 char* srcEnd = (char*)header + sizeof(COMPONENTDATAHEADER) + header->paramSize;
1323
1324 if (tweak == 0)
1325 return true;
1326
1327 char* pSrc;
1328 int64 testInt;
1329 float64 testFloat;
1330 while ( src < srcEnd ) {
1331 if (_stricmp(name, src + sizeof(PARAMHEADER)) == 0) {
1332 PARAMHEADER* pHeader = (PARAMHEADER*) src;
1333 pSrc = src + sizeof(PARAMHEADER) + strlen(src + sizeof(PARAMHEADER)) + 1;
1334 if ( (pHeader->type == PARAM_INTEGER_COLL) || (pHeader->type == PARAM_FLOAT_COLL) || (pHeader->type == PARAM_STRING_COLL) ) {
1335 PARAMCOLLHEADER* cHeader = (PARAMCOLLHEADER*)pSrc;
1336 if ( (cHeader->index + tweak >= 0) && (cHeader->index + tweak < cHeader->count) ) {
1337 cHeader->index += tweak;
1338 return true;
1339 }
1340 else
1341 return false;
1342 }
1343 else if (pHeader->type == PARAM_INTEGER) {
1344 PARAMINTEGERHEADER* iHeader = (PARAMINTEGERHEADER*)pSrc;
1345 if (iHeader->interval == 0)
1346 return false;
1347 testInt = iHeader->val + (tweak * iHeader->interval);
1348 if ( (testInt >= iHeader->minVal) && (testInt <= iHeader->maxVal) ) {
1349 iHeader->val = testInt;
1350 return true;
1351 }
1352 }
1353 else if (pHeader->type == PARAM_FLOAT) {
1354 PARAMFLOATHEADER* fHeader = (PARAMFLOATHEADER*)pSrc;
1355 if (fHeader->interval == 0)
1356 return false;
1357 testFloat = fHeader->val + (tweak * fHeader->interval);
1358 if ( (testFloat >= fHeader->minVal) && (testFloat <= fHeader->maxVal) ) {
1359 fHeader->val = testFloat;
1360 return true;
1361 }
1362 }
1363 else
1364 return false;
1365 }
1366 src += *(uint32*)src;
1367 }
1368 return false;
1369}
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381// static
1382ComponentMapEntry* ComponentData::GetAndLockComponentEntry(uint32 id) {
1383 uint32 dataSize;
1384 char* data = MemoryManager::GetAndLockSystemBlock(ID_COMPMAPPAGE, dataSize);
1385 if (data == NULL)
1386 return NULL;
1387 ComponentMapHeader* header = (ComponentMapHeader*)data;
1388 ComponentMapEntry* entry;
1389
1390 // Calc offset
1391 uint32 offset = sizeof(ComponentMapHeader) + header->bitFieldSize + id * sizeof(ComponentMapEntry);
1392 if (offset > header->size) {
1393 MemoryManager::UnlockSystemBlock(ID_COMPMAPPAGE);
1394 return NULL;
1395 }
1396 entry = (ComponentMapEntry*) (data+offset);
1397 if ((entry->id == id) && (entry->time != 0)) {
1398 return entry;
1399 }
1400 else {
1401 MemoryManager::UnlockSystemBlock(ID_COMPMAPPAGE);
1402 return false;
1403 }
1404}
1405
1406// static
1407bool ComponentData::UnlockComponentMap() {
1408 MemoryManager::UnlockSystemBlock(ID_COMPMAPPAGE);
1409 return true;
1410}
1411
1412
1413
1414
1416
1417 // First create and initialise the MemoryManager
1418 unittest::progress(5, "memory manager init");
1419 MemoryManager* manager = new MemoryManager();
1420 uint32 maxPageCount = 100;
1421 if (!manager->create(0, maxPageCount)) {
1422 unittest::fail("ComponentData test: MemoryManager init() failed");
1423 delete(manager);
1424 return false;
1425 }
1426
1427 unittest::progress(15, "create component and lookup");
1428 uint32 cid = 1;
1429 char* name = new char[1024];
1430 strcpy(name, "TestComponent");
1431 ComponentData* data = CreateComponent(cid, name, 1024, 0, 0);
1432 if (data == NULL) {
1433 unittest::fail("ComponentData test: Could not create component data");
1434 delete(data);
1435 delete(manager);
1436 return false;
1437 }
1438
1439 char* str = new char[1024];
1440 if (!GetComponentName(cid, str, 1024)) {
1441 unittest::fail("ComponentData test: Could not get component name");
1442 delete(data);
1443 delete(manager);
1444 return false;
1445 }
1446 if (strcmp(name, str) != 0) {
1447 unittest::fail("ComponentData test: Component name mismatch ('%s' != '%s')", name, str);
1448 delete(data);
1449 delete(manager);
1450 return false;
1451 }
1452
1453 uint32 cid2;
1454 if (!GetComponentID(name, cid2)) {
1455 unittest::fail("ComponentData test: Could not get component id");
1456 delete(data);
1457 delete(manager);
1458 return false;
1459 }
1460 if (cid != cid2) {
1461 unittest::fail("ComponentData test: Component id mismatch ('%u' != '%u')", cid, cid2);
1462 delete(data);
1463 delete(manager);
1464 return false;
1465 }
1466
1467 unittest::progress(25, "resize");
1468 uint32 avail = data->getAvailableDataSize();
1469 if (!data->resize(1024)) {
1470 unittest::fail("ComponentData test: Could not resize component");
1471 delete(data);
1472 delete(manager);
1473 return false;
1474 }
1475 uint32 avail2 = data->getAvailableDataSize();
1476 if (avail2 - avail != 1024) {
1477 unittest::fail("ComponentData test: Component resize failed");
1478 delete(data);
1479 delete(manager);
1480 return false;
1481 }
1482
1483 unittest::progress(35, "private data");
1484 if (!data->setPrivateData("Private0", "Test", 5)) {
1485 unittest::fail("ComponentData test: Component set private data failed");
1486 delete(data);
1487 delete(manager);
1488 return false;
1489 }
1490
1491 if (!data->setPrivateData("Private1", "Test", 5)) {
1492 unittest::fail("ComponentData test: Component set private data failed");
1493 delete(data);
1494 delete(manager);
1495 return false;
1496 }
1497
1498 if (data->getPrivateDataSize("Private1") != 5) {
1499 unittest::fail("ComponentData test: Component get private data size failed");
1500 delete(data);
1501 delete(manager);
1502 return false;
1503 }
1504
1505 char* test = new char[1024];
1506 if (!data->getPrivateDataCopy("Private1", test, 1024)) {
1507 unittest::fail("ComponentData test: Component get private data failed");
1508 delete(data);
1509 delete(manager);
1510 return false;
1511 }
1512
1513 if (strcmp("Test", test) != 0) {
1514 unittest::fail("ComponentData test: Component get private data comparison failed");
1515 delete(data);
1516 delete(manager);
1517 return false;
1518 }
1519
1520 if (!data->setPrivateData("Private1", "Test2", 6)) {
1521 unittest::fail("ComponentData test: Component set private data 2 failed");
1522 delete(data);
1523 delete(manager);
1524 return false;
1525 }
1526
1527 if (data->getPrivateDataSize("Private1") != 6) {
1528 unittest::fail("ComponentData test: Component get private data size 2 failed");
1529 delete(data);
1530 delete(manager);
1531 return false;
1532 }
1533
1534 if (!data->getPrivateDataCopy("Private1", test, 1024)) {
1535 unittest::fail("ComponentData test: Component get private data 2 failed");
1536 delete(data);
1537 delete(manager);
1538 return false;
1539 }
1540
1541 if (strcmp("Test2", test) != 0) {
1542 unittest::fail("ComponentData test: Component get private data comparison 2 failed");
1543 delete(data);
1544 delete(manager);
1545 return false;
1546 }
1547
1548 if (!data->deletePrivateData("Private1")) {
1549 unittest::fail("ComponentData test: Component delete private data failed");
1550 delete(data);
1551 delete(manager);
1552 return false;
1553 }
1554
1555
1556
1557 unittest::progress(50, "create and read parameters");
1558 if (!data->createParameter("Param1", "Test")) {
1559 unittest::fail("ComponentData test: Component create string param failed");
1560 delete(data);
1561 delete(manager);
1562 return false;
1563 }
1564
1565 if (data->createParameter("Param1", (int64)5)) {
1566 unittest::fail("ComponentData test: Component create duplicate name failed to fail");
1567 delete(data);
1568 delete(manager);
1569 return false;
1570 }
1571
1572 if (!data->createParameter("Param2", (int64)5)) {
1573 unittest::fail("ComponentData test: Component create integer param failed");
1574 delete(data);
1575 delete(manager);
1576 return false;
1577 }
1578
1579 if (!data->createParameter("Param3", 5.5)) {
1580 unittest::fail("ComponentData test: Component create float param failed");
1581 delete(data);
1582 delete(manager);
1583 return false;
1584 }
1585
1586 // Check the value of each
1587 if (data->getParameterValueSize("Param1") != 5) {
1588 unittest::fail("ComponentData test: Component get string param size failed");
1589 delete(data);
1590 delete(manager);
1591 return false;
1592 }
1593
1594 if (!data->getParameter("Param1", test, 1024)) {
1595 unittest::fail("ComponentData test: Component get string param failed");
1596 delete(data);
1597 delete(manager);
1598 return false;
1599 }
1600
1601 if (strcmp("Test", test) != 0) {
1602 unittest::fail("ComponentData test: Component get string parameter comparison 2 failed");
1603 delete(data);
1604 delete(manager);
1605 return false;
1606 }
1607
1608 int64 ival;
1609 if (!data->getParameter("Param2", ival)) {
1610 unittest::fail("ComponentData test: Component get integer param failed");
1611 delete(data);
1612 delete(manager);
1613 return false;
1614 }
1615
1616 float64 fval;
1617 if (!data->getParameter("Param3", fval)) {
1618 unittest::fail("ComponentData test: Component get float param failed");
1619 delete(data);
1620 delete(manager);
1621 return false;
1622 }
1623
1624 if (data->getParameter("Param4", fval)) {
1625 unittest::fail("ComponentData test: Component get non-existing param failed to fail");
1626 delete(data);
1627 delete(manager);
1628 return false;
1629 }
1630
1631 // Create max min, tweak and check
1632 unittest::progress(60, "tweak bounded integer parameter");
1633 if (!data->createParameter("Param4", (int64)5, 0, 10, 1)) {
1634 unittest::fail("ComponentData test: Component create integer param 2 failed");
1635 delete(data);
1636 delete(manager);
1637 return false;
1638 }
1639
1640 if (!data->tweakParameter("Param4", 2)) {
1641 unittest::fail("ComponentData test: Component tweak integer param failed");
1642 delete(data);
1643 delete(manager);
1644 return false;
1645 }
1646
1647 if (!data->getParameter("Param4", ival)) {
1648 unittest::fail("ComponentData test: Component get integer param 2 failed");
1649 delete(data);
1650 delete(manager);
1651 return false;
1652 }
1653
1654 if (ival != 7) {
1655 unittest::fail("ComponentData test: Component tweak integer param result failed");
1656 delete(data);
1657 delete(manager);
1658 return false;
1659 }
1660
1661 if (!data->tweakParameter("Param4", -4)) {
1662 unittest::fail("ComponentData test: Component tweak integer param 2 failed");
1663 delete(data);
1664 delete(manager);
1665 return false;
1666 }
1667
1668 if (!data->getParameter("Param4", ival)) {
1669 unittest::fail("ComponentData test: Component get integer param 3 failed");
1670 delete(data);
1671 delete(manager);
1672 return false;
1673 }
1674
1675 if (ival != 3) {
1676 unittest::fail("ComponentData test: Component tweak integer param result 2 failed");
1677 delete(data);
1678 delete(manager);
1679 return false;
1680 }
1681
1682 if (data->tweakParameter("Param4", 8)) {
1683 unittest::fail("ComponentData test: Component tweak integer param 2 failed to fail");
1684 delete(data);
1685 delete(manager);
1686 return false;
1687 }
1688
1689 // Create collection, tweak and check
1690 unittest::progress(70, "integer collection parameter");
1691 int64 i64[] = {1,2,3,4,5};
1692 if (!data->createParameter("Param5", i64, 5, 2)) {
1693 unittest::fail("ComponentData test: Component create integer coll param failed");
1694 delete(data);
1695 delete(manager);
1696 return false;
1697 }
1698
1699 if (!data->getParameter("Param5", ival)) {
1700 unittest::fail("ComponentData test: Component get integer param coll failed");
1701 delete(data);
1702 delete(manager);
1703 return false;
1704 }
1705
1706 if (ival != 3) {
1707 unittest::fail("ComponentData test: Component tweak integer coll param result failed");
1708 delete(data);
1709 delete(manager);
1710 return false;
1711 }
1712
1713 if (!data->tweakParameter("Param5", 2)) {
1714 unittest::fail("ComponentData test: Component tweak integer coll param failed");
1715 delete(data);
1716 delete(manager);
1717 return false;
1718 }
1719
1720 if (!data->getParameter("Param5", ival)) {
1721 unittest::fail("ComponentData test: Component get integer param coll 2 failed");
1722 delete(data);
1723 delete(manager);
1724 return false;
1725 }
1726
1727 if (ival != 5) {
1728 unittest::fail("ComponentData test: Component tweak integer coll param result 2 failed");
1729 delete(data);
1730 delete(manager);
1731 return false;
1732 }
1733
1734 if (data->tweakParameter("Param5", -5)) {
1735 unittest::fail("ComponentData test: Component tweak integer coll param failed to fail");
1736 delete(data);
1737 delete(manager);
1738 return false;
1739 }
1740
1741
1742 strcpy(test, "Test1");
1743 strcpy(test+6, "Test2");
1744 strcpy(test+12, "Test3");
1745 strcpy(test+18, "Test4");
1746 strcpy(test+24, "Test5");
1747
1748 unittest::progress(78, "string collection parameter");
1749 if (!data->createParameter("Param6", test, 5, 2)) {
1750 unittest::fail("ComponentData test: Component create string coll param failed");
1751 delete(data);
1752 delete(manager);
1753 return false;
1754 }
1755
1756 if (!data->getParameter("Param6", test, 1024)) {
1757 unittest::fail("ComponentData test: Component get string param coll failed");
1758 delete(data);
1759 delete(manager);
1760 return false;
1761 }
1762
1763 if (strcmp(test, "Test3") != 0) {
1764 unittest::fail("ComponentData test: Component tweak string coll param result failed");
1765 delete(data);
1766 delete(manager);
1767 return false;
1768 }
1769
1770 if (!data->tweakParameter("Param6", 2)) {
1771 unittest::fail("ComponentData test: Component tweak string coll param failed");
1772 delete(data);
1773 delete(manager);
1774 return false;
1775 }
1776
1777 if (!data->getParameter("Param6", test, 1024)) {
1778 unittest::fail("ComponentData test: Component get string param coll 2 failed");
1779 delete(data);
1780 delete(manager);
1781 return false;
1782 }
1783
1784 if (strcmp(test, "Test5") != 0) {
1785 unittest::fail("ComponentData test: Component tweak string coll param result 2 failed");
1786 delete(data);
1787 delete(manager);
1788 return false;
1789 }
1790
1791 if (data->tweakParameter("Param6", -5)) {
1792 unittest::fail("ComponentData test: Component tweak string coll param failed to fail");
1793 delete(data);
1794 delete(manager);
1795 return false;
1796 }
1797
1798 unittest::progress(85, "delete parameter and destroy component");
1799 if (!data->deleteParameter("Param3")) {
1800 unittest::fail("ComponentData test: Component delete float param failed");
1801 delete(data);
1802 delete(manager);
1803 return false;
1804 }
1805
1806 if (!data->destroyComponent()) {
1807 unittest::fail("ComponentData test: Could not destroy component");
1808 delete(data);
1809 delete(manager);
1810 return false;
1811 }
1812 delete(data);
1813
1814
1815 unittest::progress(92, "type level maps");
1816 uint16 tidt;
1817 if (!MemoryMaps::CreateNewTypeLevel(1, "Type1")) {
1818 unittest::fail("ComponentData test: Could not create new type");
1819 delete(manager);
1820 return false;
1821 }
1822
1823 if (!MemoryMaps::CreateNewTypeLevel(2, "Type2")) {
1824 unittest::fail("ComponentData test: Could not create new type 2");
1825 delete(manager);
1826 return false;
1827 }
1828
1829 if (!MemoryMaps::GetTypeLevelID("Type2", tidt)) {
1830 unittest::fail("ComponentData test: Could not get type id");
1831 delete(manager);
1832 return false;
1833 }
1834
1835 if (2 != tidt) {
1836 unittest::fail("ComponentData test: Type id mismatch");
1837 delete(manager);
1838 return false;
1839 }
1840
1841 if (!MemoryMaps::GetTypeLevelName(2, test, 1024)) {
1842 unittest::fail("ComponentData test: Could not get type name");
1843 delete(manager);
1844 return false;
1845 }
1846
1847 if (strcmp(test, "Type2")) {
1848 unittest::fail("ComponentData test: Type name mismatch");
1849 delete(manager);
1850 return false;
1851 }
1852
1853
1854
1855 //uint32 idt;
1856 //if (!MemoryMaps::CreateNewTopic(1, "Topic1")) {
1857 // fprintf(stderr, "Could not create new topic...\n");
1858 // delete(manager);
1859 // return false;
1860 //}
1861
1862 //if (!MemoryMaps::CreateNewTopic(2, "Topic2")) {
1863 // fprintf(stderr, "Could not create new topic 2...\n");
1864 // delete(manager);
1865 // return false;
1866 //}
1867
1868 //if (!MemoryMaps::GetTopicID("Topic2", idt)) {
1869 // fprintf(stderr, "Could not get topic id...\n");
1870 // delete(manager);
1871 // return false;
1872 //}
1873 //
1874 //if (2 != idt) {
1875 // fprintf(stderr, "Topic id mismatch...\n");
1876 // delete(manager);
1877 // return false;
1878 //}
1879
1880 //if (!MemoryMaps::GetTopicName(2, test, 1024)) {
1881 // fprintf(stderr, "Could not get topic name...\n");
1882 // delete(manager);
1883 // return false;
1884 //}
1885 //
1886 //if (strcmp(test, "Topic2")) {
1887 // fprintf(stderr, "Topic name mismatch...\n");
1888 // delete(manager);
1889 // return false;
1890 //}
1891
1892
1893 //uint64 addr = 0xaabbccdd;
1894 //uint64 addr2 = 0xaabbccee;
1895 //uint64 addrt;
1896 //uint16 idtt;
1897 //if (!MemoryMaps::CreateNewNode(1, "", addr)) {
1898 // fprintf(stderr, "Could not create new Node...\n");
1899 // delete(manager);
1900 // return false;
1901 //}
1902
1903 //if (!MemoryMaps::CreateNewNode(2, "", addr2)) {
1904 // fprintf(stderr, "Could not create new Node 2...\n");
1905 // delete(manager);
1906 // return false;
1907 //}
1908
1909 //if (!MemoryMaps::GetNodeID(addr2, idtt)) {
1910 // fprintf(stderr, "Could not get Node id...\n");
1911 // delete(manager);
1912 // return false;
1913 //}
1914 //
1915 //if (2 != idtt) {
1916 // fprintf(stderr, "Node id mismatch...\n");
1917 // delete(manager);
1918 // return false;
1919 //}
1920
1921 //if ( (addrt = MemoryMaps::GetNodeAddress(2)) == 0 ) {
1922 // fprintf(stderr, "Could not get Node address...\n");
1923 // delete(manager);
1924 // return false;
1925 //}
1926 //
1927 //if (2 != addrt) {
1928 // fprintf(stderr, "Node address mismatch...\n");
1929 // delete(manager);
1930 // return false;
1931 //}
1932
1933 delete [] str;
1934 delete [] test;
1935 delete [] name;
1936 delete(manager);
1937 unittest::progress(100, "done");
1938 return true;
1939}
1940
1943 "Component maps: private data, parameters, collections, type levels", "memory");
1944}
1945
1946} // namespace cmlabs
Legacy per-component data record stored in the page-based allocator (predecessor of ComponentMemory).
#define PARAM_FLOAT_COLL
#define PARAM_STRING_COLL
#define PARAM_INTEGER_COLL
#define PARAM_INTEGER
#define PARAM_STRING
#define PARAM_FLOAT
#define ID_COMPMAPPAGE
Component map.
Definition MemoryMaps.h:28
CMSDK time: µs-resolution 64-bit timestamps and the Time Mapping Constant (TMC).
#define BITOCCUPIED
Definition Types.h:34
#define BITFREE
Definition Types.h:33
Small, dependency-free unit test harness used by all CMSDK object tests.
#define MAXKEYNAMELEN
Definition Utils.h:85
static bool AddComponentStats(uint32 cid, uint64 userCPU, uint64 kernelCPU, DataMessage *inputMsg, DataMessage *outputMsg, uint32 runCount)
static bool SetComponentStats(uint32 cid, ComponentStats &stats)
static uint16 GetComponentNodeID(uint32 cid)
static ComponentData * CreateComponent(uint32 id, const char *name, uint32 size, uint16 nodeID, uint16 procID)
static bool IsComponentLocal(uint32 cid)
bool hasParameter(const char *name)
static bool UpdateRemoteComponent(uint32 cid, uint16 nodeID, uint16 procID, const char *name)
ComponentData(char *data)
Wrap an existing raw component record.
bool tweakParameter(const char *name, int32 tweak)
static uint16 GetComponentProcessID(uint32 cid)
static bool GetComponentID(const char *name, uint32 &cid)
static bool ReserveComponentID(uint32 id, const char *name)
bool createParameter(const char *name, const char *val, const char *defaultValue=NULL)
static bool GetComponentName(uint32 cid, char *name, uint32 maxNameLen)
bool getPrivateDataCopy(const char *name, char *data, uint32 maxSize)
uint32 getParameterValueSize(const char *name)
static bool RecordRemoteComponent(uint32 id, const char *name, uint16 nodeID, uint64 time)
bool setPrivateData(const char *name, const char *data, uint32 size)
static bool AddExistingComponent(uint32 cid, uint16 nodeID, uint16 procID, char *oldData, uint32 dataSize)
static ComponentStats GetComponentStats(uint32 cid)
bool deleteParameter(const char *name)
bool replacePrivateData(const char *name, const char *data, uint32 size)
bool deletePrivateData(const char *name)
static char * GetAndRemoveComponent(uint32 cid, uint32 &dataSize)
static bool DestroyComponent(uint32 cid)
bool resetParameter(const char *name)
bool getParameter(const char *name, char *val, uint32 maxSize)
static bool UnitTest()
Self-test.
bool resize(uint32 increase)
uint8 getParameterDataType(const char *name)
static ComponentData * GetComponentData(uint32 cid)
bool setParameter(const char *name, const char *val)
uint32 getPrivateDataSize(const char *name)
The central Psyclone data container: a self-contained binary message with typed, named user entries.
DataMessageHeader * data
Pointer to the message's flat memory block (header + user entries).
uint32 getSize()
getSize() Get message size Many types of data of any size can be put into a message as user entries; ...
Top-level facade of the shared-memory subsystem for one process.
bool create(uint16 sysID, uint32 slotCount=100000, uint16 binCount=2, uint32 minBlockSize=1024, uint32 maxBlockSize=64 *1024, uint64 initSize=50000000L, uint64 maxSize=1000000000L, bool force=false)
Create all shared segments for a new node instance (master process only).
static bool CreateNewTypeLevel(uint16 id, const char *name, uint64 time=0)
static bool GetTypeLevelID(const char *name, uint16 &id)
static bool GetTypeLevelName(uint16 id, char *name, uint32 maxSize)
static UnitTestRunner & instance()
Access the singleton (created on first use).
void registerTest(const char *name, UnitTestFunc func, const char *description="", const char *category="", bool inDefaultRun=true)
Register a test with the runner.
uint64 GetTimeNow()
Return the current absolute time (µs since year 0) according to the TMC.
Definition PsyTime.cpp:69
bool GetFirstFreeBitLoc(const char *bitfield, uint32 bytesize, uint32 &loc)
Find the first 0 (free) bit.
Definition Utils.cpp:2445
int64 Ascii2Int64(const char *ascii, uint32 start=0, uint32 end=0)
Parse a signed 64-bit decimal integer from a substring.
Definition Utils.cpp:7462
bool SetBit(uint32 loc, bit value, char *bitfield, uint32 bytesize)
Set bit loc to value.
Definition Utils.cpp:2569
uint32 strcpyavail(char *dst, const char *src, uint32 maxlen, bool copyAvailable)
Bounded strcpy that always NUL-terminates.
Definition Utils.cpp:6056
float64 Ascii2Float64(const char *ascii, uint32 start=0, uint32 end=0)
Parse a 64-bit float from a substring (decimal point, not locale dependent).
Definition Utils.cpp:7546
void fail(const char *fmt,...)
Set an explanatory reason shown on the FAIL line.
void progress(int percent, const char *action)
Report progress with a short description of the current action.
void Register_ComponentData_Tests()
Fixed header of a legacy component data record; followed by parameter and private-data areas.
char name[MAXKEYNAMELEN]
One component's location record in the legacy component map.
uint16 nodeID
uint16 procID
uint64 time
uint32 pageID
char name[MAXKEYNAMELEN+1]
uint32 id
Header of the legacy shared component map (bitfield + ComponentMapEntry array).
Legacy per-component throughput counters (DataMessageHeader-based rings).
uint64 time
Timestamp of the last update (µs).
The current (version 10) DataMessage wire/shared-memory header.
Legacy value block of a collection parameter; followed by the packed values.
Legacy value block of a float parameter.
Legacy size/type prefix of one parameter entry.
Legacy value block of an integer parameter.