Skip to content

Commit

Permalink
Add locking to handle_request in block
Browse files Browse the repository at this point in the history
  • Loading branch information
c-mita committed Jun 22, 2016
1 parent 75fc761 commit 7ff7d2c
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 13 deletions.
32 changes: 19 additions & 13 deletions malcolm/core/block.py
@@ -1,8 +1,12 @@
from collections import OrderedDict
from contextlib import contextmanager

from malcolm.core.monitorable import Monitorable
from malcolm.core.process import BlockRespond

@contextmanager
def dummy_lock():
yield

class Block(Monitorable):
"""Object consisting of a number of Attributes and Methods"""
Expand All @@ -16,6 +20,7 @@ def __init__(self, name):
self.name = name
self._methods = OrderedDict()
self._attributes = OrderedDict()
self.lock = dummy_lock()

def add_attribute(self, attribute):
"""Add an Attribute to the block and set the block as its parent"""
Expand Down Expand Up @@ -54,20 +59,21 @@ def handle_request(self, request):
request(Request): Request object specifying action
"""
self.log_debug("Received request %s", request)
if request.type_ == request.POST:
method_name = request.endpoint[-1]
response = self._methods[method_name].get_response(request)
response = BlockRespond(response, request.response_queue)
self.parent.q.put(response)
else:
layer = self
for next_link in request.endpoint[1:]:
layer = getattr(layer, next_link)

if hasattr(layer, "to_dict"):
request.respond_with_return(layer.to_dict())
with self.lock:
if request.type_ == request.POST:
method_name = request.endpoint[-1]
response = self._methods[method_name].get_response(request)
response = BlockRespond(response, request.response_queue)
self.parent.q.put(response)
else:
request.respond_with_return(layer)
layer = self
for next_link in request.endpoint[1:]:
layer = getattr(layer, next_link)

if hasattr(layer, "to_dict"):
request.respond_with_return(layer.to_dict())
else:
request.respond_with_return(layer)

def to_dict(self):
"""Convert object attributes into a dictionary"""
Expand Down
10 changes: 10 additions & 0 deletions malcolm/core/process.py
Expand Up @@ -96,6 +96,7 @@ def add_block(self, block):
self._blocks[block.name] = block
self._block_state_cache[block.name] = block.to_dict()
block.parent = self
block.lock = self.create_lock()

def create_queue(self):
"""
Expand All @@ -107,6 +108,15 @@ def create_queue(self):

return self.sync_factory.create_queue()

def create_lock(self):
"""
Create a lock using sync_factory object
Returns:
Lock: New lock
"""
return self.sync_factory.create_lock()

def spawn(self, function, *args, **kwargs):
"""Calls SyncFactory.spawn()"""
spawned = self.sync_factory.spawn(function, *args, **kwargs)
Expand Down

0 comments on commit 7ff7d2c

Please sign in to comment.