summaryrefslogtreecommitdiff
path: root/pypers/meta/meta_threading.py
blob: 132d12b4bb912ca891497b6fbbe06558c56a38e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from types import FunctionType
from threading import RLock

def makeThreadsafeMethod(func):
    def threadsafemethod(self, *args, **kwargs):
        self._monitor_lockObj.acquire()
        print ">>got lock"
        try:
            return func(self, *args, **kwargs)
        finally:
            self._monitor_lockObj.release()
            print "<<released lock"
    return threadsafemethod

def convert_methods(dic):
    methods=[ v for k,v in dic.iteritems() if isinstance(v, FunctionType) ]
    for m in methods:
        dic[m.__name__] = makeThreadsafeMethod(m)
    dic["_monitor_lockObj"] = RLock()


class ThreadSafeMethodsMetaClass(type):
     def __new__(meta, name, bases, dic):
         convert_methods(dic)
         return super(ThreadSafeMethodsMetaClass, meta).__new__(meta, name, bases, dic)

class MyClass(object):
     __metaclass__=ThreadSafeMethodsMetaClass

     def __init__(self):
         print "init!"
     def method(self, a1, a2):
         print a1,a2

m=MyClass()
m.method("irmen",42)