Browse Source

hold up setinterestcomplete message until deferred objects are generated

David Rose 18 years ago
parent
commit
e86dc0c52c
1 changed files with 28 additions and 25 deletions
  1. 28 25
      direct/src/distributed/ClientRepositoryBase.py

+ 28 - 25
direct/src/distributed/ClientRepositoryBase.py

@@ -36,7 +36,7 @@ class ClientRepositoryBase(ConnectionRepository):
         self.deferredGenerates = []
         self.deferredGenerates = []
         self.deferredDoIds = {}
         self.deferredDoIds = {}
         self.lastGenerate = 0
         self.lastGenerate = 0
-        self.setDeferInterval(base.config.GetDouble('deferred-generate-interval', 0))
+        self.setDeferInterval(base.config.GetDouble('deferred-generate-interval', 0.2))
         self.noDefer = False  # Set this True to temporarily disable deferring.
         self.noDefer = False  # Set this True to temporarily disable deferring.
 
 
         self.recorder = base.recorder
         self.recorder = base.recorder
@@ -192,7 +192,7 @@ class ClientRepositoryBase(ConnectionRepository):
             if self.deferredGenerates or now - self.lastGenerate < self.deferInterval:
             if self.deferredGenerates or now - self.lastGenerate < self.deferInterval:
                 # Queue it for later.
                 # Queue it for later.
                 assert(self.notify.debug("deferring generate for %s %s" % (dclass.getName(), doId)))
                 assert(self.notify.debug("deferring generate for %s %s" % (dclass.getName(), doId)))
-                self.deferredGenerates.append(doId)
+                self.deferredGenerates.append((CLIENT_CREATE_OBJECT_REQUIRED_OTHER, doId))
                 
                 
                 # Keep a copy of the datagram, and move the di to the copy
                 # Keep a copy of the datagram, and move the di to the copy
                 dg = Datagram(di.getDatagram())
                 dg = Datagram(di.getDatagram())
@@ -227,44 +227,47 @@ class ClientRepositoryBase(ConnectionRepository):
     def flushGenerates(self):
     def flushGenerates(self):
         """ Forces all pending generates to be performed immediately. """
         """ Forces all pending generates to be performed immediately. """
         while self.deferredGenerates:
         while self.deferredGenerates:
-            doId = self.deferredGenerates[0]
+            msgType, extra = self.deferredGenerates[0]
             del self.deferredGenerates[0]
             del self.deferredGenerates[0]
+            self.replayDeferredGenerate(msgType, extra)
+
+        taskMgr.remove('deferredGenerate')
+
+    def replayDeferredGenerate(self, msgType, extra):
+        """ Override this to do something appropriate with deferred
+        "generate" messages when they are replayed().
+        """
+
+        if msgType == CLIENT_CREATE_OBJECT_REQUIRED_OTHER:
+            # It's a generate message.
+            doId = extra
             if doId in self.deferredDoIds:
             if doId in self.deferredDoIds:
                 args, deferrable, dg, updates = self.deferredDoIds[doId]
                 args, deferrable, dg, updates = self.deferredDoIds[doId]
                 del self.deferredDoIds[doId]
                 del self.deferredDoIds[doId]
                 self.__doGenerate(*args)
                 self.__doGenerate(*args)
-                
+
+                if deferrable:
+                    self.lastGenerate = globalClock.getFrameTime()
+
                 for dg, di in updates:
                 for dg, di in updates:
                     self.__doUpdate(doId, di)
                     self.__doUpdate(doId, di)
-
-        taskMgr.remove('deferredGenerate')
+        else:
+            self.notify.warning("Ignoring deferred message %s" % (msgType))
 
 
     def __doDeferredGenerate(self, task):
     def __doDeferredGenerate(self, task):
         """ This is the task that generates an object on the deferred
         """ This is the task that generates an object on the deferred
         queue. """
         queue. """
         
         
         now = globalClock.getFrameTime()
         now = globalClock.getFrameTime()
-        if now - self.lastGenerate < self.deferInterval:
-            # Come back later.
-            return Task.again
-
         while self.deferredGenerates:
         while self.deferredGenerates:
+            if now - self.lastGenerate < self.deferInterval:
+                # Come back later.
+                return Task.again
+
             # Generate the next deferred object.
             # Generate the next deferred object.
-            doId = self.deferredGenerates[0]
+            msgType, extra = self.deferredGenerates[0]
             del self.deferredGenerates[0]
             del self.deferredGenerates[0]
-            if doId in self.deferredDoIds:
-                args, deferrable, dg, updates = self.deferredDoIds[doId]
-                del self.deferredDoIds[doId]
-                self.__doGenerate(*args)
-                
-                for dg, di in updates:
-                    self.__doUpdate(doId, di)
-
-                if deferrable:
-                    # If this was an actual deferrable object, wait
-                    # for the next pass to generate any more.
-                    self.lastGenerate = now
-                    return Task.again
+            self.replayDeferredGenerate(msgType, extra)
 
 
         # All objects are generaetd.
         # All objects are generaetd.
         return Task.done
         return Task.done
@@ -473,7 +476,7 @@ class ClientRepositoryBase(ConnectionRepository):
             # The object had been deferred.  Great; we don't even have
             # The object had been deferred.  Great; we don't even have
             # to generate it now.
             # to generate it now.
             del self.deferredDoIds[doId]
             del self.deferredDoIds[doId]
-            i = self.deferredGenerates.index(doId)
+            i = self.deferredGenerates.index((CLIENT_CREATE_OBJECT_REQUIRED_OTHER, doId))
             del self.deferredGenerates[i]
             del self.deferredGenerates[i]
             if len(self.deferredGenerates) == 0:
             if len(self.deferredGenerates) == 0:
                 taskMgr.remove('deferredGenerate')
                 taskMgr.remove('deferredGenerate')