14 #include <tbb/spin_rw_mutex.h>
15 #include <tbb/concurrent_queue.h>
16 #include <vlutil/vlTime.h>
17 #include "legionDataStore/view.h"
18 #include "legionDataStore/viewManager.h"
19 #include "legionDataStore/simulationDatabase.h"
20 #include "vlpi/entityIdentifier.h"
26 #include <boost/unordered_map.hpp>
28 #include <boost/signals2.hpp>
29 #include <boost/function.hpp>
35 class SimulationDatabase;
38 struct AttributeDescriptor;
46 struct DtEmitterSystemBeamStateData;
48 class DtEmitterSystemStateComponent;
49 class DtEntityStateComponent;
50 class DtFrameStateInterface;
51 class DtSimulatedObjectStateComponent;
62 class DtFrameDataInterface;
91 return myParameterDatabase;
96 return myJobProcessor;
103 virtual void removeAndDeleteAll();
106 virtual void removeStateData(
const DtUUID&);
108 virtual void removeStateDataByLegionGlobalId(
unsigned long long);
110 virtual void beginFrame(
double simTime);
111 virtual void advanceFrame();
114 virtual DtStateData* advanceFrameFor(
unsigned long long legionId);
116 virtual void registerLegionComponents(Legion::SimulationDatabase*);
118 Legion::EventManager* eventManager();
127 return myUnpublishedDatabase ? myUnpublishedDatabase : myDatabase;
132 virtual void reserve(
unsigned int);
134 template <
typename T_Class>
135 void handleDataUpdated(
const std::vector<
typename Legion::SetView<T_Class>::InstanceUpdateData>& instanceList)
137 typename InstancesUpdatedCallbacks::iterator iter = myInstancesUpdatedCallbacks.find(T_Class::type());
139 if (iter != myInstancesUpdatedCallbacks.end())
141 typename std::vector<typename Legion::SetView<T_Class>::InstanceUpdateData>::const_iterator instIter = instanceList.begin();
142 typename std::vector<typename Legion::SetView<T_Class>::InstanceUpdateData>::const_iterator instEnd = instanceList.end();
144 while (instIter != instEnd)
146 const T_Class& ent = instIter->instance;
147 InstanceUpdatedCallbacks::iterator callIter = iter->second.find(ent.instanceHandle());
149 if (callIter != iter->second.end())
151 Callbacks::iterator cbIter = callIter->second.begin();
152 Callbacks::iterator cbEnd = callIter->second.end();
154 while (cbIter != cbEnd)
156 (cbIter->first)(instIter->attributesChanged);
166 template <
typename T_Class>
169 const typename std::vector<Legion::AttributeIndex>& attributeIndexFilter = std::vector<Legion::AttributeIndex>())
173 unsigned int newHandle = ++myCallbackHandle;
174 tbb::spin_mutex::scoped_lock lock(myUpdateCallbackMutex);
176 InstancesUpdatedCallbacks::iterator iter = myInstancesUpdatedCallbacks.find(T_Class::type());
178 if (iter == myInstancesUpdatedCallbacks.end())
181 iter = myInstancesUpdatedCallbacks.find(T_Class::type());
184 iter->second[instanceHandle].push_back(std::make_pair(callback, newHandle));
186 if (iter->second.size() == 1)
188 view<T_Class>(database)->addInstanceUpdatedCallback(
typename Legion::SetView<T_Class>::InstanceUpdateCallback(
this,
189 &DtStateDataManager::handleDataUpdated<T_Class>), attributeIndexFilter);
198 template <
typename T_Class>
201 if (isValid() && callbackHandle)
203 tbb::spin_mutex::scoped_lock lock(myUpdateCallbackMutex);
204 InstancesUpdatedCallbacks::iterator iter = myInstancesUpdatedCallbacks.find(T_Class::type());
206 if (iter != myInstancesUpdatedCallbacks.end())
208 InstanceUpdatedCallbacks::iterator callIter = iter->second.find(instanceHandle);
210 if (callIter != iter->second.end())
212 Callbacks::iterator cbIter = callIter->second.begin();
213 Callbacks::iterator cbEnd = callIter->second.end();
215 while (cbIter != cbEnd)
217 if (cbIter->second == callbackHandle)
219 callIter->second.erase(cbIter);
226 if (callIter->second.size() == 0)
228 iter->second.erase(callIter);
230 if (iter->second.size() == 0)
232 myInstancesUpdatedCallbacks.erase(iter);
233 view<T_Class>(database)->removeInstanceUpdatedCallback(
typename Legion::SetView<T_Class>::InstanceUpdateCallback(
this,
234 &DtStateDataManager::handleDataUpdated<T_Class>));
244 return (myDatabase != 0);
249 tbb::spin_rw_mutex::scoped_lock lock(myMutex,
false);
250 if (
id < myStateData.size())
252 return myStateData[id];
260 tbb::spin_rw_mutex::scoped_lock lock(myMutex,
false);
263 return myStateData[id];
271 return myClock.absRealTime();
275 virtual void prepareForHandoff(
unsigned long long,
bool becomingLocal);
288 static StateDataCreatorFcn setStateDataCreatorFcn(StateDataCreatorFcn);
289 static StateDataCreatorFcn stateDataCreatorFcn();
291 static RemoteStateDataCreatorFcn setRemoteStateDataCreatorFcn(RemoteStateDataCreatorFcn);
292 static RemoteStateDataCreatorFcn remoteStateDataCreatorFcn();
301 virtual void clear();
303 Legion::ControlManager* controlManager();
310 virtual const DtStateData*stateDataFor(
const DtEntityIdentifier&)
const;
311 virtual DtStateData*stateDataFor(
const DtEntityIdentifier&);
314 virtual void setUpdateOnlySpecifiedStateDataMode(
bool);
317 return myUpdateOnlySpecifiedStateDataMode;
327 virtual void setRunFullyThreaded(
bool,
int theadCount = 4);
330 return myRunFullyThreaded;
337 virtual void removeStateComponent(
DtStateComponent*,
bool deleteOnRemoval =
true);
339 virtual void resizeContainer(
unsigned);
341 template <
typename T_Component>
344 resizeContainer(T_Component::ComponentType());
347 template <
typename T_Component>
350 return signalWhenStateComponentAdded(T_Component::ComponentType());
355 tbb::spin_rw_mutex::scoped_lock lock(myComponentMutex,
true);
356 resizeContainer(type);
357 return *(myCurrentFrameStates[type].signal_stateComponentAdded);
360 template <
typename T_Component>
363 return signalWhenStateComponentRemoved(T_Component::ComponentType());
368 tbb::spin_rw_mutex::scoped_lock lock(myComponentMutex,
true);
369 resizeContainer(type);
370 return *(myCurrentFrameStates[type].signal_stateComponentRemoved);
373 template <
typename T_Component>
378 tbb::spin_rw_mutex::scoped_lock lock(myComponentMutex,
false);
380 if (T_Component::ComponentType() < myCurrentFrameStates.size())
382 return myCurrentFrameStates[T_Component::ComponentType()].currentFrameStates;
390 virtual void removeAll();
393 virtual std::set<const DtStateData*> entitiesTracking(
const DtUUID&)
const;
396 virtual std::set<const DtStateData*> entitiesJamming(
const DtUUID&)
const;
408 static DtStateDataManager* createStateDataManager(Legion::SimulationDatabase* = 0,
int threadPoolSize = -1);
413 virtual void setUnpublishedDatabaseUsage(
bool);
419 return myCoordinateSystem;
435 return myEnvironmentalData;
438 virtual void setPublishingOnLegionNetwork(
bool b);
441 return myPublishingOnLegionNetwork;
445 template <
typename T_Class>
446 Legion::SetView<T_Class>*
view(Legion::SimulationDatabase* db)
448 tbb::spin_rw_mutex::scoped_lock lock(myViewCreateMutex,
true);
450 DatabaseViews::iterator iter = myDatabaseViews.find(db);
452 if (iter == myDatabaseViews.end())
454 myDatabaseViews[db] =
Views();
455 iter = myDatabaseViews.find(db);
459 Views::iterator viewIter = iter->second.find(key);
461 if (viewIter == iter->second.end())
463 iter->second[key] = db->viewManager().createSetView<T_Class>(key, (myUnpublishedDatabase ? Legion::ViewScope::Remote : Legion::ViewScope::All));
464 viewIter = iter->second.find(key);
467 return (Legion::SetView<T_Class>*)(viewIter->second);
472 return myAdvancingFrame;
476 virtual std::set<const DtStateData*> entitiesTracking(
int beamType,
const DtUUID&)
const;
480 virtual void subordinatesChanged(
const DtStateData*,
const std::vector<DtUUID>& oldSubordinates,
const std::vector<DtUUID>& newSubordinates);
482 virtual void completeAttachments(
const DtUUID&);
483 virtual void completeAttachments();
486 virtual void resolveHostChanged(
const DtUUID&,
const DtUUID& oldUUID,
const DtUUID& newUUID,
487 std::set<DtEntityStateComponent*>&);
516 boost::signals2::signal<void (unsigned long long, const DtUUID& oldUUID, const DtUUID& newUUID)>
signal_uuidChanged;
526 virtual void _internalRemoveStateData(
DtStateData*sd);
528 virtual void addVrfSpecificDataElements(Legion::SimulationDatabase*);
530 virtual void resolveHostChanges();
531 virtual void removeAllStateComponents();
532 virtual void resolveSubordinateChanges();
534 virtual void removeStateDataToBeDeleted();
537 void initializeDefaultPublicData();
569 : signal_stateComponentAdded(orig.signal_stateComponentAdded)
570 , signal_stateComponentRemoved(orig.signal_stateComponentRemoved)
571 , currentFrameStates(orig.currentFrameStates)
614 typedef std::map<DtString, Legion::View*>
Views;
618 typedef std::vector<std::pair<DtInstanceUpdatedCallback, unsigned int> >
Callbacks;
653 bool myAdvancingFrame =
false;
boost::signals2::signal< void()> signal_preAdvanceFrame
Definition: stateDataManager.h:502
std::map< DtString, Legion::View * > Views
Definition: stateDataManager.h:614
UUID is a unique ID wrapper class.
Definition: rwUUID.h:229
boost::signals2::signal< void(Legion::SimulationDatabase *)> signal_addVrfSpecificDataElements
Signal sent when it is ok to add columns to the entity set.
Definition: stateDataManager.h:495
unsigned long long SimStateID
Definition: stateDataTypes.h:16
StateComponentAddedSignal & signalWhenStateComponentAdded()
Definition: stateDataManager.h:348
void resizeContainer()
Definition: stateDataManager.h:342
unsigned int addInstanceUpdatedCallback(Legion::SimulationDatabase *database, DtInstanceUpdatedCallback callback, Legion::InstanceHandle instanceHandle, const typename std::vector< Legion::AttributeIndex > &attributeIndexFilter=std::vector< Legion::AttributeIndex >())
Definition: stateDataManager.h:167
std::map< DtEntityIdentifier, DtStateData * > StateDataByEntityIdentifier
Definition: stateDataManager.h:594
tbb::spin_mutex mySubordinatesChangedThisFrameMutex
Definition: stateDataManager.h:629
std::set< DtStateComponent * > myComponentsDeleted
Definition: stateDataManager.h:648
bool deleteOnRemoval
Definition: stateDataManager.h:643
std::map< DtUUID, std::map< DtUUID, DtUUID > > myHostsChangedThisFrame
Definition: stateDataManager.h:626
Instances of DtVrfParameterDb are the database of DtVrfObjectParameters objects used in the construct...
Definition: vrfParameterDb.h:38
const StateDataByLegionId & environmentalData() const
Definition: stateDataManager.h:433
bool isValid() const
Definition: stateDataManager.h:242
InstancesUpdatedCallbacks myInstancesUpdatedCallbacks
Definition: stateDataManager.h:621
StateComponentAddedSignal & signalWhenStateComponentRemoved(unsigned type)
Definition: stateDataManager.h:366
tbb::spin_rw_mutex myComponentMutex
Definition: stateDataManager.h:559
unsigned int myReserved
Definition: stateDataManager.h:610
std::vector< DtStateData * > StateData
Definition: stateDataManager.h:522
DtVrfParameterDb * myParameterDatabase
Definition: stateDataManager.h:636
static DtStateDataManagerCreatorFcn theStateDataManagerCreatorFcn
Definition: stateDataManager.h:597
DtStateDataManager *(* DtStateDataManagerCreatorFcn)(Legion::SimulationDatabase *, int)
Definition: stateDataManager.h:65
boost::signals2::signal< void()> signal_deleted
Definition: stateDataManager.h:520
bool myPublishingOnLegionNetwork
Definition: stateDataManager.h:639
std::map< Legion::AttributeSetId, InstanceUpdatedCallbacks > InstancesUpdatedCallbacks
Definition: stateDataManager.h:620
StateComponent & operator=(const StateComponent &rhs)
Definition: stateDataManager.h:574
const DtEmitterSystemBeamStateData * beamSR
Definition: stateDataManager.h:55
std::shared_ptr< StateComponentRemovedSignal > signal_stateComponentRemoved
Definition: stateDataManager.h:584
DtClock myClock
Definition: stateDataManager.h:556
std::set< unsigned long long > myAdvancedThisFrame
Definition: stateDataManager.h:652
boost::signals2::signal< void(DtStateComponent *)> StateComponentRemovedSignal
Definition: stateDataManager.h:334
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
tbb::spin_rw_mutex myMutex
Definition: stateDataManager.h:544
Simple asynchronous callback queue.
Definition: vrfCallbackQueue.h:32
bool runFullyThreaded() const
Definition: stateDataManager.h:328
tbb::spin_mutex myAdvancedThisFrameMutex
Definition: stateDataManager.h:651
Contains the DtUUID class declaration.
std::shared_ptr< StateComponentAddedSignal > signal_stateComponentAdded
Definition: stateDataManager.h:583
boost::signals2::signal< void(DtStateData *)> signal_unitAdded
Definition: stateDataManager.h:511
boost::signals2::signal< void()> signal_advanceFrame
Definition: stateDataManager.h:503
std::vector< StateComponent > CurrentFrameStatesList
Definition: stateDataManager.h:588
boost::signals2::signal< void()> signal_beginFrame
Definition: stateDataManager.h:501
DtStateData * stateData(makVrf::SimStateID id)
Definition: stateDataManager.h:258
StateDataByLegionId myStateDataByLegionId
Definition: stateDataManager.h:599
StateComponent()
Definition: stateDataManager.h:563
Definition: objectType.h:27
double absRealTime() const
Definition: stateDataManager.h:269
CurrentFrameStates currentFrameStates
Definition: stateDataManager.h:585
Legion::SimulationDatabase * database()
Definition: stateDataManager.h:120
Legion::SetView< T_Class > * view(Legion::SimulationDatabase *db)
Returns the entity view for the given database.
Definition: stateDataManager.h:446
std::atomic< unsigned int > myCallbackHandle
Definition: stateDataManager.h:623
std::vector< DtTrackJamBeamInfo > DtTrackJamBeamInfoList
Definition: stateDataManager.h:59
std::pair< std::set< DtUUID >, std::set< DtUUID > > SubordinateChangeSet
First is added, second removed.
Definition: stateDataManager.h:632
StateDataByEntityIdentifier myStateDataByEntityIdentifier
Definition: stateDataManager.h:595
bool publishingOnLegionNetwork() const
Definition: stateDataManager.h:439
const Coordinate_System * myCoordinateSystem
Definition: stateDataManager.h:601
Definition: coordSystem.h:54
const CurrentFrameStates & stateComponents() const
Definition: stateDataManager.h:374
The overall structure of the DtStateData mechanism is: The DtStateData contains a list of double buff...
Definition: stateData.h:336
boost::signals2::signal< void(const DtStateData *)> signal_stateDataAboutToBeRemoved
Signals sent for state data actions.
Definition: stateDataManager.h:491
tbb::spin_rw_mutex myViewCreateMutex
Definition: stateDataManager.h:613
Definition: stateDataManager.h:641
std::map< DtUUID, std::set< DtUUID > > myWaitingForAttachment
Definition: stateDataManager.h:627
Legion::SimulationDatabase * myUnpublishedDatabase
Definition: stateDataManager.h:547
tbb::atomic< makVrf::SimStateID > myNextSimStateID
Definition: stateDataManager.h:551
StateComponent(const StateComponent &orig)
Definition: stateDataManager.h:568
boost::signals2::signal< void(DtStateComponent *)> StateComponentAddedSignal
Definition: stateDataManager.h:333
const DtStateData * stateData(makVrf::SimStateID id) const
Definition: stateDataManager.h:247
std::set< unsigned long long > myAwaitingHandoff
Definition: stateDataManager.h:549
Definition: stateDataManager.h:53
boost::signals2::signal< void(DtStateData *)> signal_stateDataAdded
Definition: stateDataManager.h:500
StateDataByLegionId myUnitData
Definition: stateDataManager.h:605
unsigned long long UInt64
Definition: stateDataTypes.h:17
void removeInstanceUpdatedCallback(Legion::SimulationDatabase *database, Legion::InstanceHandle instanceHandle, unsigned int callbackHandle)
Definition: stateDataManager.h:199
bool myOwnsDatabase
Definition: stateDataManager.h:608
void handleDataUpdated(const std::vector< typename Legion::SetView< T_Class >::InstanceUpdateData > &instanceList)
Definition: stateDataManager.h:135
boost::signals2::signal< void(DtStateData *)> signal_entityAdded
Convenience signals for when a data is added – something is considered a unit if it has a aggregateSt...
Definition: stateDataManager.h:508
bool updateOnlySpecifiedStateDataMode() const
Definition: stateDataManager.h:315
bool advancingFrame() const
Definition: stateDataManager.h:470
tbb::spin_mutex myHostsChangedThisFrameMutex
Definition: stateDataManager.h:625
const DtEmitterSystemStateComponent * emitterSystemSR
Definition: stateDataManager.h:56
boost::signals2::signal< void(unsigned long long, const DtUUID &oldUUID, const DtUUID &newUUID)> signal_uuidChanged
Definition: stateDataManager.h:516
Legion::SimulationDatabase * unpublishedDatabase()
Definition: stateDataManager.h:125
1) Define the interface class that will be used to represent the next and curent frames. The UNDEFINED_ macros are convenience macros that will define methods that throw exceptions (until they are implemented)
Definition: emitterSystemStateComponent.h:446
DtVrfCallbackQueue & jobProcessor()
Definition: stateDataManager.h:94
tbb::concurrent_queue< makVrf::SimStateID > myFreeStateIDs
Definition: stateDataManager.h:552
std::map< UInt64, DtStateData * > StateDataByLegionId
Definition: stateDataManager.h:422
Definition: stateComponent.h:51
StateComponentAddedSignal & signalWhenStateComponentRemoved()
Definition: stateDataManager.h:361
bool myUpdateOnlySpecifiedStateDataMode
Definition: stateDataManager.h:649
StateData myStateData
Definition: stateDataManager.h:542
boost::signals2::signal< void(const DtStateData *)> signal_environmentalRemoved
Definition: stateDataManager.h:515
const Coordinate_System * coordinateSystem() const
Definition: stateDataManager.h:417
StateComponentAddedSignal & signalWhenStateComponentAdded(unsigned type)
Definition: stateDataManager.h:353
StateDataByUUID myStateDataByUUID
Definition: stateDataManager.h:592
CurrentFrameStatesList myCurrentFrameStates
Definition: stateDataManager.h:589
const StateDataByLegionId & unitData() const
Definition: stateDataManager.h:428
DtVrfParameterDb * parameterDatabase() const
Definition: stateDataManager.h:89
boost::signals2::signal< void(const DtStateData *)> signal_unitRemoved
Definition: stateDataManager.h:512
boost::signals2::signal< void(const DtStateData *)> signal_initializeStateDataBeforeAdd
This signal is called before the data is fully added. Gives connectors a chace to add data into the n...
Definition: stateDataManager.h:499
static const SimStateID InvalidSimStateID
Definition: stateDataTypes.h:37
boost::signals2::signal< void(DtStateData *)> signal_environmentalAdded
Definition: stateDataManager.h:514
#define DT_DLL_vrfStateData
This file is used to determine how to build Disable inconsistent dll linkage warning Visual Studio 6...
Definition: vrfStateDataDefines.h:26
bool myRunFullyThreaded
Definition: stateDataManager.h:554
StateDataByLegionId myEnvironmentalData
Definition: stateDataManager.h:606
boost::unordered_map< DtUUID, DtStateData * > StateDataByUUID
Definition: stateDataManager.h:591
boost::signals2::signal< void(makVrf::SimStateID, UInt64)> signal_stateDataRemoved
Definition: stateDataManager.h:492
boost::function< bool(DtStateData *)> PreAddCallback
Definition: stateDataManager.h:78
DatabaseViews myDatabaseViews
Definition: stateDataManager.h:616
std::map< DtStateComponent *, ComponentRemoval > myComponentsToRemove
Definition: stateDataManager.h:647
StateDataByLegionId myEntityData
Definition: stateDataManager.h:604
boost::signals2::signal< void(DtStateComponent *)> signal_stateComponentRemoved
Definition: stateDataManager.h:519
std::map< Legion::InstanceHandle, Callbacks > InstanceUpdatedCallbacks
Definition: stateDataManager.h:619
std::map< Legion::SimulationDatabase *, Views > DatabaseViews
Definition: stateDataManager.h:615
boost::signals2::signal< void(DtStateData *, bool)> signal_prepareForHandoff
Definition: stateDataManager.h:504
std::map< DtUUID, SubordinateChangeSet > mySubordinatesChangedThisFrame
Definition: stateDataManager.h:633
boost::function< void(const std::vector< UInt32 > &)> DtInstanceUpdatedCallback
Definition: stateDataTypes.h:21
boost::shared_ptr< boost::signals2::connection > deleteConnection
Definition: stateDataManager.h:644
std::map< DtUUID, std::set< DtUUID > > myPendingSuperiorSet
Definition: stateDataManager.h:634
The DtEmitterSystemStateComponentList is a collection of emitter systems and the beams they represent...
Definition: emitterSystemStateComponent.h:24
Definition: stateDataManager.h:561
boost::signals2::signal< void(DtStateComponent *)> signal_stateComponentAdded
Definition: stateDataManager.h:518
tbb::spin_mutex myUpdateCallbackMutex
Definition: stateDataManager.h:612
const StateDataByLegionId & entityData() const
Definition: stateDataManager.h:423
Legion::SimulationDatabase * myDatabase
Definition: stateDataManager.h:546
DtVrfCallbackQueue myJobProcessor
Definition: stateDataManager.h:557
std::vector< std::pair< DtInstanceUpdatedCallback, unsigned int > > Callbacks
Definition: stateDataManager.h:618
std::vector< DtStateData * > myStateDataToBeDeleted
Definition: stateDataManager.h:638
bool myOwnsCoordinateSystem
Definition: stateDataManager.h:602
std::set< const DtFrameStateInterface * > CurrentFrameStates
Definition: stateDataManager.h:74
boost::signals2::signal< void(const DtStateData *)> signal_entityRemoved
Definition: stateDataManager.h:509
This class holds the state data that represents each simulation object in the system.
Definition: stateDataManager.h:71