summaryrefslogtreecommitdiff
path: root/modules/language/python/module/threading.scm
diff options
context:
space:
mode:
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>2018-03-26 15:56:28 +0200
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>2018-03-26 15:56:28 +0200
commit1c4e6def8285e0740461b732c78c74ed3345f524 (patch)
tree91fc9890421952804b5737a15bee4d34bafa1167 /modules/language/python/module/threading.scm
parent29e4d11cc8ce55c3ac8900ea5c93179c28d31ab4 (diff)
functools feature complete
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__))
+
+