Exemplo n.º 1
0
/**
 * <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;
    }
}
Exemplo n.º 2
0
/**
 * <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;
}