summaryrefslogtreecommitdiff
path: root/modules/language/python/module/threading.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/module/threading.scm')
-rw-r--r--modules/language/python/module/threading.scm36
1 files changed, 36 insertions, 0 deletions
diff --git a/modules/language/python/module/threading.scm b/modules/language/python/module/threading.scm
new file mode 100644
index 0000000..b4d43c2
--- /dev/null
+++ b/modules/language/python/module/threading.scm
@@ -0,0 +1,36 @@
+(define-module (language python module threading)
+ #:use-module (ice-9 threads)
+ #:use-module (oop pf-objects)
+ #:use-module (language python def)
+ #:export (RLock))
+
+(define-python-class RLock
+ (define __init__
+ (lambda (self)
+ (set self '_lock (make-mutex 'recursive))))
+
+ (define __enter__
+ (lambda (self)
+ (lock-mutex (ref self '_lock))))
+
+ (define __leave__
+ (lambda (self)
+ (unlock-mutex (ref self '_lock))))
+
+
+ (define acquire
+ (lam (self (= blocking #t) (timeout -1))
+ (if blocking
+ (if (< timeout 0)
+ (lock-mutex (ref self '_lock))
+ (let* ((cur (gettimeofday))
+ (x (+ (car cur) (/ (cdr cur) 1000000.0)))
+ (y (+ x timeout))
+ (s (floor y))
+ (us (floor (* (- y s) 1000000))))
+ (lock-mutex (ref self '_lock) (cons s us))))
+ (try-lock (ref self '_lock)))))
+
+ (define release __leave__))
+
+