From 76eddd875521d3c43d678c24a5aa8c00a63b29e2 Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Fri, 18 Feb 2022 12:54:27 -0800 Subject: [PATCH 1/2] Increase reference count also in other load_chunk overload Don't know if it is necessary, but looks like we forgot it earlier --- src/binding/python/RecordComponent.cpp | 58 +++++++++++++------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/src/binding/python/RecordComponent.cpp b/src/binding/python/RecordComponent.cpp index 2006f7cf6a..23de7da58c 100644 --- a/src/binding/python/RecordComponent.cpp +++ b/src/binding/python/RecordComponent.cpp @@ -539,53 +539,51 @@ void load_chunk( } } + auto load_data = + [&r, &buffer, &buffer_info, &offset, &extent](auto cxxtype) { + using CXXType = decltype(cxxtype); + buffer.inc_ref(); + // buffer_info.inc_ref(); + void *data = buffer_info.ptr; + std::shared_ptr shared( + (CXXType *)data, [buffer](CXXType *) { buffer.dec_ref(); }); + r.loadChunk(std::move(shared), offset, extent); + }; + if (r.getDatatype() == Datatype::CHAR) - r.loadChunk(shareRaw((char *)buffer_info.ptr), offset, extent); + load_data((char)0); else if (r.getDatatype() == Datatype::UCHAR) - r.loadChunk( - shareRaw((unsigned char *)buffer_info.ptr), offset, extent); + load_data((unsigned char)0); else if (r.getDatatype() == Datatype::SHORT) - r.loadChunk(shareRaw((short *)buffer_info.ptr), offset, extent); + load_data((short)0); else if (r.getDatatype() == Datatype::INT) - r.loadChunk(shareRaw((int *)buffer_info.ptr), offset, extent); + load_data((int)0); else if (r.getDatatype() == Datatype::LONG) - r.loadChunk(shareRaw((long *)buffer_info.ptr), offset, extent); + load_data((long)0); else if (r.getDatatype() == Datatype::LONGLONG) - r.loadChunk( - shareRaw((long long *)buffer_info.ptr), offset, extent); + load_data((long long)0); else if (r.getDatatype() == Datatype::USHORT) - r.loadChunk( - shareRaw((unsigned short *)buffer_info.ptr), offset, extent); + load_data((unsigned short)0); else if (r.getDatatype() == Datatype::UINT) - r.loadChunk( - shareRaw((unsigned int *)buffer_info.ptr), offset, extent); + load_data((unsigned int)0); else if (r.getDatatype() == Datatype::ULONG) - r.loadChunk( - shareRaw((unsigned long *)buffer_info.ptr), offset, extent); + load_data((unsigned long)0); else if (r.getDatatype() == Datatype::ULONGLONG) - r.loadChunk( - shareRaw((unsigned long long *)buffer_info.ptr), offset, extent); + load_data((unsigned long long)0); else if (r.getDatatype() == Datatype::LONG_DOUBLE) - r.loadChunk( - shareRaw((long double *)buffer_info.ptr), offset, extent); + load_data((long double)0); else if (r.getDatatype() == Datatype::DOUBLE) - r.loadChunk( - shareRaw((double *)buffer_info.ptr), offset, extent); + load_data((double)0); else if (r.getDatatype() == Datatype::FLOAT) - r.loadChunk(shareRaw((float *)buffer_info.ptr), offset, extent); + load_data((float)0); else if (r.getDatatype() == Datatype::CLONG_DOUBLE) - r.loadChunk>( - shareRaw((std::complex *)buffer_info.ptr), - offset, - extent); + load_data((std::complex)0); else if (r.getDatatype() == Datatype::CDOUBLE) - r.loadChunk>( - shareRaw((std::complex *)buffer_info.ptr), offset, extent); + load_data((std::complex)0); else if (r.getDatatype() == Datatype::CFLOAT) - r.loadChunk>( - shareRaw((std::complex *)buffer_info.ptr), offset, extent); + load_data((std::complex)0); else if (r.getDatatype() == Datatype::BOOL) - r.loadChunk(shareRaw((bool *)buffer_info.ptr), offset, extent); + load_data((bool)0); else throw std::runtime_error( std::string("Datatype not known in 'loadChunk'!")); From 3d52992b0466976ee34a8abbd8fdbb5f238a6e56 Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Sun, 13 Mar 2022 19:28:32 -0700 Subject: [PATCH 2/2] Add comment --- src/binding/python/RecordComponent.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/binding/python/RecordComponent.cpp b/src/binding/python/RecordComponent.cpp index 23de7da58c..272b6b27cd 100644 --- a/src/binding/python/RecordComponent.cpp +++ b/src/binding/python/RecordComponent.cpp @@ -539,6 +539,10 @@ void load_chunk( } } + // here, we increase a reference on the user-passed data so that + // temporary and lost-scope variables stay alive until we flush + // note: this does not yet prevent the user, as in C++, to build + // a race condition by manipulating the data they passed auto load_data = [&r, &buffer, &buffer_info, &offset, &extent](auto cxxtype) { using CXXType = decltype(cxxtype);