#include #include "pt.h" #include "printqsim.h" typedef struct { void (*f)(); void *a; Spq *s; Job *j; } Cont; typedef struct { Job **b; int head; int tail; Gsem njobs; Gsem nslots; } Buffer; void initialize_v(Spq *s) { Buffer *b; b = (Buffer *) malloc(sizeof(Buffer)); b->b = (Job **) malloc(sizeof(Job *)*s->bufsize); b->head = 0; b->tail = 0; b->njobs = make_gsem(0); b->nslots = make_gsem(s->bufsize); s->v = (void *) b; } void submit_job_cont(c) Cont *c; { Spq *s; Job *j; void (*f)(); void *a; Buffer *b; s = c->s; j = c->j; f = c->f; a = c->a; free(c); b = (Buffer *) s->v; b->b[b->head] = j; b->head = (b->head + 1) % s->bufsize; gsem_V(b->njobs); pt_yield(f, a); } void submit_job(s, j, f, a) Spq *s; Job *j; void (*f)(); void *a; { Buffer *b; Cont *c; c = (Cont *) malloc(sizeof(Cont)); b = (Buffer *) s->v; c->f = f; c->a = a; c->s = s; c->j = j; gsem_P(b->nslots, submit_job_cont, c); } void get_print_job_cont(c) Cont *c; { Spq *s; void (*f)(); void *a; Buffer *b; s = c->s; f = c->f; a = c->a; free(c); b = (Buffer *) s->v; s->j = b->b[b->tail]; b->tail = (b->tail + 1) % s->bufsize; gsem_V(b->nslots); pt_yield(f, a); } get_print_job(s, f, a) Spq *s; void (*f)(); void *a; { Buffer *b; Cont *c; c = (Cont *) malloc(sizeof(Cont)); c->f = f; c->a = a; c->s = s; b = (Buffer *) s->v; gsem_P(b->njobs, get_print_job_cont, c); }