#!/usr/bin/env python


class ThreadingUtility:

    # Assumes class has instance lock initialized
    @classmethod
    def synchronize(cls, func):
        def synchronized(*args, **kwargs):
            im_self = args[0]
            im_self.lock.acquire()
            try:
                result = func(*args, **kwargs)
                return result
            finally:
                im_self.lock.release()
        return synchronized

#######################################################################
# Testing.
if __name__ == '__main__':
    import threading
    class A:
        def __init__(self):
            self.lock = threading.RLock()

        @ThreadingUtility.synchronize
        def twoX(self, x):
            print 'X=', x
            return 2*x

    a = A()
    t = a.twoX(3)
    print 'Result: ', t