/** * reduce all the processes in a queue, and terminate thread when completed * * @param[in] q the queue to be processed */ void *_p_reduceq_thread(void *arg){ Q *q = (Q*)arg; int err; err = _p_reduceq((Q *)arg); pthread_exit(err); }
/** * this is the VMhost main monitoring and execution thread */ void *__v_process(void *arg) { VMHost *v = (VMHost *) arg; int c,i; while(v->r->state == Alive) { // make sure everybody's doing the right thing... // reallocate threads as necessary... // do edge-receptor type stuff.. // what ever other watchdoggy type things are necessary... // printf ("something\n"); // sleep(1); // for now we will check all receptors for any active contexts and // we will reduce them here. Really this should be a thread pool manager // where we put allocate receptor's queues for processing according to // priority/etc... for (i=0;v->r->state == Alive && i<v->active_receptor_count;i++) { Receptor *r = v->active_receptors[i].r; if (r->q && r->q->contexts_count > 0) { _p_reduceq(r->q); } // send any signals generated by the reduction _v_deliver_signals(v,r); // cleanup any fully reduced run-trees if (r->q->completed) _p_cleanup(r->q); } } // close down all receptors for (i=0;i<v->active_receptor_count;i++) { Receptor *r = v->active_receptors[i].r; __r_kill(r); // if other receptors have threads associated with them, the possibly we should // be doing a thread_join here, or maybe even inside __r_kill @fixme } int err =0; pthread_exit(&err); //@todo determine if we should use pthread_exit or just return 0 return 0; }