126 NvFlowUint64 version;
132 NvFlowReflectDeepCopy_destroy(deepCopy);
141 NvFlowUint64 luid = 0llu;
142 NvFlowUint64 luidByteOffset = ~0llu;
146 NvFlowBool32 markedForDestroy = NV_FLOW_FALSE;
152 NvFlowUint64 childIdx;
158 NvFlowUint8* mapDataVersionAndType(NvFlowUint64 version,
const NvFlowReflectDataType** pReflectDataType)
160 for (NvFlowUint64 idx = datas.activeCount() - 1u; idx < datas.activeCount(); idx--)
162 if (datas[idx]->version == version)
164 if (pReflectDataType)
166 *pReflectDataType = dataType;
168 return datas[idx]->data.data;
173 data->version = version;
174 data->data.reserve(dataType->elementSize);
175 data->data.size = dataType->elementSize;
176 if (datas.activeCount() >= 2u)
179 memcpy(data->data.data, oldData->data.data, data->data.size);
181 else if (dataType->defaultValue)
183 memcpy(data->data.data, dataType->defaultValue, data->data.size);
187 memset(data->data.data, 0, data->data.size);
191 if (luidByteOffset < dataType->elementSize)
193 *((NvFlowUint64*)(data->data.data + luidByteOffset)) = luid;
196 if (pReflectDataType)
198 *pReflectDataType = dataType;
200 return data->data.data;
203 NvFlowUint8* mapDataVersion(NvFlowUint64 version)
206 return mapDataVersionAndType(version, &reflectDataType);
209 void deepCopyDataVersion(NvFlowUint64 version)
211 Data* data =
nullptr;
212 for (NvFlowUint64 idx = datas.activeCount() - 1u; idx < datas.activeCount(); idx--)
214 if (datas[idx]->version == version)
223 data->deepCopy = NvFlowReflectDeepCopy_create();
226 NvFlowUint8* copyData = NvFlowReflectDeepCopy_update(data->deepCopy, data->data.data, dataType);
229 memcpy(data->data.data, copyData, data->data.size);
233 NvFlowUint8* mapDataVersionReadOnly(NvFlowUint64 version)
236 return mapDataVersion(version);
239 template<const NvFlowDatabaseInterface* iface>
240 void init(NvFlowDatabaseContext*
context, NvFlowUint64 version, NvFlowUint64 luidIn,
const NvFlowReflectDataType* dataTypeIn,
const char* displayTypenameIn,
const char* pathIn,
const char* nameIn)
242 dataType = dataTypeIn;
243 displayTypename.set(displayTypenameIn);
246 luidByteOffset = ~0llu;
248 for (NvFlowUint64 childIdx = 0u; childIdx < dataType->childReflectDataCount; childIdx++)
250 if (strcmp(dataType->childReflectDatas[childIdx].name,
"luid") == 0)
252 luidByteOffset = dataType->childReflectDatas[childIdx].dataOffset;
257 rootPrim.path.set(pathIn);
258 rootPrim.prim =
nullptr;
259 if (iface->createPrim)
261 rootPrim.prim = iface->createPrim(
265 displayTypename.get(),
270 NvFlowUint8* mappedData = mapDataVersion(version);
272 StackState state = { 0llu, dataType, mappedData, &rootPrim };
274 for (; state.childIdx < state.reflectDataType->childReflectDataCount; state.childIdx++)
277 while (state.reflectDataType->childReflectDatas[state.childIdx].dataType->dataType == eNvFlowType_struct)
279 const NvFlowReflectData* childReflectData = state.reflectDataType->childReflectDatas + state.childIdx;
280 auto childPrim = state.prim->childPrims.allocateBackPointer();
281 state.prim->attrs.pushBack(
nullptr);
284 childPrim->path.set(state.prim->path.get());
285 childPrim->path.append(
"/");
286 childPrim->path.append(childReflectData->name);
288 childPrim->prim =
nullptr;
289 if (iface->createPrim)
291 childPrim->prim = iface->createPrim(
295 NvFlowReflectTrimPrefix(childReflectData->dataType->structTypename),
296 childPrim->path.get(),
297 childReflectData->name);
300 stateStack.pushBack(state);
302 state.reflectDataType = childReflectData->dataType;
303 state.data += childReflectData->dataOffset;
304 state.prim = childPrim;
307 if (state.childIdx < state.reflectDataType->childReflectDataCount)
309 const NvFlowReflectData* childReflectData = state.reflectDataType->childReflectDatas + state.childIdx;
311 if (iface->createAttr)
313 attr = iface->createAttr(
context, version, state.prim->prim, childReflectData, state.data);
315 state.prim->attrs.pushBack(attr);
316 state.prim->childPrims.pushBack(
nullptr);
319 while (state.childIdx + 1u >= state.reflectDataType->childReflectDataCount && stateStack.size > 0u)
321 state = stateStack.back();
322 stateStack.popBack();
327 void process(NvFlowUint64 version, NvFlowReflectProcess_t processReflect,
void* userdata)
329 NvFlowUint8* mappedData = mapDataVersion(version);
331 processReflect(mappedData, dataType, userdata);
334 template<const NvFlowDatabaseInterface* iface>
335 void update(NvFlowDatabaseContext*
context, NvFlowUint64 version, NvFlowUint64 minActiveVersion)
337 if (!markedForDestroy)
339 NvFlowUint8* mappedData = mapDataVersion(version);
343 iface->updatePrim(
context, version, minActiveVersion, rootPrim.prim);
346 StackState state = { 0llu, dataType, mappedData, &rootPrim };
348 for (; state.childIdx < state.reflectDataType->childReflectDataCount; state.childIdx++)
351 while (state.reflectDataType->childReflectDatas[state.childIdx].dataType->dataType == eNvFlowType_struct)
353 const NvFlowReflectData* childReflectData = state.reflectDataType->childReflectDatas + state.childIdx;
354 auto childPrim = state.prim->childPrims[state.childIdx];
357 iface->updatePrim(
context, version, minActiveVersion, childPrim->prim);
360 stateStack.pushBack(state);
362 state.reflectDataType = childReflectData->dataType;
363 state.data += childReflectData->dataOffset;
364 state.prim = childPrim;
367 if (state.childIdx < state.reflectDataType->childReflectDataCount)
369 const NvFlowReflectData* childReflectData = state.reflectDataType->childReflectDatas + state.childIdx;
370 auto attr = state.prim->attrs[state.childIdx];
373 iface->updateAttr(
context, version, minActiveVersion, attr, childReflectData, state.data);
377 while (state.childIdx + 1u >= state.reflectDataType->childReflectDataCount && stateStack.size > 0u)
379 state = stateStack.back();
380 stateStack.popBack();
385 NvFlowUint freeTreshold = markedForDestroy ? 0u : 1u;
386 while (datas.activeCount() > freeTreshold && datas.front()->version < minActiveVersion)
392 template<const NvFlowDatabaseInterface* iface>
393 void markForDestroy(NvFlowDatabaseContext*
context)
395 NvFlowUint8* mappedData =
nullptr;
396 StackState state = { 0llu, dataType, mappedData, &rootPrim };
398 for (; state.childIdx < state.reflectDataType->childReflectDataCount; state.childIdx++)
401 while (state.reflectDataType->childReflectDatas[state.childIdx].dataType->dataType == eNvFlowType_struct)
403 const NvFlowReflectData* childReflectData = state.reflectDataType->childReflectDatas + state.childIdx;
404 auto childPrim = state.prim->childPrims[state.childIdx];
406 stateStack.pushBack(state);
408 state.reflectDataType = childReflectData->dataType;
409 state.data += childReflectData->dataOffset;
410 state.prim = childPrim;
413 if (state.childIdx < state.reflectDataType->childReflectDataCount)
415 auto attr = state.prim->attrs[state.childIdx];
418 iface->markDestroyedAttr(
context, attr);
422 while (state.childIdx + 1u >= state.reflectDataType->childReflectDataCount && stateStack.size > 0u)
424 if (state.prim->prim)
426 iface->markDestroyedPrim(
context, state.prim->prim);
428 state = stateStack.back();
429 stateStack.popBack();
434 iface->markDestroyedPrim(
context, rootPrim.prim);
437 markedForDestroy = NV_FLOW_TRUE;
440 template<const NvFlowDatabaseInterface* iface>
441 void destroy(NvFlowDatabaseContext*
context)
443 NvFlowUint8* mappedData =
nullptr;
444 StackState state = { 0llu, dataType, mappedData, &rootPrim };
446 for (; state.childIdx < state.reflectDataType->childReflectDataCount; state.childIdx++)
449 while (state.reflectDataType->childReflectDatas[state.childIdx].dataType->dataType == eNvFlowType_struct)
451 const NvFlowReflectData* childReflectData = state.reflectDataType->childReflectDatas + state.childIdx;
452 auto childPrim = state.prim->childPrims[state.childIdx];
454 stateStack.pushBack(state);
456 state.reflectDataType = childReflectData->dataType;
457 state.data += childReflectData->dataOffset;
458 state.prim = childPrim;
461 if (state.childIdx < state.reflectDataType->childReflectDataCount)
463 auto attr = state.prim->attrs[state.childIdx];
466 iface->destroyAttr(
context, attr);
471 while (state.childIdx + 1u >= state.reflectDataType->childReflectDataCount && stateStack.size > 0u)
473 if (state.prim->prim)
475 iface->destroyPrim(
context, state.prim->prim);
476 state.prim->prim =
nullptr;
478 state = stateStack.back();
479 stateStack.popBack();
484 iface->destroyPrim(
context, rootPrim.prim);
485 rootPrim.prim =
nullptr;
505 dataType = dataTypeIn;
506 displayTypeName.set(displayTypeNameIn);
509 template<const NvFlowDatabaseInterface* iface>
510 void update(NvFlowDatabaseContext*
context, NvFlowUint64 version, NvFlowUint64 minActiveVersion)
512 for (NvFlowUint instanceIdx = 0u; instanceIdx < instances.size; instanceIdx++)
514 instances[instanceIdx]->update<iface>(
context, version, minActiveVersion);
519 NvFlowUint64 keepCount = 0llu;
520 for (NvFlowUint instanceIdx = 0u; instanceIdx < instances.size; instanceIdx++)
522 if (instances[instanceIdx]->markedForDestroy && instances[instanceIdx]->datas.activeCount() == 0u)
524 instances[instanceIdx]->destroy<iface>(
context);
525 instances.deletePointerAtIndex(instanceIdx);
529 instances.swapPointers(keepCount, instanceIdx);
533 instances.size = keepCount;
537 while (snapshots.activeCount() > 0u && snapshots.front()->snapshot.version < minActiveVersion)
539 snapshots.popFront();
543 template<const NvFlowDatabaseInterface* iface>
544 void destroy(NvFlowDatabaseContext*
context)
546 for (NvFlowUint instanceIdx = 0u; instanceIdx < instances.size; instanceIdx++)
548 instances[instanceIdx]->destroy<iface>(
context);
550 instances.deletePointers();
555 auto ptr = snapshots.allocateBackPointer();
557 ptr->snapshot.version = version;
558 ptr->snapshot.dataType = dataType;
559 ptr->instanceDatas.size = 0u;
561 for (NvFlowUint instanceIdx = 0u; instanceIdx < instances.size; instanceIdx++)
563 if (!instances[instanceIdx]->markedForDestroy)
565 NvFlowUint8* data = instances[instanceIdx]->mapDataVersionReadOnly(version);
567 ptr->instanceDatas.pushBack(data);
571 ptr->snapshot.instanceDatas = ptr->instanceDatas.data;
572 ptr->snapshot.instanceCount = ptr->instanceDatas.size;
576 *snapshot = ptr->snapshot;
592 NvFlowUint64 luidCounter = 0llu;
596 auto ptr = types.allocateBackPointer();
598 ptr->init(dataTypeIn, displayTypeName);
603 template<const NvFlowDatabaseInterface* iface>
606 auto ptr = type->instances.allocateBackPointer();
610 ptr->init<iface>(
context, version, luidCounter, type->dataType, type->displayTypeName.get(), pathIn, name);
615 template<const NvFlowDatabaseInterface* iface>
616 void update(NvFlowDatabaseContext*
context, NvFlowUint64 version, NvFlowUint64 minActiveVersion)
618 for (NvFlowUint64 typeIdx = 0u; typeIdx < types.size; typeIdx++)
620 types[typeIdx]->update<iface>(
context, version, minActiveVersion);
624 while (snapshots.activeCount() > 0u && snapshots.front()->snapshot.version < minActiveVersion)
626 snapshots.popFront();
630 template<const NvFlowDatabaseInterface* iface>
633 ptr->markForDestroy<iface>(
context);
636 template<const NvFlowDatabaseInterface* iface>
637 void markAllInstancesForDestroy(NvFlowDatabaseContext*
context)
639 for (NvFlowUint64 typeIdx = 0u; typeIdx < types.size; typeIdx++)
642 for (NvFlowUint instanceIdx = 0u; instanceIdx < type->instances.size; instanceIdx++)
644 type->instances[instanceIdx]->markForDestroy<iface>(
context);
649 template<const NvFlowDatabaseInterface* iface>
650 NvFlowBool32 snapshotPending(NvFlowDatabaseContext*
context, NvFlowUint64 version, NvFlowUint64 minActiveVersion)
652 update<iface>(
context, version, minActiveVersion);
654 NvFlowBool32 anySnapshotPending = NV_FLOW_FALSE;
655 for (NvFlowUint64 typeIdx = 0u; typeIdx < types.size; typeIdx++)
657 if (types[typeIdx]->snapshots.activeCount() > 0u)
659 anySnapshotPending = NV_FLOW_TRUE;
662 if (snapshots.activeCount() > 0u)
664 anySnapshotPending = NV_FLOW_TRUE;
666 return anySnapshotPending;
669 template<const NvFlowDatabaseInterface* iface>
670 void destroy(NvFlowDatabaseContext*
context)
672 for (NvFlowUint64 typeIdx = 0u; typeIdx < types.size; typeIdx++)
674 types[typeIdx]->destroy<iface>(
context);
680 auto ptr = snapshots.allocateBackPointer();
682 ptr->snapshot.version = version;
683 ptr->typeSnapshots.size = 0u;
685 for (NvFlowUint64 typeIdx = 0u; typeIdx < types.size; typeIdx++)
688 types[typeIdx]->getSnapshot(&typeSnapshot, version);
690 ptr->typeSnapshots.pushBack(typeSnapshot);
693 ptr->snapshot.typeSnapshots = ptr->typeSnapshots.data;
694 ptr->snapshot.typeSnapshotCount = ptr->typeSnapshots.size;
698 *snapshot = ptr->snapshot;
704 if (!pInstances && pInstanceCount)
706 NvFlowUint64 activeCount = 0llu;
707 for (NvFlowUint64 typeIdx = 0u; typeIdx < types.size; typeIdx++)
710 for (NvFlowUint instanceIdx = 0u; instanceIdx < type->instances.size; instanceIdx++)
712 if (!type->instances[instanceIdx]->markedForDestroy)
718 *pInstanceCount = activeCount;
720 if (pInstances && pInstanceCount)
722 NvFlowUint64 activeCount = 0llu;
723 for (NvFlowUint64 typeIdx = 0u; typeIdx < types.size; typeIdx++)
726 for (NvFlowUint instanceIdx = 0u; instanceIdx < type->instances.size; instanceIdx++)
728 if (!type->instances[instanceIdx]->markedForDestroy)
730 if (activeCount < (*pInstanceCount))
732 pInstances[activeCount] = type->instances[instanceIdx];
738 *pInstanceCount = activeCount;