diff --git a/c_src/eLfq/eLfq.cc b/c_src/eLfq/eLfq.cc index bb0bec9..1c15299 100644 --- a/c_src/eLfq/eLfq.cc +++ b/c_src/eLfq/eLfq.cc @@ -18,6 +18,8 @@ struct NifTraits : public moodycamel::ConcurrentQueueDefaultTraits { using lfqIns = moodycamel::ConcurrentQueue *; +const size_t BulkDelCnt = 200; + ERL_NIF_TERM atomOk; ERL_NIF_TERM atomError; ERL_NIF_TERM atomNewErr; @@ -27,13 +29,19 @@ ERL_NIF_TERM atomEmpty; void eLfqFree(ErlNifEnv *, void *obj) { lfqIns *ObjIns = static_cast(obj); - if (ObjIns != nullptr) { - ErlNifBinary TermBin; - while ((*ObjIns)->try_dequeue(TermBin)) { - enif_release_binary(&TermBin); - } - delete ObjIns; + if (NULL != ObjIns && NULL != *ObjIns) { + std::vector TermBinList(BulkDelCnt); + size_t OutSize; + do{ + OutSize = (*ObjIns)->try_dequeue_bulk(TermBinList.begin(), TermBinList.size()); + for (int i = OutSize - 1; i >= 0; i--) { + enif_release_binary(&TermBinList[i]); + } + }while(OutSize >= BulkDelCnt); + + delete (*ObjIns); + *ObjIns = NULL; } } @@ -95,12 +103,14 @@ ERL_NIF_TERM nifDel1(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]) { } if (NULL != ObjIns && NULL != *ObjIns) { - std::vector TermBinList(20); - size_t OutSize = (*ObjIns)->try_dequeue_bulk(TermBinList.begin(), TermBinList.size()); - - for (int i = OutSize - 1; i >= 0; i--) { - enif_release_binary(&TermBinList[i]); - } + std::vector TermBinList(BulkDelCnt); + size_t OutSize; + do{ + OutSize = (*ObjIns)->try_dequeue_bulk(TermBinList.begin(), TermBinList.size()); + for (int i = OutSize - 1; i >= 0; i--) { + enif_release_binary(&TermBinList[i]); + } + }while(OutSize >= BulkDelCnt); delete (*ObjIns); *ObjIns = NULL;