11 this->master = master;
17 contextMapHeader = NULL;
19 crankMapHeader = NULL;
21 requestMapHeader = NULL;
26 mutex->enter(5000, __FUNCTION__);
29 contextMapHeader = NULL;
31 crankMapHeader = NULL;
33 requestMapHeader = NULL;
45 if (!mutex || !mutex->enter(5000, __FUNCTION__))
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);
68 serial = master->getDataMapsShmemSerial();
69 uint64 size = master->getDataMapsShmemSize();
70 this->port = master->port;
72 bool createdMutex =
false;
77 if (!mutex->enter(5000, __FUNCTION__))
81 LogPrint(0,
LOG_MEMORY,0,
" --------- Reopening DataMapsMemory section serial %u --------", serial);
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);
114 if (!mutex || !mutex->enter(5000, __FUNCTION__))
120 uint32 newTypeCount = header->typesMaxCount;
121 uint32 newContextCount = header->contextsMaxCount;
122 uint32 newTagCount = header->tagsMaxCount;
123 uint32 newCrankCount = header->cranksMaxCount;
125 uint32 newRequestCount = header->requestsMaxCount;
127 bool shouldResize =
false;
128 if (header->typesMaxCount - typeMapHeader->count < (header->typesMaxCount * 0.1)) {
129 newTypeCount = (uint32)(header->typesMaxCount * factor);
132 if (header->contextsMaxCount - contextMapHeader->count < (header->contextsMaxCount * 0.1)) {
133 newContextCount = (uint32)(header->contextsMaxCount * factor);
136 if (header->tagsMaxCount - tagMapHeader->count < (header->tagsMaxCount * 0.1)) {
137 newTagCount = (uint32)(header->tagsMaxCount * factor);
140 if (header->cranksMaxCount - crankMapHeader->count < (header->cranksMaxCount * 0.1)) {
141 newCrankCount = (uint32)(header->cranksMaxCount * factor);
146 if (header->requestsMaxCount - requestMapHeader->count < (header->requestsMaxCount * 0.1)) {
147 newRequestCount = (uint32)(header->requestsMaxCount * factor);
152 resize(master->port, serial = master->incrementDataMapsShmemSerial(), newTypeCount, newContextCount, newTagCount, newCrankCount, newRequestCount);
159bool DataMapsMemory::resize(uint16 port, uint32 serial, uint32 typesMaxCount, uint32 contextsMaxCount, uint32 tagsMaxCount, uint32 cranksMaxCount, uint32 requestsMaxCount) {
163 if (!mutex->
enter(5000, __FUNCTION__)) {
169 uint32 typesSize =
sizeof(GenericMapHeader) + typesBitFieldSize + typesMaxCount*
sizeof(TypeMapEntry);
171 uint32 contextsSize =
sizeof(GenericMapHeader) + contextsBitFieldSize + contextsMaxCount*
sizeof(ContextMapEntry);
173 uint32 tagsSize =
sizeof(GenericMapHeader) + tagsBitFieldSize + tagsMaxCount*
sizeof(TagMapEntry);
175 uint32 cranksSize =
sizeof(GenericMapHeader) + cranksBitFieldSize + cranksMaxCount*
sizeof(CrankMapEntry);
179 uint32 requestsSize =
sizeof(GenericMapHeader) + requestsBitFieldSize + requestsMaxCount*
sizeof(RequestMapEntry);
181 uint32 newMemorySize = typesSize + contextsSize + tagsSize + cranksSize + requestsSize +
sizeof(DataMapsMemoryStruct);
183 if (newMemorySize > 100000000) {
188 else if (newMemorySize > 50000000) {
205 memset(newHeader, 0, (
size_t)memorySize);
206 newHeader->size = memorySize;
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;
224 newHeader->requestsMaxCount = requestsMaxCount;
225 newHeader->requestsBitFieldSize = requestsBitFieldSize;
226 newHeader->requestsSize = requestsSize;
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);
241 memcpy((
char*)typeMapHeader +
sizeof(GenericMapHeader),
242 (
char*)oldSubHeader +
sizeof(GenericMapHeader),
243 oldSubHeader->bitFieldSize);
245 memcpy((
char*)typeMapHeader +
sizeof(GenericMapHeader) + typesBitFieldSize,
246 (
char*)oldSubHeader +
sizeof(GenericMapHeader) + oldSubHeader->bitFieldSize,
247 (
size_t)(oldSubHeader->size -
sizeof(GenericMapHeader) - oldSubHeader->bitFieldSize));
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);
257 utils::SetBit(0,
BITOCCUPIED, ((
char*)contextMapHeader +
sizeof(GenericMapHeader)), contextMapHeader->bitFieldSize);
260 memcpy((
char*)contextMapHeader +
sizeof(GenericMapHeader),
261 (
char*)oldSubHeader +
sizeof(GenericMapHeader),
262 oldSubHeader->bitFieldSize);
264 memcpy((
char*)contextMapHeader +
sizeof(GenericMapHeader) + contextsBitFieldSize,
265 (
char*)oldSubHeader +
sizeof(GenericMapHeader) + oldSubHeader->bitFieldSize,
266 (
size_t)(oldSubHeader->size -
sizeof(GenericMapHeader) - oldSubHeader->bitFieldSize));
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);
279 memcpy((
char*)tagMapHeader +
sizeof(GenericMapHeader),
280 (
char*)oldSubHeader +
sizeof(GenericMapHeader),
281 oldSubHeader->bitFieldSize);
283 memcpy((
char*)tagMapHeader +
sizeof(GenericMapHeader) + tagsBitFieldSize,
284 (
char*)oldSubHeader +
sizeof(GenericMapHeader) + oldSubHeader->bitFieldSize,
285 (
size_t)(oldSubHeader->size -
sizeof(GenericMapHeader) - oldSubHeader->bitFieldSize));
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);
298 memcpy((
char*)crankMapHeader +
sizeof(GenericMapHeader),
299 (
char*)oldSubHeader +
sizeof(GenericMapHeader),
300 oldSubHeader->bitFieldSize);
302 memcpy((
char*)crankMapHeader +
sizeof(GenericMapHeader) + cranksBitFieldSize,
303 (
char*)oldSubHeader +
sizeof(GenericMapHeader) + oldSubHeader->bitFieldSize,
304 (
size_t)(oldSubHeader->size -
sizeof(GenericMapHeader) - oldSubHeader->bitFieldSize));
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);
329 utils::SetBit(0,
BITOCCUPIED, ((
char*)requestMapHeader +
sizeof(GenericMapHeader)), requestMapHeader->bitFieldSize);
332 memcpy((
char*)requestMapHeader +
sizeof(GenericMapHeader),
333 (
char*)oldSubHeader +
sizeof(GenericMapHeader),
334 oldSubHeader->bitFieldSize);
336 memcpy((
char*)requestMapHeader +
sizeof(GenericMapHeader) + requestsBitFieldSize,
337 (
char*)oldSubHeader +
sizeof(GenericMapHeader) + oldSubHeader->bitFieldSize,
338 (
size_t)(oldSubHeader->size -
sizeof(GenericMapHeader) - oldSubHeader->bitFieldSize));
344 memorySize = newMemorySize;
347 master->setDataMapsShmemSize(memorySize);
358 if (!mutex || !mutex->enter(5000, __FUNCTION__))
367 if (!mutex || !mutex->enter(5000, __FUNCTION__))
376 if (!mutex || !mutex->enter(5000, __FUNCTION__))
391 if (!mutex || !mutex->enter(5000, __FUNCTION__))
405 while ( (
id = (uint16)msg->
getInt(n,
"ID")) && (name = msg->
getString(n,
"Name")) && (time = msg->
getTime(n,
"CreatedTime"))) {
415 if (!mutex || !mutex->enter(5000, __FUNCTION__))
429 while ((
id = (uint16)msg->
getInt(n,
"ID")) && (name = msg->
getString(n,
"Name")) && (time = msg->
getTime(n,
"CreatedTime"))) {
439 if (!mutex || !mutex->enter(5000, __FUNCTION__))
453 while ((
id = (uint16)msg->
getInt(n,
"ID")) && (name = msg->
getString(n,
"Name")) && (time = msg->
getTime(n,
"CreatedTime"))) {
463 if (!mutex || !mutex->enter(5000, __FUNCTION__))
474 const char* name, *function, *libraryFilename, *language, *script;
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");
483 libraryFilename ? libraryFilename :
"", language ? language :
"", script ? script :
"", time, exID))
493 if (!mutex || !mutex->enter(5000, __FUNCTION__))
498 if (existingID && (existingID !=
id)) {
503 if (
id > header->typesMaxCount) {
505 if (!resize(port, serial = master->incrementDataMapsShmemSerial(),
id + 1024, header->contextsMaxCount, header->tagsMaxCount, header->cranksMaxCount, header->requestsMaxCount)) {
507 printf(
"createNewTypeLevel resize failed\n");
517 printf(
"createNewTypeLevel '%s' %u failed\n", name,
id); fflush(stdout);
520 printf(
"createNewTypeLevel '%s' %u failed - existing entry: '%s'\n", name,
id, entry->
name); fflush(stdout);
534 if (!mutex || !mutex->enter(5000, __FUNCTION__))
549 if (!mutex || !mutex->enter(5000, __FUNCTION__))
565 if (!mutex || !mutex->enter(5000, __FUNCTION__))
575 if (!mutex || !mutex->enter(5000, __FUNCTION__))
591 if (!mutex || !mutex->enter(5000, __FUNCTION__))
606 if (!mutex || !mutex->enter(5000, __FUNCTION__))
616 if (!mutex || !mutex->enter(5000, __FUNCTION__))
632 if (!mutex || !mutex->enter(5000, __FUNCTION__))
641 if (!mutex || !mutex->enter(5000, __FUNCTION__))
650 if (!mutex || !mutex->enter(5000, __FUNCTION__))
655 if (existingID && (existingID !=
id)) {
660 if (
id > header->contextsMaxCount) {
661 if (!resize(port, serial = master->incrementDataMapsShmemSerial(), header->typesMaxCount,
id + 1024, header->tagsMaxCount, header->cranksMaxCount, header->requestsMaxCount)) {
680 if (!mutex || !mutex->enter(5000, __FUNCTION__))
695 if (!mutex || !mutex->enter(5000, __FUNCTION__))
710 if (!mutex || !mutex->enter(5000, __FUNCTION__))
719 if (!mutex || !mutex->enter(5000, __FUNCTION__))
735 if (!mutex || !mutex->enter(5000, __FUNCTION__))
750 if (!mutex || !mutex->enter(5000, __FUNCTION__))
760 if (!mutex || !mutex->enter(5000, __FUNCTION__))
776 if (!mutex || !mutex->enter(5000, __FUNCTION__))
785 if (!mutex || !mutex->enter(5000, __FUNCTION__))
794 if (!mutex || !mutex->enter(5000, __FUNCTION__))
799 if (existingID && (existingID !=
id)) {
804 if (
id > header->tagsMaxCount) {
805 if (!resize(port, serial = master->incrementDataMapsShmemSerial(), header->typesMaxCount, header->contextsMaxCount,
id + 1024, header->cranksMaxCount, header->requestsMaxCount)) {
824 if (!mutex || !mutex->enter(5000, __FUNCTION__))
839 if (!mutex || !mutex->enter(5000, __FUNCTION__))
855 if (!mutex || !mutex->enter(5000, __FUNCTION__))
865 if (!mutex || !mutex->enter(5000, __FUNCTION__))
881 if (!mutex || !mutex->enter(5000, __FUNCTION__))
896 if (!mutex || !mutex->enter(5000, __FUNCTION__))
915 if (!mutex || !mutex->enter(5000, __FUNCTION__))
924 if (!mutex || !mutex->enter(5000, __FUNCTION__))
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__))
938 if (existingID && (existingID !=
id)) {
943 if (
id > header->cranksMaxCount) {
944 if (!resize(port, serial = master->incrementDataMapsShmemSerial(), header->typesMaxCount, header->contextsMaxCount, header->tagsMaxCount,
id + 1024, header->requestsMaxCount)) {
967 if (!mutex || !mutex->enter(5000, __FUNCTION__))
983 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1000 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1017 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1034 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1049 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1064 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1073 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1078 uint32 compID = entry->compID;
1089 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1105 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1120 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1138 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1158 entry->remoteID = remoteID;
1159 entry->lastUpdate = 0;
1161 snprintf(entry->name,
MAXKEYNAMELEN,
"ReqPsycloneProcessMemoryRequest_%u_%u", port,
id);
1168 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1175 remoteID = entry->remoteID;
1186 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1191 status = entry->status;
1192 time = entry->lastUpdate;
1193 msgID = entry->dataMessageID;
1194 msgEOL = entry->dataMessageEOL;
1205 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1210 entry->status = status;
1223 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1228 entry->status = status;
1230 entry->dataMessageID = msgID;
1231 entry->dataMessageEOL = msgEOL;
1246 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1263 if (!mutex->enter(5000, __FUNCTION__)) {
1276 status = entry->status;
1277 time = entry->lastUpdate;
1278 msgID = entry->dataMessageID;
1279 msgEOL = entry->dataMessageEOL;
1288 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1303 if (!mutex || !mutex->enter(5000, __FUNCTION__))
1314 if (!mutex || !mutex->enter(5000, __FUNCTION__))
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>";
1333 if (!mutex || !mutex->enter(5000, __FUNCTION__))
Shared-memory name/id maps: message types, contexts, tags, cranks and cross-process requests.
#define CHECKDATAMAPSMEMORYSERIAL
Re-open the data-maps segment if the master's resize serial no longer matches ours; bails out of the ...
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)
bool deleteCrank(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)
std::string printAllContexts()
bool getCrankFunction(uint16 id, char *function, uint32 maxSize)
std::string printAllTypes()
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)
std::string printFriendlyHTML()
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.
bool leave()
Release the mutex.
bool enter()
Block until the mutex is acquired.
std::string PrintTimeString(uint64 t, bool local=true, bool us=true, bool ms=true)
uint64 GetTimeNow()
Return the current absolute time (µs since year 0) according to the TMC.
int32 GetTimeAgeMS(uint64 t)
Age of a timestamp relative to now, in milliseconds.
bool SignalSemaphore(const char *name)
Signal a named global semaphore.
bool WaitForSemaphore(const char *name, uint32 ms, bool autocreate=true)
Wait on a named global semaphore.
char * OpenSharedMemorySegment(const char *name, uint64 size)
Open and map an existing named shared memory segment.
char * CreateSharedMemorySegment(const char *name, uint64 size, bool force=false)
Create a named shared memory segment and map it into this process.
bool CloseSharedMemorySegment(char *data, uint64 size)
Unmap a segment previously created/opened here.
std::string BytifySize(double val)
Format a byte count with binary units, e.g.
std::string StringFormat(const char *format,...)
printf into a std::string.
bool SetBit(uint32 loc, bit value, char *bitfield, uint32 bytesize)
Set bit loc to value.
uint32 Calc32BitFieldSize(uint32 bitsize)
Compute the byte size needed for a bitfield of bitsize bits, rounded up to a 32-bit boundary.
uint32 strcpyavail(char *dst, const char *src, uint32 maxlen, bool copyAvailable)
Bounded strcpy that always NUL-terminates.
Context-map entry: one registered psychological/system context name/id.
Crank-map entry: one registered crank (user callback/script) with its function, library and inline sc...
char function[MAXKEYNAMELEN+1]
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.
Request-map entry tracking one cross-component request/reply transaction.
Tag-map entry: one registered tag name/id.
Type-map entry: one registered message type name/id.
char name[MAXKEYNAMELEN+1]