diff --git a/src/mzscheme/src/mzrt.c b/src/mzscheme/src/mzrt.c index 8ef8fc92b5..827db0b558 100644 --- a/src/mzscheme/src/mzrt.c +++ b/src/mzscheme/src/mzrt.c @@ -297,6 +297,59 @@ int mzrt_cond_destroy(mzrt_cond *cond) { return pthread_cond_destroy(&cond->cond); } +/****************** PROCESS THREAD MAIL BOX *******************************/ + +pt_mbox *pt_mbox_create() { + pt_mbox *mbox = (pt_mbox *)malloc(sizeof(pt_mbox)); + mbox->count = 0; + mbox->in = 0; + mbox->out = 0; + mzrt_mutex_create(&mbox->mutex); + mzrt_cond_create(&mbox->nonempty); + mzrt_cond_create(&mbox->nonfull); + return mbox; +} + +void pt_mbox_send(pt_mbox *mbox, int type, void *payload, pt_mbox *origin) { + mzrt_mutex_lock(mbox->mutex); + while ( mbox->count == 5 ) { + mzrt_cond_wait(mbox->nonfull, mbox->mutex); + } + mbox->queue[mbox->in].type = type; + mbox->queue[mbox->in].payload = payload; + mbox->queue[mbox->in].origin = origin; + mbox->in = (mbox->in + 1) % 5; + mbox->count++; + mzrt_cond_signal(mbox->nonempty); + mzrt_mutex_unlock(mbox->mutex); +} + +void pt_mbox_recv(pt_mbox *mbox, int *type, void **payload, pt_mbox **origin){ + mzrt_mutex_lock(mbox->mutex); + while ( mbox->count == 0 ) { + mzrt_cond_wait(mbox->nonempty, mbox->mutex); + } + *type = mbox->queue[mbox->out].type; + *payload = mbox->queue[mbox->out].payload; + *origin = mbox->queue[mbox->out].origin; + mbox->out = (mbox->out + 1) % 5; + mbox->count--; + mzrt_cond_signal(mbox->nonfull); + mzrt_mutex_unlock(mbox->mutex); +} + +void pt_mbox_send_recv(pt_mbox *mbox, int type, void *payload, pt_mbox *origin, int *return_type, void **return_payload) { + pt_mbox *return_origin; + pt_mbox_send(mbox, type, payload, origin); + pt_mbox_recv(origin, return_type, return_payload, &return_origin); +} + +void pt_mbox_destroy(pt_mbox *mbox) { + mzrt_mutex_destroy(mbox->mutex); + mzrt_cond_destroy(mbox->nonempty); + mzrt_cond_destroy(mbox->nonfull); + free(mbox); +} #ifdef MZ_XFORM END_XFORM_SUSPEND; diff --git a/src/mzscheme/src/mzrt.h b/src/mzscheme/src/mzrt.h index 9c6754f00e..0b246a721c 100644 --- a/src/mzscheme/src/mzrt.h +++ b/src/mzscheme/src/mzrt.h @@ -67,6 +67,28 @@ int mzrt_cond_signal(mzrt_cond *cond); int mzrt_cond_broadcast(mzrt_cond *cond); int mzrt_cond_destroy(mzrt_cond *cond); +/****************** PROCESS THREAD MAIL BOX *******************************/ +typedef struct pt_mbox_msg { + int type; + void *payload; + struct pt_mbox *origin; +} pt_mbox_msg; + +typedef struct pt_mbox { + struct pt_mbox_msg queue[5]; + int count; + int in; + int out; + mzrt_mutex *mutex; + mzrt_cond *nonempty; + mzrt_cond *nonfull; +} pt_mbox; + +pt_mbox *pt_mbox_create(); +void pt_mbox_send(pt_mbox *mbox, int type, void *payload, pt_mbox *origin); +void pt_mbox_recv(pt_mbox *mbox, int *type, void **payload, pt_mbox **origin); +void pt_mbox_send_recv(pt_mbox *mbox, int type, void *payload, pt_mbox *origin, int *return_type, void **return_payload); +void pt_mbox_destroy(pt_mbox *mbox); #endif