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

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) -> undefined

All 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

       (define sqlite3-start-prepare
         (foreign-lambda*
          void
          ((<sqlite3-prepare-args> s) (nonnull-c-pointer callback))
          "start_asynchronous_request(
            pthread_sqlite3_prepare, s, callback);"))

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