#include #include #include #include "cbthread.h" #include "printqsim.h" typedef void (*func)(); void submit_job_slot_ready(Spq *s); void job_ready(Spq *s); typedef struct { cbthread_gsem job_sem; cbthread_gsem slot_sem; Job **buffer; int head; int tail; func *user_funcs; Job **user_jobs; func *printer_funcs; } 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->user_funcs = (func *) malloc(sizeof(func)*s->nusers); info->printer_funcs = (func *) malloc(sizeof(func)*s->nprinters); info->user_jobs = (Job **) malloc(sizeof(Job *)*s->nusers); info->head = 0; info->tail = 0; s->v = (void *) info; } void submit_job(Spq *s, Job *j, void (*function)()) { Info *info; info = (Info *) s->v; info->user_jobs[s->id] = j; info->user_funcs[s->id] = function; cbthread_gsem_P(info->slot_sem, submit_job_slot_ready, s); } void submit_job_slot_ready(Spq *s) { Info *info; info = (Info *) s->v; info->buffer[info->tail] = info->user_jobs[s->id]; info->tail = (info->tail + 1) % s->bufsize; cbthread_gsem_V(info->job_sem); cbthread_yield(info->user_funcs[s->id], s); } void get_print_job(Spq *s, void (*function)()) { Info *info; info = (Info *) s->v; info->printer_funcs[s->id] = function; cbthread_gsem_P(info->job_sem, job_ready, s); } void job_ready(Spq *s) { Info *info; info = (Info *) s->v; s->job = info->buffer[info->head]; info->head = (info->head + 1) % s->bufsize; cbthread_gsem_V(info->slot_sem); cbthread_yield(info->printer_funcs[s->id], s); }