#include #include #include #include "cbthread.h" #include "printqsim.h" void user_ready_to_print(Spq *s); void user_job_submitted(Spq *s); void printer_got_job(Spq *s); void printer_job_printed(Spq *s); void user_thread(Spq *s) { int sleeptime; if (s->event == s->nevents) return; sleeptime = random()%(s->arrtime*2) + 1; printf("%4d: user %2d/%03d: Sleeping for %2d seconds\n", time(0)-s->starttime, s->id, s->event, sleeptime); fflush(stdout); cbthread_sleep(sleeptime, user_ready_to_print, s); } void user_ready_to_print(Spq *s) { Job *j; j = (Job *) malloc(sizeof(Job)); j->jobsize = (random()%s->maxpages) + 1; j->userid = s->id; j->jobid = s->event; printf("%4d: user %2d/%03d: Submitting a job with size %d\n", time(0)-s->starttime, s->id, s->event, j->jobsize); fflush(stdout); submit_job(s, j, user_job_submitted); } void user_job_submitted(Spq *s) { s->event++; user_thread(s); } /* Assume 4 seconds a page */ void printer_thread(Spq *s) { printf("%4d: prnt %2d/%03d: ready to print\n", time(0)-s->starttime, s->id, s->event); fflush(stdout); get_print_job(s, printer_got_job); } void printer_got_job(Spq *s) { if (s->job == NULL) { printf("%4d: prnt %2d/%03d: Done\n", time(0)-s->starttime, s->id, s->event); fflush(stdout); cbthread_exit(); } printf("%4d: prnt %2d/%03d:", time(0)-s->starttime, s->id, s->event); printf(" Printing job %3d from user %2d size %3d\n", s->job->jobid, s->job->userid, s->job->jobsize); fflush(stdout); cbthread_sleep(4*s->job->jobsize, printer_job_printed, s); } void printer_job_printed(Spq *s) { s->event++; free(s->job); s->job = NULL; 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.event = 0; spq.job = NULL; spq.starttime = time(0); srandom(spq.starttime); initialize_v(&spq); for (i = 0; i < spq.nusers; i++) { s = (Spq *) malloc(sizeof(Spq)); memcpy(s, &spq, sizeof(Spq)); s->id = i; cbthread_fork(user_thread, s); } for (i = 0; i < spq.nprinters; i++) { s = (Spq *) malloc(sizeof(Spq)); memcpy(s, &spq, sizeof(Spq)); s->id = i; cbthread_fork(printer_thread, s); } cbthread_exit(NULL); }