/** * <EN> * If multiple instances defined from init, remove initial one (id=0) * </EN> * <JA> * 複数インスタンスが定義されている場合、初期インスタンス(id=0)は * 無効なので消す. * </JA> * * @param jconf [i/o] global configuration instance * * @callgraph * @callergraph * @ingroup jconf */ static void j_config_remove_initial(Jconf *jconf) { JCONF_AM *am; JCONF_LM *lm; JCONF_SEARCH *s; if(jconf->am_root->next != NULL && jconf->am_root->id == 0) { am = jconf->am_root->next; /*free(jconf->am_root);*/ j_jconf_am_free(jconf->am_root); jconf->am_root = am; } if(jconf->lm_root->next != NULL && jconf->lm_root->id == 0) { lm = jconf->lm_root->next; /*free(jconf->lm_root);*/ j_jconf_lm_free(jconf->lm_root); jconf->lm_root = lm; } if(jconf->search_root->next != NULL && jconf->search_root->id == 0) { s = jconf->search_root->next; /*free(jconf->search_root);*/ j_jconf_search_free(jconf->search_root); jconf->search_root = s; } }
/** * <EN> * Remove an AM process instance (experimental). * The specified am conf will also be released and destroyed * inside this function. * </EN> * <JA> * 言語モデルインスタンスを削除する(実験中). * 指定された言語モデル設定もこの関数内で解放・削除される. * </JA> * * @param recog [in] engine instance * @param amconf [in] AM configuration corresponding to the target * AM process to remove * * @return TRUE on success, or FALSE on failure. * * @callgraph * @callergraph * @ingroup jfunc_process */ boolean j_process_am_remove(Recog *recog, JCONF_AM *amconf) { RecogProcess *r; PROCESS_LM *lm; PROCESS_AM *am, *am_prev; JCONF_AM *a, *a_prev; if (amconf == NULL) { jlog("ERROR: j_process_am_remove: amconf == NULL\n"); return FALSE; } /* check if still used by a process */ for(r=recog->process_list; r; r=r->next) { if (r->config->amconf == amconf) { jlog("ERROR: j_process_am_remove: specified amconf %02d %s still used in a recogprocess %02d %s\n", amconf->id, amconf->name, r->config->id, r->config->name); return FALSE; } } /* check if still used by a LM process */ for(lm=recog->lmlist; lm; lm=lm->next) { if (lm->am->config == amconf) { jlog("ERROR: j_process_am_remove: specified amconf %02d %s still used in a LM %02d %s\n", amconf->id, amconf->name, lm->config->id, lm->config->name); return FALSE; } } /* find corresponding AM process in engine and remove it from list */ am_prev = NULL; for(am=recog->amlist; am; am=am->next) { if (am->config == amconf) { if (am_prev == NULL) { recog->amlist = am->next; } else { am_prev->next = am->next; } break; } am_prev = am; } if (!am) { jlog("ERROR: j_process_am_remove: specified amconf %02d %s not found in AM process, removal failed\n", amconf->id, amconf->name); return FALSE; } /* remove config from list in engine */ a_prev = NULL; for(a=recog->jconf->am_root; a; a=a->next) { if (a == amconf) { if (a_prev == NULL) { recog->jconf->am_root = a->next; } else { a_prev->next = a->next; } break; } a_prev = a; } if (!a) { jlog("ERROR: j_process_am_remove: amconf %02d %s not found\n", amconf->id, amconf->name); return FALSE; } /* free them */ j_process_am_free(am); if (verbose_flag) jlog("STAT: AM process %02d %s removed\n", amconf->id, amconf->name); j_jconf_am_free(amconf); /* tell engine to update */ recog->process_want_reload = TRUE; return TRUE; }