pthreads
Maintain and talk to a pthread pool.
Overview
Most of the egg's work is done in the startup: a pool of pthreads waiting for a job is initialized.
Only code having a C calling convention can be sent to the pool (and asynchronously call back to Scheme). Scheme code runs in the CHICKEN thread.
Issues
- Requires recent chicken version 4.11 or at least git master rev. 8294683 of 2016-01-14
- Starts currently 5 pthreads. TBD: make this configurable and start as many threads a the operating system configured processors are available.
- The Scheme API is not yet tested.
Requirements
None.
API
C
[syntax] typedef int (*C_pthread_request_function_t)(void *);[procedure] extern int start_asynchronous_request(C_pthread_request_function_t function, void *data, void *callback);
Send function to be executed at any thread of the pool. Function must accept one argument, the data. Callback must be a C_GC_ROOT object holding the procedure to receive the result for function.
[procedure] void C_interrupt_call(void *callback, void *result, void *value)Tell CHICKEN to call the procedure held in the C_GC_ROOT object callback on the result of applying the C_GC_ROOT object result to value.
Predecessor of concurrent-native-callbacks - it may be easier to use the latter.
Scheme
[procedure] (pool-send! JOB DATA CALLBACK) -> undefinedAll arguments given as non-null-c-pointer.
JOB: The C procedure to call
DATA: Opaque pointer for parameter passing.
CALLBACK: Pointer to callback procedure wrapped in a C_GC_ROOT. The callback is called with the value returned by JOB.
Examples
- sqlite3pth egg repository on github.
(define sqlite3-start-prepare (foreign-lambda* void ((<sqlite3-prepare-args> s) (nonnull-c-pointer callback)) "start_asynchronous_request( pthread_sqlite3_prepare, s, callback);"))
- Ask the author for alpha code running fuse on pthreads.
About this egg
Author
Jörg F. Wittenberger
Source Code
The pthreads egg repository is maintained on github.
Version History
0.2: Ported to CHICKEN 5.
0.1: Initial import.
Before: This code was ported from an RScheme module of the same author several years ago. Since it's been used in Askemos/BALL. Years later, in 2010, it was converted into an module of it's own.
License
BSD