Permalink
Browse files

Prevent robot from freezing if SmartDashboard freezes

  • Loading branch information...
1 parent 8f12236 commit 06c9bcfd4661422ca2fe63ed28221fac6dba2dac @virtuald virtuald committed Feb 13, 2014
Showing with 32 additions and 6 deletions.
  1. +11 −0 networktables2/NetworkTableEntry.cpp
  2. +1 −0 networktables2/NetworkTableEntry.h
  3. +20 −6 networktables2/WriteManager.cpp
@@ -20,6 +20,17 @@ NetworkTableEntry::NetworkTableEntry(EntryId _id, std::string& _name, SequenceNu
m_isDirty = false;
}
+NetworkTableEntry::NetworkTableEntry(const NetworkTableEntry &other) :
+ name(other.name),
+ id(other.id),
+ sequenceNumber(other.sequenceNumber),
+ type(other.type),
+ m_isNew(other.m_isNew),
+ m_isDirty(other.m_isDirty)
+{
+ value = type->copyValue(other.value);
+}
+
NetworkTableEntry::~NetworkTableEntry(){
type->deleteValue(value);
}
@@ -42,6 +42,7 @@ class NetworkTableEntry {
NetworkTableEntry(std::string& name, NetworkTableEntryType* type, EntryValue value);
NetworkTableEntry(EntryId id, std::string& name, SequenceNumber sequenceNumber, NetworkTableEntryType* type, EntryValue value);
+ NetworkTableEntry(const NetworkTableEntry &);
virtual ~NetworkTableEntry();
EntryId GetId();
@@ -97,21 +97,35 @@ void WriteManager::run() {
entry = ((std::queue<NetworkTableEntry*>*)outgoingAssignmentQueue)->front();
((std::queue<NetworkTableEntry*>*)outgoingAssignmentQueue)->pop();
{
- NTSynchronized sync(entryStore.LOCK);
- entry->MakeClean();
- wrote = true;
+ NetworkTableEntry * entryCopy;
+
+ {
+ NTSynchronized sync(entryStore.LOCK);
+ entry->MakeClean();
+ wrote = true;
+ entryCopy = new NetworkTableEntry(*entry);
+ }
+
receiver.offerOutgoingAssignment(entry);
+ delete entryCopy;
}
}
while(!((std::queue<NetworkTableEntry*>*)outgoingUpdateQueue)->empty()){
entry = ((std::queue<NetworkTableEntry*>*)outgoingUpdateQueue)->front();
((std::queue<NetworkTableEntry*>*)outgoingUpdateQueue)->pop();
{
- NTSynchronized sync(entryStore.LOCK);
- entry->MakeClean();
- wrote = true;
+ NetworkTableEntry * entryCopy;
+
+ {
+ NTSynchronized sync(entryStore.LOCK);
+ entry->MakeClean();
+ wrote = true;
+ entryCopy = new NetworkTableEntry(*entry);
+ }
+
receiver.offerOutgoingUpdate(entry);
+ delete entryCopy;
}
}

0 comments on commit 06c9bcf

Please sign in to comment.