diff options
author | Ted Yin <[email protected]> | 2015-08-31 16:16:00 +0800 |
---|---|---|
committer | Ted Yin <[email protected]> | 2015-08-31 16:16:00 +0800 |
commit | 014bbfb7e64999a75f9e0dc52267a36741281624 (patch) | |
tree | 127888bcefaf8ce4991bb4c173d6538f1172f35f /htk_io/src/cwrapper.cpp | |
parent | 9e1a0931be43ea80fe7d41154007839b637d4e08 (diff) | |
parent | 2196e0a591b9bc254aa95e180adf188fd70ded68 (diff) |
Merge pull request #4 from uphantom/master
support fastnn multi-thread TNetReader
Diffstat (limited to 'htk_io/src/cwrapper.cpp')
-rw-r--r-- | htk_io/src/cwrapper.cpp | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/htk_io/src/cwrapper.cpp b/htk_io/src/cwrapper.cpp index b7ce2d5..66cde23 100644 --- a/htk_io/src/cwrapper.cpp +++ b/htk_io/src/cwrapper.cpp @@ -8,6 +8,7 @@ extern "C" { #include "cwrapper.h" #include "string.h" +#include "pthread.h" #include "nerv/common.h" extern Matrix *nerv_matrix_host_float_create(long nrow, long ncol, Status *status); @@ -29,6 +30,7 @@ extern "C" { const char* cvn_mask; const char* cvg_file; TNet::Matrix<float> feats_host; /* KaldiLib implementation */ + int refcount; }; TNetFeatureRepo *tnet_feature_repo_new(const char *p_script, const char *config, int context) { @@ -53,6 +55,18 @@ extern "C" { return repo; } + TNetFeatureRepo *tnet_feature_repo_newWithId(long id) + { + TNetFeatureRepo *repo = (TNetFeatureRepo*)id; + __sync_fetch_and_add(&repo->refcount, 1); + return repo; + } + + long tnet_feature_repo_id(TNetFeatureRepo *repo) + { + return (long)(repo); + } + Matrix *tnet_feature_repo_read_utterance(TNetFeatureRepo *repo, lua_State *L, int debug) { Matrix *mat; /* nerv implementation */ repo->feature_repo.ReadFullMatrix(repo->feats_host); @@ -93,12 +107,19 @@ extern "C" { } void tnet_feature_repo_destroy(TNetFeatureRepo *repo) { - if (repo->cmn_mask) - free(repo->cmn_path); - if (repo->cvn_mask) - free(repo->cvn_path); - free(repo->p_deriv_win_lenghts); - delete repo; + if (NULL != repo) + { + if(__sync_fetch_and_add(&repo->refcount, -1) == 1) + { + if (repo->cmn_mask) + free(repo->cmn_path); + if (repo->cvn_mask) + free(repo->cvn_path); + free(repo->p_deriv_win_lenghts); + delete repo; + repo = NULL; + } + } } struct TNetLabelRepo { @@ -114,6 +135,16 @@ extern "C" { return repo; } + TNetLabelRepo *tnet_label_repo_newWithId(long id) + { + return (TNetLabelRepo*)id; + } + + long tnet_label_repo_id(TNetLabelRepo *repo) + { + return (long)(repo); + } + Matrix *tnet_label_repo_read_utterance(TNetLabelRepo *repo, size_t frames, size_t sample_rate, @@ -143,6 +174,10 @@ extern "C" { } void tnet_label_repo_destroy(TNetLabelRepo *repo) { - delete repo; + if (NULL != repo) + { + delete repo; + repo = NULL; + } } } |