diff --git a/c_src/eLfq/eLfq.cc b/c_src/eLfq/eLfq.cc index 886535c..df4385f 100644 --- a/c_src/eLfq/eLfq.cc +++ b/c_src/eLfq/eLfq.cc @@ -76,6 +76,9 @@ ERL_NIF_TERM nifNew(ErlNifEnv *env, int, const ERL_NIF_TERM *) { if (ObjIns == NULL) return atomNewErr; + if (*ObjIns == NULL) + return atomNewErr; + ERL_NIF_TERM RefTerm = enif_make_resource(env, ObjIns); enif_release_resource(ObjIns); return enif_make_tuple2(env, atomOk, RefTerm); @@ -90,13 +93,16 @@ ERL_NIF_TERM nifDel1(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]) { return enif_make_badarg(env); } - if (NULL != ObjIns) { - ErlNifBinary TermBin; - while ((*ObjIns)->try_dequeue(TermBin)) { - enif_release_binary(&TermBin); + 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]); } - delete ObjIns; + delete (*ObjIns); + *ObjIns = NULL; } return atomOk; @@ -107,7 +113,7 @@ ERL_NIF_TERM nifIn2(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]) { lfqIns *ObjIns = NULL; - if (!enif_get_resource(env, argv[0], ResIns, (void **) &ObjIns)) { + if (!enif_get_resource(env, argv[0], ResIns, (void **) &ObjIns) || NULL == *ObjIns) { return enif_make_badarg(env); } @@ -128,7 +134,7 @@ ERL_NIF_TERM nifIns2(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]) { lfqIns *ObjIns = NULL; - if (!enif_get_resource(env, argv[0], ResIns, (void **) &ObjIns)) { + if (!enif_get_resource(env, argv[0], ResIns, (void **) &ObjIns) || NULL == *ObjIns) { return enif_make_badarg(env); } @@ -171,7 +177,7 @@ ERL_NIF_TERM nifTryOut1(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]) { ErlNifResourceType *ResIns = static_cast(enif_priv_data(env)); lfqIns *ObjIns = NULL; - if (!enif_get_resource(env, argv[0], ResIns, (void **) &ObjIns)) { + if (!enif_get_resource(env, argv[0], ResIns, (void **) &ObjIns) || NULL == *ObjIns) { return enif_make_badarg(env); } @@ -195,7 +201,7 @@ ERL_NIF_TERM nifTryOuts2(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]) { ErlNifResourceType *ResIns = static_cast(enif_priv_data(env)); lfqIns *ObjIns = NULL; - if (!enif_get_resource(env, argv[0], ResIns, (void **) &ObjIns)) { + if (!enif_get_resource(env, argv[0], ResIns, (void **) &ObjIns) || NULL == *ObjIns) { return enif_make_badarg(env); } @@ -225,7 +231,7 @@ ERL_NIF_TERM nifSize1(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]) { ErlNifResourceType *ResIns = static_cast(enif_priv_data(env)); lfqIns *ObjIns = NULL; - if (!enif_get_resource(env, argv[0], ResIns, (void **) &ObjIns)) { + if (!enif_get_resource(env, argv[0], ResIns, (void **) &ObjIns) || NULL == *ObjIns) { return enif_make_badarg(env); }