/** * clean shutdown of the the ceptr system * * should be called by the thread that called _a_boot() (or _a_start_vmhost()) */ void _a_shut_down() { // cleanly close down any processing in the VM_Host __r_kill(G_vm->r); _v_join_thread(&G_vm->clock_thread); _v_join_thread(&G_vm->vm_thread); char fn[1000]; // serialize the semtable __a_serializet(_t_root(G_vm->sem->stores[0].definitions),SEM_FN); int i; T *paths = _t_new_root(RECEPTOR_PATHS); for (i=0;i<G_vm->sem->contexts;i++) { // we don't need the path of the root so start at 1 int *p = _t_get_path(G_vm->sem->stores[i].definitions); if (p) { _t_new(paths,RECEPTOR_PATH,p,sizeof(int)*(_t_path_depth(p)+1)); free(p); } else _t_newr(paths,STRUCTURE_ANYTHING); // should be something like DELETED_CONTEXT } __a_serializet(paths,PATHS_FN); _t_free(paths); // serialize the receptor part of the vmhost void *surface; size_t length; _r_serialize(G_vm->r,&surface,&length); // _r_unserialize(surface); __a_vmfn(fn,G_vm->dir); writeFile(fn,surface,length); free(surface); // serialize other parts of the vmhost H h = _m_newr(null_H,SYS_STATE); H har = _m_newr(h,ACTIVE_RECEPTORS); for (i=0;i<G_vm->active_receptor_count;i++) { _m_new(har,RECEPTOR_XADDR,&G_vm->active_receptors[i].x,sizeof(Xaddr)); } S *s = _m_serialize(h.m); __a_vm_state_fn(fn,G_vm->dir); writeFile(fn,s,s->total_size); free(s); _m_free(h); // free the memory used by the SYS_RECEPTOR _v_free(G_vm); G_vm = NULL; }
/** * 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; }