/** * デストラクタ */ void state_free(State *s) { if (s->successors) { #ifdef PROFILE if (lmn_env.profile_level >= 3) profile_remove_space(PROFILE_SPACE__TRANS_OBJECT, sizeof(succ_data_t) * state_succ_num(s)); #endif if (has_trans_obj(s)) { unsigned int i; for (i = 0; i < state_succ_num(s); i++) { transition_free(transition(s, i)); } } LMN_FREE(s->successors); } if (s->local_flags) { LMN_FREE(s->local_flags); } state_expand_lock_destroy(s); state_free_mem(s); state_free_binstr(s); LMN_FREE(s); #ifdef PROFILE if (lmn_env.profile_level >= 3) { profile_remove_space(PROFILE_SPACE__STATE_OBJECT, sizeof(struct State)); } #endif }
static void translate_ruleset(LmnRuleSet ruleset, const char *header) { char *buf; lmn_interned_str *rule_names; int i, buf_len, rules_count; buf_len = strlen(header) + 50; /* 適当. これだけあれば足りるはず */ buf = lmn_malloc(buf_len + 1); rules_count = lmn_ruleset_rule_num(ruleset); if (rules_count > 0) { rule_names = LMN_CALLOC(lmn_interned_str, rules_count); } else { rule_names = NULL; } for (i = 0; i < lmn_ruleset_rule_num(ruleset); i++) { snprintf(buf, buf_len, "%s_%d", header, i); /* ルールのシグネチャ */ translate_rule(lmn_ruleset_get_rule(ruleset, i), buf); rule_names[i] = translating_rule_name; } fprintf(OUT, "struct trans_rule %s_rules[%d] = {", header, lmn_ruleset_rule_num(ruleset)); for(i = 0; i < lmn_ruleset_rule_num(ruleset); i++){ if(i != 0) fprintf(OUT, ", "); fprintf(OUT, "{%d, %s_%d_0}", rule_names[i], header, i); /* 各ルールの名前と先頭関数を配列に */ } fprintf(OUT, "};\n\n"); LMN_FREE(rule_names); lmn_free(buf); }
void sp_atom_finalize() { int i; for (i = 0; i < vec_num(sp_atom_callback_tbl); i++) { LMN_FREE(vec_get(sp_atom_callback_tbl, i)); } vec_free(sp_atom_callback_tbl); }
void transition_free(Transition t) { #ifdef PROFILE if (lmn_env.profile_level >= 3) { profile_remove_space(PROFILE_SPACE__TRANS_OBJECT, transition_space(t)); } #endif vec_destroy(&t->rule_names); LMN_FREE(t); }
/* 後始末 */ void lmn_workergroup_free(LmnWorkerGroup *wp) { #ifndef OPT_WORKERS_SYNC lmn_barrier_destroy(&workers_synchronizer(wp)); #endif workers_free(wp->workers, workers_entried_num(wp)); if (wp->ewlock) { ewlock_free(wp->ewlock); } LMN_FREE(wp); }
/** * ($start, $end, $g) * where * start, end = integer * g = ground * * Creates a (multi)set $g[$a], $g[$a+1], ..., $g[$b]. */ void integer_set(LmnReactCxt *rc, LmnMembrane *mem, LmnAtom a0, LmnLinkAttr t0, LmnAtom a1, LmnLinkAttr t1, LmnAtom a2, LmnLinkAttr t2) { Vector *srcvec; int i, j, n; int start, end; start = (int)a0; end = (int)a1; srcvec = vec_make(16); vec_push(srcvec, (LmnWord)LinkObj_make(a2, t2)); for (i = 0, n = start; n <= end; i++, n++) { Vector *dstlovec; ProcessTbl atommap; LinkObj l; lmn_mem_copy_ground(mem, srcvec, &dstlovec, &atommap); l = (LinkObj)vec_get(dstlovec, 0); lmn_mem_newlink(mem, n, LMN_INT_ATTR, 0, l->ap, t2, LMN_ATTR_GET_VALUE(l->pos)); lmn_mem_push_atom(mem, n, LMN_INT_ATTR); for (j = 0; j < vec_num(dstlovec); j++) LMN_FREE(vec_get(dstlovec, j)); vec_free(dstlovec); proc_tbl_free(atommap); } lmn_mem_delete_atom(mem, a0, t0); lmn_mem_delete_atom(mem, a1, t1); lmn_mem_delete_ground(mem, srcvec); for (i = 0; i < vec_num(srcvec); i++) LMN_FREE(vec_get(srcvec, i)); vec_free(srcvec); }
void state_succ_clear(State *s) { if (has_trans_obj(s)) { unsigned int i; for (i = 0; i < state_succ_num(s); i++) { Transition t = transition(s, i); transition_free(t); } } #ifdef PROFILE if (lmn_env.profile_level >= 3) { profile_remove_space(PROFILE_SPACE__TRANS_OBJECT, sizeof(succ_data_t) * state_succ_num(s)); profile_add_space(PROFILE_SPACE__TRANS_OBJECT, 0); } #endif LMN_FREE(s->successors); s->successors = NULL; s->successor_num = 0; unset_trans_obj(s); }
static void workers_free(LmnWorker **pool, unsigned int worker_num) { unsigned int i, j; for (i = 0; i < worker_num; i++) { LmnWorker *w = pool[i]; if (worker_group(w)->do_search) { vec_free(w->invalid_seeds); for (j = 0; j < vec_num(w->cycles); j++) { vec_free((Vector *)vec_get(w->cycles, j)); } vec_free(w->cycles); } if (i == 0) { statespace_free(worker_states(w)); } worker_finalize(w); lmn_worker_free(w); } LMN_FREE(pool); }
static inline void lmn_TLS_free(LmnTLS *p) { lmn_TLS_destroy(p); LMN_FREE(p); }
void lmn_worker_free(LmnWorker *w) { react_context_dealloc(w->cxt); LMN_FREE(w); }