void *thread_start(void *arg) { printf("thread filha antes do monitor\n"); sthread_monitor_enter(mon); printf("thread filha dentro do monitor, antes do signal\n"); sthread_monitor_signal(mon); printf("thread filha dentro do monitor, depois do signal\n"); sthread_monitor_exit(mon); printf("thread filha depois do monitor\n"); return NULL; }
void* thread_consumer() { req_t req_d; int ressz, req_i; snfs_msg_res_t res; while(1) { sthread_monitor_enter(mon); // get request from queue while (!available_reqs) sthread_monitor_wait(mon); req_d = get_req(); available_reqs--; sthread_monitor_signal(mon); sthread_monitor_exit(mon); // clean response memset(&res,0,sizeof(res)); // find request handler req_i = -1; for (int i = 0; i < NUM_REQ_HANDLERS; i++) { if (req_d->req.type == Service[i].type) { req_i = i; break; } } // serve the request if (req_i == -1) { res.status = RES_UNKNOWN; ressz = sizeof(res) - sizeof(res.body); printf("[snfs_srv] unknown request.\n"); } else { Service[req_i].handler(&(req_d->req),req_d->reqsz,&res,&ressz); } // send response to client srv_send_response(&res,ressz,&(req_d->cliaddr),req_d->clilen); // free stuff free(req_d); req_d = NULL; // force request processing sthread_yield(); } }
void *thread1(void *arg) { int i = *(int*)arg; printf("thread %d started\n", i); sthread_monitor_enter(mon1); printf("thread %d enter mon1\n", i); sthread_monitor_signal(mon1); printf("thread %d signal mon1\n", i); sthread_monitor_exit(mon1); printf("thread %d exit mon1\n", i); sthread_monitor_enter(mon2); printf("thread %d enter mon2\n", i); sthread_monitor_wait(mon2); printf("thread %d wait mon2\n", i); sthread_monitor_exit(mon2); printf("end %i\n", *(int*)arg); return 0; }