mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-12 07:17:37 +02:00
Integrate cond-variable wait with mutex-unlock!
This commit is contained in:
parent
c98e186172
commit
1ec3608d8d
1 changed files with 23 additions and 3 deletions
26
srfi/18.sld
26
srfi/18.sld
|
@ -38,6 +38,7 @@
|
||||||
;; (condition-variable-name condition-variable) ;procedure
|
;; (condition-variable-name condition-variable) ;procedure
|
||||||
;; (condition-variable-specific condition-variable) ;procedure
|
;; (condition-variable-specific condition-variable) ;procedure
|
||||||
;; (condition-variable-specific-set! condition-variable obj) ;procedure
|
;; (condition-variable-specific-set! condition-variable obj) ;procedure
|
||||||
|
condition-variable-wait! ;; Non-standard
|
||||||
condition-variable-signal!
|
condition-variable-signal!
|
||||||
condition-variable-broadcast!
|
condition-variable-broadcast!
|
||||||
|
|
||||||
|
@ -142,7 +143,17 @@
|
||||||
}
|
}
|
||||||
return_thread_runnable(data, boolean_t); ")
|
return_thread_runnable(data, boolean_t); ")
|
||||||
|
|
||||||
(define-c mutex-unlock!
|
(define (mutex-unlock! mutex . opts)
|
||||||
|
(cond
|
||||||
|
((null? opts)
|
||||||
|
(Cyc-mutex-unlock! mutex))
|
||||||
|
((condition-variable? (car opts))
|
||||||
|
(let ((cond-var (car opts)))
|
||||||
|
(condition-variable-wait! cond-var mutex)))
|
||||||
|
(else
|
||||||
|
(error "mutex-unlock! - unhandled args" mutex opts))))
|
||||||
|
|
||||||
|
(define-c Cyc-mutex-unlock!
|
||||||
"(void *data, int argc, closure _, object k, object obj)"
|
"(void *data, int argc, closure _, object k, object obj)"
|
||||||
" mutex m = (mutex) obj;
|
" mutex m = (mutex) obj;
|
||||||
Cyc_check_mutex(data, obj);
|
Cyc_check_mutex(data, obj);
|
||||||
|
@ -172,8 +183,17 @@
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
return_closcall1(data, k, cond); ")
|
return_closcall1(data, k, cond); ")
|
||||||
;; (condition-variable-signal! condition-variable) ;procedure
|
(define-c condition-variable-wait!
|
||||||
;; (condition-variable-broadcast! condition-variable) ;procedure
|
"(void *data, int argc, closure _, object k, object cond, object lock)"
|
||||||
|
" Cyc_check_cond_var(data, cond);
|
||||||
|
Cyc_check_mutex(data, lock);
|
||||||
|
if (pthread_cond_wait(
|
||||||
|
&(((cond_var)cond)->cond),
|
||||||
|
&(((mutex)lock)->lock)) != 0) {
|
||||||
|
fprintf(stderr, \"Unable to wait for condition variable\\n\");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
return_closcall1(data, k, boolean_t); ")
|
||||||
(define-c condition-variable-signal!
|
(define-c condition-variable-signal!
|
||||||
"(void *data, int argc, closure _, object k, object cond)"
|
"(void *data, int argc, closure _, object k, object cond)"
|
||||||
" Cyc_check_cond_var(data, cond);
|
" Cyc_check_cond_var(data, cond);
|
||||||
|
|
Loading…
Add table
Reference in a new issue