Ejemplo n.º 1
0
Archivo: state.c Proyecto: ysm001/slim
/**
 * デストラクタ
 */
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
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
Archivo: state.c Proyecto: ysm001/slim
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);
}
Ejemplo n.º 5
0
/* 後始末 */
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);
}
Ejemplo n.º 6
0
Archivo: integer.c Proyecto: onmsr/slim
/**
 * ($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);
}
Ejemplo n.º 7
0
Archivo: state.c Proyecto: ysm001/slim
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);
}
Ejemplo n.º 8
0
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);
}
Ejemplo n.º 9
0
Archivo: env.c Proyecto: lmntal/slim
static inline void lmn_TLS_free(LmnTLS *p) {
  lmn_TLS_destroy(p);
  LMN_FREE(p);
}
Ejemplo n.º 10
0
void lmn_worker_free(LmnWorker *w)
{
  react_context_dealloc(w->cxt);
  LMN_FREE(w);
}