2
0
mirror of https://opendev.org/x/pyghmi synced 2026-03-29 06:13:30 +00:00

Remove callback from session.py

In the private session module, there was originally a thought
that a callback model was going to be the path for code to implement
interleaved execution.  However, since that point a coroutine pattern
has proven to afford the same benefits with simpler looking calling code.
With this in mind, remove some of the disused code in order to make
the session module a little easier to follow.

Change-Id: Ice697df409dd188d7e3361d278f8b1ce1358a419
This commit is contained in:
Jarrod Johnson
2014-01-03 11:53:53 -05:00
parent 7dc8d5f532
commit 9290111ba7

View File

@@ -77,19 +77,6 @@ def _aespad(data):
return newdata
def call_with_optional_args(callback, *args):
"""In order to simplify things, in a number of places there is a callback
facility and optional arguments to pass in. An object-oriented caller may
find the additional argument needless. Allow them to ignore it by skipping
the argument if None.
"""
newargs = []
for arg in args:
if arg is not None:
newargs.append(arg)
callback(*newargs)
def get_ipmi_error(response, suffix=""):
if 'error' in response:
return response['error'] + suffix
@@ -280,7 +267,6 @@ class Session(object):
self.k1 = None
self.rmcptag = 1
self.ipmicallback = None
self.ipmicallbackargs = None
self.sessioncontext = None
self.sequencenumber = 0
self.sessionid = 0
@@ -355,35 +341,27 @@ class Session(object):
command,
data=[],
retry=True,
callback=None,
callback_args=None,
delay_xmit=None):
while self.incommand:
Session.wait_for_rsp()
self.incommand = True
self.ipmicallbackargs = callback_args
if callback is None:
self.lastresponse = None
self.ipmicallback = self._generic_callback
else:
self.ipmicallback = callback
self.lastresponse = None
self.ipmicallback = self._generic_callback
self._send_ipmi_net_payload(netfn, command, data, retry=retry,
delay_xmit=delay_xmit)
if retry: # in retry case, let the retry timers indicate wait time
timeout = None
else: # if not retry, give it a second before surrending
timeout = 1
#In the synchronous case, wrap the event loop in this call
#The event loop is shared amongst pyghmi session instances
#within a process. In this way, synchronous usage of the interface
#plays well with asynchronous use. In fact, this produces the behavior
#of only the constructor *really* needing a callback. From then on,
#of only the constructor needing a callback. From then on,
#synchronous usage of the class acts in a greenthread style governed by
#order of data on the network
if callback is None:
while self.lastresponse is None:
Session.wait_for_rsp(timeout=timeout)
return self.lastresponse
while self.lastresponse is None:
Session.wait_for_rsp(timeout=timeout)
return self.lastresponse
def _send_ipmi_net_payload(self, netfn, command, data, retry=True,
delay_xmit=None):
@@ -1081,9 +1059,7 @@ class Session(object):
payload_type=nextpayloadtype,
retry=retry)
self.incommand = False
call_with_optional_args(self.ipmicallback,
response,
self.ipmicallbackargs)
self.ipmicallback(response)
def _timedout(self):
if not self.lastpayload:
@@ -1092,9 +1068,7 @@ class Session(object):
self.timeout += 1
if self.timeout > 5:
response = {'error': 'timeout'}
call_with_optional_args(self.ipmicallback,
response,
self.ipmicallbackargs)
self.ipmicallback(response)
self.incommand = False
self.nowait = False
return