#include #include #include #include "cbthread.h" #include "printqsim.h" #define START 0 #define GOT_JOB 1 #define GOT_SLOT 2 typedef void (*func)(); typedef struct { void (*func)(); Spq *s; Job *job; int state; } Mycont; void real_submit_job(Mycont *mc); void real_get_print_job(Mycont *mc); typedef struct { cbthread_gsem job_sem; cbthread_gsem slot_sem; Job **buffer; int head; int tail; } Info; void initialize_v(Spq *s) { Info *info; info = (Info *) malloc(sizeof(Info)); info->job_sem = cbthread_make_gsem(0); info->slot_sem = cbthread_make_gsem(s->bufsize); info->buffer = (Job **) malloc(sizeof(Job *)*s->bufsize); info->head = 0; info->tail = 0; s->v = (void *) info; } void submit_job(Spq *s, Job *j, void (*function)()) { Mycont *mc; mc = (Mycont *) malloc(sizeof(Mycont)); mc->func = function; mc->job = j; mc->s = s; mc->state = START; real_submit_job(mc); } void real_submit_job(Mycont *mc) { Info *info; Spq *s; void (*func)(); s = mc->s; info = (Info *) s->v; if (mc->state == START) { mc->state = GOT_SLOT; cbthread_gsem_P(info->slot_sem, real_submit_job, mc); } else if (mc->state == GOT_SLOT) { info->buffer[info->tail] = mc->job; info->tail = (info->tail + 1) % s->bufsize; cbthread_gsem_V(info->job_sem); func = mc->func; free(mc); (*func)(s); cbthread_exit(); } } void get_print_job(Spq *s, void (*function)()) { Mycont *mc; mc = (Mycont *) malloc(sizeof(Mycont)); mc->func = function; mc->s = s; mc->state = START; real_get_print_job(mc); } void real_get_print_job(Mycont *mc) { Spq *s; Info *info; void (*func)(); s = mc->s; info = (Info *) s->v; if (mc->state == START) { mc->state = GOT_JOB; cbthread_gsem_P(info->job_sem, real_get_print_job, mc); } else if (mc->state == GOT_JOB) { s->job = info->buffer[info->head]; info->head = (info->head + 1) % s->bufsize; cbthread_gsem_V(info->slot_sem); func = mc->func; free(mc); (*func)(s); cbthread_exit(); } }