scope -> context

This commit is contained in:
Josh Wilson 2007-03-13 22:51:12 +00:00
parent f9527b4f44
commit d5d97fb009
1 changed files with 55 additions and 54 deletions

View File

@ -19,11 +19,11 @@ from direct.showbase.PythonUtil import report
class InterestState:
StateActive = 'Active'
StatePendingDel = 'PendingDel'
def __init__(self, desc, state, scope, event, parentId, zoneIdList,
def __init__(self, desc, state, context, event, parentId, zoneIdList,
eventCounter, auto=False):
self.desc = desc
self.state = state
self.scope = scope
self.context = context
# We must be ready to keep track of multiple events. If somebody
# requested an interest to be removed and we get a second request
# for removal of the same interest before we get a response for the
@ -52,8 +52,8 @@ class InterestState:
def isPendingDelete(self):
return self.state == InterestState.StatePendingDel
def __repr__(self):
return 'InterestState(desc=%s, state=%s, scope=%s, event=%s, parentId=%s, zoneIdList=%s)' % (
self.desc, self.state, self.scope, self.events, self.parentId, self.zoneIdList)
return 'InterestState(desc=%s, state=%s, context=%s, event=%s, parentId=%s, zoneIdList=%s)' % (
self.desc, self.state, self.context, self.events, self.parentId, self.zoneIdList)
class InterestHandle:
"""This class helps to ensure that valid handles get passed in to DoInterestManager funcs"""
@ -68,8 +68,8 @@ class InterestHandle:
def __repr__(self):
return '%s(%s)' % (self.__class__.__name__, self._id)
# scope value for interest changes that have no complete event
NO_SCOPE = 0
# context value for interest changes that have no complete event
NO_CONTEXT = 0
class DoInterestManager(DirectObject.DirectObject):
"""
@ -89,9 +89,9 @@ class DoInterestManager(DirectObject.DirectObject):
# high bit is reserved for server interests
_HandleMask = 0x7FFF
# 'scope' refers to a single request to change an interest set
_ScopeIdSerialNum = 100
_ScopeIdMask = 0x3FFFFFFF # avoid making Python create a long
# 'context' refers to a single request to change an interest set
_ContextIdSerialNum = 100
_ContextIdMask = 0x3FFFFFFF # avoid making Python create a long
_interests = {}
if __debug__:
@ -108,8 +108,8 @@ class DoInterestManager(DirectObject.DirectObject):
self._removeInterestEvent = uniqueName('DoInterestManager-Remove')
self._noNewInterests = False
self._completeDelayedCallback = None
# keep track of request scopes that have not completed
self._outstandingScopes = set()
# keep track of request contexts that have not completed
self._outstandingContexts = set()
self._completeEventCount = ScratchPad(num=0)
self._allInterestsCompleteCallbacks = []
@ -137,7 +137,7 @@ class DoInterestManager(DirectObject.DirectObject):
def resetInterestStateForConnectionLoss(self):
DoInterestManager._interests.clear()
self._outstandingScopes = set()
self._outstandingContexts = set()
self._completeEventCount = ScratchPad(num=0)
if __debug__:
self._addDebugInterestHistory("RESET", "", 0, 0, 0, [])
@ -175,20 +175,20 @@ class DoInterestManager(DirectObject.DirectObject):
'' % (parentId, parent.__class__.__name__))
if auto:
scopeId = 0
contextId = 0
event = None
else:
scopeId = self._getNextScopeId()
self._outstandingScopes.add(scopeId)
contextId = self._getNextContextId()
self._outstandingContexts.add(contextId)
if event is None:
event = self._getAnonymousEvent('addInterest')
DoInterestManager._interests[handle] = InterestState(
description, InterestState.StateActive, scopeId, event, parentId, zoneIdList, self._completeEventCount)
description, InterestState.StateActive, contextId, event, parentId, zoneIdList, self._completeEventCount)
if self.__verbose():
print 'CR::INTEREST.addInterest(handle=%s, parentId=%s, zoneIdList=%s, description=%s, event=%s, auto=%s)' % (
handle, parentId, zoneIdList, description, event, auto)
if not auto:
self._sendAddInterest(handle, scopeId, parentId, zoneIdList, description)
self._sendAddInterest(handle, contextId, parentId, zoneIdList, description)
if event:
messenger.send(self._getAddInterestEvent(), [event])
assert self.printInterestsIfDebug()
@ -230,11 +230,11 @@ class DoInterestManager(DirectObject.DirectObject):
if auto:
self._considerRemoveInterest(handle)
else:
scopeId = self._getNextScopeId()
intState.scope = scopeId
contextId = self._getNextContextId()
intState.context = contextId
if event is not None:
intState.addEvent(event)
self._sendRemoveInterest(handle, scopeId)
self._sendRemoveInterest(handle, contextId)
if event is None:
self._considerRemoveInterest(handle)
if self.__verbose():
@ -274,18 +274,19 @@ class DoInterestManager(DirectObject.DirectObject):
description = DoInterestManager._interests[handle].desc
# are we overriding an existing change?
if DoInterestManager._interests[handle].scope != NO_SCOPE:
if DoInterestManager._interests[handle].context != NO_CONTEXT:
DoInterestManager._interests[handle].clearEvents()
scopeId = self._getNextScopeId()
DoInterestManager._interests[handle].scope = scopeId
contextId = self._getNextContextId()
DoInterestManager._interests[handle].context = contextId
DoInterestManager._interests[handle].parentId = parentId
DoInterestManager._interests[handle].zoneIdList = zoneIdList
DoInterestManager._interests[handle].addEvent(event)
if self.__verbose():
print 'CR::INTEREST.alterInterest(handle=%s, parentId=%s, zoneIdList=%s, description=%s, event=%s)' % (
handle, parentId, zoneIdList, description, event)
self._sendAddInterest(handle, scopeId, parentId, zoneIdList, description, action='modify')
self._sendAddInterest(handle, contextId, parentId, zoneIdList, description, action='modify')
exists = True
assert self.printInterestsIfDebug()
else:
@ -332,15 +333,15 @@ class DoInterestManager(DirectObject.DirectObject):
'interest %s already in use' % handle)
DoInterestManager._HandleSerialNum = handle
return DoInterestManager._HandleSerialNum
def _getNextScopeId(self):
scopeId = DoInterestManager._ScopeIdSerialNum
def _getNextContextId(self):
contextId = DoInterestManager._ContextIdSerialNum
while True:
scopeId = (scopeId + 1) & DoInterestManager._ScopeIdMask
# skip over the 'no scope' id
if scopeId != NO_SCOPE:
contextId = (contextId + 1) & DoInterestManager._ContextIdMask
# skip over the 'no context' id
if contextId != NO_CONTEXT:
break
DoInterestManager._ScopeIdSerialNum = scopeId
return DoInterestManager._ScopeIdSerialNum
DoInterestManager._ContextIdSerialNum = contextId
return DoInterestManager._ContextIdSerialNum
def _considerRemoveInterest(self, handle):
"""
@ -351,7 +352,7 @@ class DoInterestManager(DirectObject.DirectObject):
if DoInterestManager._interests.has_key(handle):
if DoInterestManager._interests[handle].isPendingDelete():
# make sure there is no pending event for this interest
if DoInterestManager._interests[handle].scope == NO_SCOPE:
if DoInterestManager._interests[handle].context == NO_CONTEXT:
assert len(DoInterestManager._interests[handle].events) == 0
del DoInterestManager._interests[handle]
@ -362,11 +363,11 @@ class DoInterestManager(DirectObject.DirectObject):
return 1 # for assert
def _addDebugInterestHistory(self, action, description, handle,
scopeId, parentId, zoneIdList):
contextId, parentId, zoneIdList):
if description is None:
description = ''
DoInterestManager._debug_interestHistory.append(
(action, description, handle, scopeId, parentId, zoneIdList))
(action, description, handle, contextId, parentId, zoneIdList))
DoInterestManager._debug_maxDescriptionLen = max(
DoInterestManager._debug_maxDescriptionLen, len(description))
@ -374,18 +375,18 @@ class DoInterestManager(DirectObject.DirectObject):
print "***************** Interest History *************"
format = '%9s %' + str(DoInterestManager._debug_maxDescriptionLen) + 's %6s %6s %9s %s'
print format % (
"Action", "Description", "Handle", "Scope", "ParentId",
"Action", "Description", "Handle", "Context", "ParentId",
"ZoneIdList")
for i in DoInterestManager._debug_interestHistory:
print format % tuple(i)
print "Note: interests with a Scope of 0 do not get" \
print "Note: interests with a Context of 0 do not get" \
" done/finished notices."
def printInterestSets(self):
print "******************* Interest Sets **************"
format = '%6s %' + str(DoInterestManager._debug_maxDescriptionLen) + 's %10s %5s %9s %9s %10s'
print format % (
"Handle", "Description", "State", "Scope",
"Handle", "Description", "State", "Context",
"ParentId", "ZoneIdList", "Event")
for id, state in DoInterestManager._interests.items():
if len(state.events) == 0:
@ -394,7 +395,7 @@ class DoInterestManager(DirectObject.DirectObject):
event = state.events[0]
else:
event = state.events
print format % (id, state.desc, state.state, state.scope,
print format % (id, state.desc, state.state, state.context,
state.parentId, state.zoneIdList, event)
print "************************************************"
@ -402,7 +403,7 @@ class DoInterestManager(DirectObject.DirectObject):
self.printInterestHistory()
self.printInterestSets()
def _sendAddInterest(self, handle, scopeId, parentId, zoneIdList, description,
def _sendAddInterest(self, handle, contextId, parentId, zoneIdList, description,
action=None):
"""
Part of the new otp-server code.
@ -419,7 +420,7 @@ class DoInterestManager(DirectObject.DirectObject):
if action is None:
action = 'add'
self._addDebugInterestHistory(
action, description, handle, scopeId, parentId, zoneIdList)
action, description, handle, contextId, parentId, zoneIdList)
if parentId == 0:
DoInterestManager.notify.error(
'trying to set interest to invalid parent: %s' % parentId)
@ -427,7 +428,7 @@ class DoInterestManager(DirectObject.DirectObject):
# Add message type
datagram.addUint16(CLIENT_ADD_INTEREST)
datagram.addUint16(handle)
datagram.addUint32(scopeId)
datagram.addUint32(contextId)
datagram.addUint32(parentId)
if isinstance(zoneIdList, types.ListType):
vzl = list(zoneIdList)
@ -439,7 +440,7 @@ class DoInterestManager(DirectObject.DirectObject):
datagram.addUint32(zoneIdList)
self.send(datagram)
def _sendRemoveInterest(self, handle, scopeId):
def _sendRemoveInterest(self, handle, contextId):
"""
handle is a client-side created number that refers to
a set of interests. The same handle number doesn't
@ -452,13 +453,13 @@ class DoInterestManager(DirectObject.DirectObject):
# Add message type
datagram.addUint16(CLIENT_REMOVE_INTEREST)
datagram.addUint16(handle)
if scopeId != 0:
datagram.addUint32(scopeId)
if contextId != 0:
datagram.addUint32(contextId)
self.send(datagram)
if __debug__:
state = DoInterestManager._interests[handle]
self._addDebugInterestHistory(
"remove", state.desc, handle, scopeId,
"remove", state.desc, handle, contextId,
state.parentId, state.zoneIdList)
def cleanupWaitAllInterestsClosed(self):
@ -472,16 +473,16 @@ class DoInterestManager(DirectObject.DirectObject):
"""
assert DoInterestManager.notify.debugCall()
handle = di.getUint16()
scopeId = di.getUint32()
contextId = di.getUint32()
if self.__verbose():
print 'CR::INTEREST.interestDone(handle=%s)' % handle
DoInterestManager.notify.debug(
"handleInterestDoneMessage--> Received handle %s, scope %s" % (
handle, scopeId))
"handleInterestDoneMessage--> Received handle %s, context %s" % (
handle, contextId))
eventsToSend = []
# if the scope matches, send out the event
if scopeId == DoInterestManager._interests[handle].scope:
DoInterestManager._interests[handle].scope = NO_SCOPE
# if the context matches, send out the event
if contextId == DoInterestManager._interests[handle].context:
DoInterestManager._interests[handle].context = NO_CONTEXT
# the event handlers may call back into the interest manager. Send out
# the events after we're once again in a stable state.
#DoInterestManager._interests[handle].sendEvents()
@ -489,12 +490,12 @@ class DoInterestManager(DirectObject.DirectObject):
DoInterestManager._interests[handle].clearEvents()
else:
DoInterestManager.notify.warning(
"handleInterestDoneMessage--> handle: %s: Expecting scope %s, got %s" % (
handle, DoInterestManager._interests[handle].scope, scopeId))
"handleInterestDoneMessage--> handle: %s: Expecting context %s, got %s" % (
handle, DoInterestManager._interests[handle].context, contextId))
if __debug__:
state = DoInterestManager._interests[handle]
self._addDebugInterestHistory(
"finished", state.desc, handle, scopeId, state.parentId,
"finished", state.desc, handle, contextId, state.parentId,
state.zoneIdList)
self._considerRemoveInterest(handle)
for event in eventsToSend: