From 9c4173a8b5d8ee9485b0df834ae5b0ee6433cbd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franz=20P=C3=B6schel?= Date: Tue, 5 Apr 2022 19:50:39 +0200 Subject: [PATCH] Increase reference count also in other load_chunk overload (#1225) * Increase reference count also in other load_chunk overload Don't know if it is necessary, but looks like we forgot it earlier * Add comment Co-authored-by: Axel Huebl --- src/binding/python/RecordComponent.cpp | 62 +++++++++++++------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/src/binding/python/RecordComponent.cpp b/src/binding/python/RecordComponent.cpp index 2006f7cf6a..272b6b27cd 100644 --- a/src/binding/python/RecordComponent.cpp +++ b/src/binding/python/RecordComponent.cpp @@ -539,53 +539,55 @@ 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); + 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'!"));