static void save_one(struct savebuf *f, struct svalue *v) { static char buf[48]; static int depth = 0; if (++depth > MAX_DEPTH) { free(f->buf); depth = 0; error("Too deep recursion\n"); } switch(v->type) { case T_FLOAT: (void)sprintf(buf,"#%a#", v->u.real); add_strbuf(f, buf); break; case T_NUMBER: (void)sprintf(buf, "%lld", v->u.number); add_strbuf(f, buf); break; case T_STRING: save_string(f, v->u.string); break; case T_POINTER: save_array(f, v->u.vec); break; case T_MAPPING: save_mapping(f, v->u.map); break; case T_OBJECT: (void)sprintf(buf, "$%d@", v->u.ob->created); add_strbuf(f, buf); add_strbuf(f, v->u.ob->name); add_strbuf(f, "$"); break; #if 0 case T_FUNCTION: add_strbuf(f, "&FUNCTION&"); /* XXX function */ break; #endif default: add_strbuf(f, "0"); break; } depth--; }
/** * Main routine of the mapping agent. */ void *agent_routine(void *data) { agent_t *agent = (agent_t*) data; assert(agent != NULL); while (1) { int i; #ifdef THREADS_ENABLE // wait threads synchro for (i = 0; i < agent->nb_threads; i++) { orcc_semaphore_wait(agent->sem_agent); } #endif print_orcc_trace(ORCC_VL_VERBOSE_1, "Remap the actors..."); compute_workloads(agent->network); do_mapping(agent->network, agent->options, agent->mapping); if (agent->options->mapping_output_file) { save_mapping(agent->options->mapping_output_file, agent->mapping); } apply_mapping(agent->mapping, agent->scheduler, agent->nb_threads); if(opt->mapping_repetition == REMAP_ALWAYS) { reset_profiling(agent->network); resetMapping(); } else { need_remap = FALSE; fpsPrintInit_mapping(); } #ifdef THREADS_ENABLE // wakeup all threads for (i = 0; i < agent->nb_threads; i++) { orcc_semaphore_set(agent->scheduler->schedulers[i]->sem_thread); } #endif } return 0; }