# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1237286211 0
# Node ID c05fa254405d69438826b24e9083286788025b8a
# Parent 24af58657d8e86d4d5dc0828001cf710cf6e44fe
xend: Add lock for xen-api class instances in XendAPIStore.py
Add __classes_lock to protect __classes, since it can be modified by
the udev listener thread.
Signed-off-by: Yosuke Iwamatsu <y-iwamatsu@xxxxxxxxxxxxx>
---
tools/python/xen/xend/XendAPIStore.py | 49 ++++++++++++++++++++++++----------
1 files changed, 36 insertions(+), 13 deletions(-)
diff -r 24af58657d8e -r c05fa254405d tools/python/xen/xend/XendAPIStore.py
--- a/tools/python/xen/xend/XendAPIStore.py Tue Mar 17 10:36:20 2009 +0000
+++ b/tools/python/xen/xend/XendAPIStore.py Tue Mar 17 10:36:51 2009 +0000
@@ -25,36 +25,59 @@ by type, to ensure safety
by type, to ensure safety
"""
+import threading
+
__classes = {}
+__classes_lock = threading.RLock()
def register(uuid, type, inst):
- __classes[(uuid, type)] = inst
- return inst
+ __classes_lock.acquire()
+ try:
+ __classes[(uuid, type)] = inst
+ return inst
+ finally:
+ __classes_lock.release()
def deregister(uuid, type):
- old = get(uuid, type)
- if old is not None:
- del __classes[(uuid, type)]
- return old
+ __classes_lock.acquire()
+ try:
+ old = get(uuid, type)
+ if old is not None:
+ del __classes[(uuid, type)]
+ return old
+ finally:
+ __classes_lock.release()
def get(uuid, type):
"""
Get the instances by uuid and type
"""
- return __classes.get((uuid, type), None)
+ __classes_lock.acquire()
+ try:
+ return __classes.get((uuid, type), None)
+ finally:
+ __classes_lock.release()
def get_all(all_type):
"""
Get all instances by type
"""
- return [inst
- for ((uuid, t), inst) in __classes.items()
- if t == all_type]
+ __classes_lock.acquire()
+ try:
+ return [inst
+ for ((uuid, t), inst) in __classes.items()
+ if t == all_type]
+ finally:
+ __classes_lock.release()
def get_all_uuid(all_type):
"""
Get all uuids by type
"""
- return [uuid
- for (uuid, t) in __classes.keys()
- if t == all_type]
+ __classes_lock.acquire()
+ try:
+ return [uuid
+ for (uuid, t) in __classes.keys()
+ if t == all_type]
+ finally:
+ __classes_lock.release()
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|