From c93d42ef84b8fd682de55f32285bdedd61aab91a Mon Sep 17 00:00:00 2001 From: SisMaker <1713699517@qq.com> Date: Sat, 29 Jan 2022 12:57:27 +0800 Subject: [PATCH] =?UTF-8?q?fx:=20=E4=BF=AE=E5=A4=8D=E9=98=9F=E5=88=97?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E7=9A=84=E9=87=8A=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- c_src/eLfq/eLfq.cc | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) 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;