// Original void sum_many_async(int[] inputs, lambda_t callback); // Target int sum_many (int[] inputs); //================================== int sum_many(int[] inputs) { // setup required data int result; semaphore_t sem = { 0 }; // call async function sum_many_async( inputs, (int sum) { result = sum; V(sem); }); // wait for result P(sem); // return return result; } int sum_many_block(int[] inputs); int sum_many (int[] inputs); //================================== struct request_t { int[] inputs; int result; semaphore_t sem = { 0 }; }; void * call_sum_many_block(void * args) { request_t * req = (request_t *) args; req->result = sum_many_block(req->inputs); V(req->sem); } int sum_many(int[] inputs) { // setup required data request_t req = { inputs }; // create thread to pthread_t thrd; int err = pthread_fork(&thrd, 0p, call_sum_many_block, &req); handle(err); // wait P(req.sem); // Cleanup pthread err = pthread_join(&thrd, 0p); handle(err); // get result return req.result; }