summaryrefslogtreecommitdiff
path: root/src/runtime/c
diff options
context:
space:
mode:
authorkrasimir <krasimir@chalmers.se>2017-05-04 08:29:51 +0000
committerkrasimir <krasimir@chalmers.se>2017-05-04 08:29:51 +0000
commit7dd171cdcc008c341c8e1cbc96143c25ffb01357 (patch)
treee248dcde1aa33f028719e32f32974aa6304c0e61 /src/runtime/c
parenta05194a350b12f49f41c8a9d7971a55fa0f78e60 (diff)
optimize memory allocation in the lookup by using worker pools
Diffstat (limited to 'src/runtime/c')
-rw-r--r--src/runtime/c/pgf/lookup.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/runtime/c/pgf/lookup.c b/src/runtime/c/pgf/lookup.c
index 5f2b3aff3..70d936f08 100644
--- a/src/runtime/c/pgf/lookup.c
+++ b/src/runtime/c/pgf/lookup.c
@@ -318,9 +318,9 @@ static GuBuf*
pgf_lookup_merge(PgfMetaId cat_id1, GuBuf* spine1,
PgfMetaId cat_id2, GuBuf* spine2,
PgfMetaId* cat_id,
- GuPool* pool)
+ GuPool* pool, GuPool* out_pool)
{
- GuBuf* spine = gu_new_buf(GuBuf*, pool);
+ GuBuf* spine = gu_new_buf(GuBuf*, out_pool);
gu_buf_push(spine, GuBuf*, NULL);
GuMap* pairs = gu_new_map(PgfPair, pgf_pair_hasher, PgfMetaId, &gu_null_struct, pool);
@@ -329,7 +329,7 @@ pgf_lookup_merge(PgfMetaId cat_id1, GuBuf* spine1,
pgf_lookup_merge_cats(spine, pairs,
cat_id1, spine1,
cat_id2, spine2,
- pool);
+ out_pool);
return spine;
}
@@ -369,8 +369,10 @@ pgf_lookup_sentence(PgfConcr* concr, PgfType* typ, GuString sentence, GuPool* po
}
///////////////////////////////
+ GuPool *work_pool = gu_new_pool();
+
PgfMetaId cat_id1 = 0;
- GuBuf* join = gu_new_buf(GuBuf*, pool);
+ GuBuf* join = gu_new_buf(GuBuf*, work_pool);
gu_buf_push(join, GuBuf*, NULL);
GuUCS c = ' ';
@@ -389,7 +391,7 @@ pgf_lookup_sentence(PgfConcr* concr, PgfType* typ, GuString sentence, GuPool* po
const uint8_t* end = p-1;
size_t len = end-start;
- GuString tok = gu_malloc(pool, len+1);
+ GuString tok = gu_malloc(work_pool, len+1);
memcpy((uint8_t*) tok, start, len);
((uint8_t*) tok)[len] = 0;
@@ -397,9 +399,15 @@ pgf_lookup_sentence(PgfConcr* concr, PgfType* typ, GuString sentence, GuPool* po
GuBuf* spine =
pgf_lookup_build_spine(lexicon_idx, function_idx,
tok, typ, &cat_id2,
- pool);
+ work_pool);
- join = pgf_lookup_merge(cat_id1, join, cat_id2, spine, &cat_id1, pool);
+ GuPool *work_pool2 = gu_new_pool();
+
+ join = pgf_lookup_merge(cat_id1, join, cat_id2, spine, &cat_id1, work_pool, work_pool2);
+
+ gu_pool_free(work_pool);
+
+ work_pool = work_pool2;
}
#ifdef PGF_LOOKUP_DEBUG
@@ -411,5 +419,7 @@ pgf_lookup_sentence(PgfConcr* concr, PgfType* typ, GuString sentence, GuPool* po
gu_pool_free(tmp_pool);
#endif
+ gu_pool_free(work_pool);
+
return NULL;
}