From 6d09f70367d7d49b187416ac268e52457ddb7d2a Mon Sep 17 00:00:00 2001 From: Simon Hailes Date: Fri, 10 Nov 2017 14:07:20 +0000 Subject: [PATCH] opencv:readimage Async - change newed mat to local class to try to prevent mem leak; also try-catch to signal failure through callback --- src/OpenCV.cc | 49 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/src/OpenCV.cc b/src/OpenCV.cc index ab8c8a5..6e8447d 100755 --- a/src/OpenCV.cc +++ b/src/OpenCV.cc @@ -24,30 +24,54 @@ public: Nan::AsyncWorker(callback), buf(buf), len(len), - flags(flags){ + flags(flags), + success(0){ } ~AsyncImDecodeWorker() { } void Execute() { -// Local img_to_return = - // Nan::NewInstance(Nan::GetFunction(Nan::New(Matrix::constructor)).ToLocalChecked()).ToLocalChecked(); - // img = Nan::ObjectWrap::Unwrap(img_to_return); - cv::Mat *mbuf = new cv::Mat(len, 1, CV_64FC1, buf); - outputmat = cv::imdecode(*mbuf, flags); + try{ + // don't new; just have a local class which will be removed. + cv::Mat mbuf(len, 1, CV_64FC1, buf); + outputmat = cv::imdecode(mbuf, flags); + success = 1; + } catch(...){ + success = 0; + } } void HandleOKCallback() { - Nan::HandleScope scope; + + if (success){ + Nan::HandleScope scope; - Local im_to_return= Nan::NewInstance(Nan::GetFunction(Nan::New(Matrix::constructor)).ToLocalChecked()).ToLocalChecked(); - Matrix *img = Nan::ObjectWrap::Unwrap(im_to_return); - img->mat = outputmat; + try{ + Local im_to_return= Nan::NewInstance(Nan::GetFunction(Nan::New(Matrix::constructor)).ToLocalChecked()).ToLocalChecked(); + Matrix *img = Nan::ObjectWrap::Unwrap(im_to_return); + img->mat = outputmat; + + Local argv[] = { + Nan::Null(), + im_to_return + }; + + Nan::TryCatch try_catch; + callback->Call(2, argv); + if (try_catch.HasCaught()) { + Nan::FatalException(try_catch); + } + return; + } catch (...){ + + } + } + // fall through here is !success or failed trying to callback. Local argv[] = { - Nan::Null(), - im_to_return + Nan::New("C++ exception executing imdecode").ToLocalChecked(), // err + Nan::Null() }; Nan::TryCatch try_catch; @@ -62,6 +86,7 @@ private: unsigned len; int flags; cv::Mat outputmat; + int success; //Matrix *img; };