#include #include "pt.h" #include "printqsim.h" user_thread(void *v) { Spq *s; int sleeptime; Job *j; s = (Spq *) v; if (s->state == PRINTING) { s->nsofar++; s->state = START; } if (s->state == START) { if (s->nsofar == s->nevents) { pt_exit(); printf("%4d: user %2d/%03d: Done\n", time(0)-s->starttime, s->id, s->nsofar); fflush(stdout); } sleeptime = random()%(s->arrtime*2) + 1; s->state = SLEEPING; printf("%4d: user %2d/%03d: Sleeping for %2d seconds\n", time(0)-s->starttime, s->id, s->nsofar, sleeptime); fflush(stdout); pt_sleep(sleeptime, user_thread, s); /* Note -- this doesn't return */ } else if (s->state == SLEEPING) { j = (Job *) malloc(sizeof(Job)); j->jobsize = (random()%s->maxpages) + 1; j->userid = s->id; j->jobid = s->nsofar; s->state = PRINTING; printf("%4d: user %2d/%03d: Submitting a job with size %d\n", time(0)-s->starttime, s->id, s->nsofar, j->jobsize); fflush(stdout); submit_job(s, j, user_thread, s); /* Note -- this doesn't return */ } } /* Assume 4 seconds a page */ printer_thread(void *v) { Spq *s; Job *j; s = (Spq *) v; if (s->state == PRINTING) { free(s->j); s->j = NULL; s->nsofar++; s->state = START; } if (s->state == START) { printf("%4d: prnt %2d/%03d: ready to print\n", time(0)-s->starttime, s->id, s->nsofar); fflush(stdout); s->state = GETTING_JOB; get_print_job(s, printer_thread, s); /* This doesn't return */ } else if (s->state == GETTING_JOB) { if (s->j == NULL) { printf("%4d: prnt %2d/%03d: Done\n", time(0)-s->starttime, s->id, s->nsofar); fflush(stdout); pt_exit(); } j = s->j; printf("%4d: prnt %2d/%03d:", time(0)-s->starttime, s->id, s->nsofar); printf(" Printing job %3d from user %2d size %3d\n", j->jobid, j->userid, j->jobsize); fflush(stdout); s->state = PRINTING; pt_sleep(4*j->jobsize, printer_thread, s); } } main(int argc, char **argv) { Spq spq, *s; int i; if (argc != 7) { fprintf(stderr, "usage: printqsim nusers nprinters arrtime maxpages bufsize nevents\n"); exit(1); } spq.nusers = atoi(argv[1]); spq.nprinters = atoi(argv[2]); spq.arrtime = atoi(argv[3]); spq.maxpages = atoi(argv[4]); spq.bufsize = atoi(argv[5]); spq.nevents = atoi(argv[6]); spq.starttime = time(0); srandom(spq.starttime); spq.state = START; spq.nsofar = 0; spq.j = NULL; initialize_v(&spq); for (i = 0; i < spq.nusers; i++) { s = (Spq *) malloc(sizeof(Spq)); memcpy(s, &spq, sizeof(Spq)); s->id = i; pt_fork(user_thread, (void *) s); } for (i = 0; i < spq.nprinters; i++) { s = (Spq *) malloc(sizeof(Spq)); memcpy(s, &spq, sizeof(Spq)); s->id = i; pt_fork(printer_thread, (void *) s); } pt_exit(); }