Software Transactional Memory updated - Code Review Sought!
December 20, 2007 at 12:49 PM | categories: python, oldblog | View Comments
I've updated the STM code in subversion at present here:
What inspired me to this? Well, there's been a thread on the Python UK list recently about my STM implementation, which resulted in a discussion about a system called "MASCOT" being discussed. Essentially MASCOT looks incredibly similar to Kamaelia - at least superficially. From my perspective, the mere existence of MASCOT and its various subsystems which looks very similar I think validate a lot of the core ideas in Kamaelia. I want to write a post up about that separately though.... More later!
Anyhow, back to this, if anyone is willing to code review the STM code here:
https://kamaelia.svn.sourceforge.net/svnroot/kamaelia/branches/private_MPS_Scratch/Bindings/STM/Axon/STM.pyI would really appreciate any code review from anyone who's capable of doing so - even if you've never done a code review before! Things I think need particular attention is the detail around locking. Specifically the following 4 methods are intended to be used by a user of the code:
class Store(object):The above 4 functions entirely manage the locking. The following functions are internal and all assume that the store is locked appropriately before an update attempt:
def usevar(self, key):
def set(self, key, value):
def using(self, *keys):
def set_values(self, D):
def __get(self, key):Anyhow, why is this useful? Well, it turns out this should make resource management a lot simpler. If I'm right, the following code should be sufficient for the Dining Philosopher's problem:
def __make(self, key):
def __do_update(self, key, value):
def __can_update(self,key, value):
take forks... (pseudo python, ignoring various details)... which I think is pretty neat :-)
not_have_forks = True
while not_have_forks:
try:
S = <get the store from somewhere>
forks = S.using("fork.1", "fork.2")
if forks["1"].value == None and forks["2"].value == None:
forks["1"].value = id(self)
forks["2"].value = id(self)
forks.commit()
not_have_forks = False
except ConcurrentUpdate:
time.sleep(random()) # random backoff - doesn't guarantee success
except BusyRetry:
time.sleep(random()) # random backoff - doesn't guarantee success
eat()
# Put forks back - should always succeed. Should. :-)
try:
forks["1"].value = None
forks["2"].value = None
forks.commit()
except ConcurrentUpdate:
pass
except BusyRetry:
pass
What inspired me to this? Well, there's been a thread on the Python UK list recently about my STM implementation, which resulted in a discussion about a system called "MASCOT" being discussed. Essentially MASCOT looks incredibly similar to Kamaelia - at least superficially. From my perspective, the mere existence of MASCOT and its various subsystems which looks very similar I think validate a lot of the core ideas in Kamaelia. I want to write a post up about that separately though.... More later!
Anyhow, back to this, if anyone is willing to code review the STM code here:
https://kamaelia.svn.sourceforge.net/svnroot/kamaelia/branches/private_MPS_Scratch/Bindings/STM/Axon/STM.pyI'd greatly appreciate it!