Skip to content

Commit

Permalink
Increase reference count also in other load_chunk overload (#1225)
Browse files Browse the repository at this point in the history
* 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 <axel.huebl@plasma.ninja>
  • Loading branch information
franzpoeschel and ax3l authored Apr 5, 2022
1 parent 29bb474 commit 9c4173a
Showing 1 changed file with 32 additions and 30 deletions.
62 changes: 32 additions & 30 deletions src/binding/python/RecordComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<CXXType> shared(
(CXXType *)data, [buffer](CXXType *) { buffer.dec_ref(); });
r.loadChunk(std::move(shared), offset, extent);
};

if (r.getDatatype() == Datatype::CHAR)
r.loadChunk<char>(shareRaw((char *)buffer_info.ptr), offset, extent);
load_data((char)0);
else if (r.getDatatype() == Datatype::UCHAR)
r.loadChunk<unsigned char>(
shareRaw((unsigned char *)buffer_info.ptr), offset, extent);
load_data((unsigned char)0);
else if (r.getDatatype() == Datatype::SHORT)
r.loadChunk<short>(shareRaw((short *)buffer_info.ptr), offset, extent);
load_data((short)0);
else if (r.getDatatype() == Datatype::INT)
r.loadChunk<int>(shareRaw((int *)buffer_info.ptr), offset, extent);
load_data((int)0);
else if (r.getDatatype() == Datatype::LONG)
r.loadChunk<long>(shareRaw((long *)buffer_info.ptr), offset, extent);
load_data((long)0);
else if (r.getDatatype() == Datatype::LONGLONG)
r.loadChunk<long long>(
shareRaw((long long *)buffer_info.ptr), offset, extent);
load_data((long long)0);
else if (r.getDatatype() == Datatype::USHORT)
r.loadChunk<unsigned short>(
shareRaw((unsigned short *)buffer_info.ptr), offset, extent);
load_data((unsigned short)0);
else if (r.getDatatype() == Datatype::UINT)
r.loadChunk<unsigned int>(
shareRaw((unsigned int *)buffer_info.ptr), offset, extent);
load_data((unsigned int)0);
else if (r.getDatatype() == Datatype::ULONG)
r.loadChunk<unsigned long>(
shareRaw((unsigned long *)buffer_info.ptr), offset, extent);
load_data((unsigned long)0);
else if (r.getDatatype() == Datatype::ULONGLONG)
r.loadChunk<unsigned long long>(
shareRaw((unsigned long long *)buffer_info.ptr), offset, extent);
load_data((unsigned long long)0);
else if (r.getDatatype() == Datatype::LONG_DOUBLE)
r.loadChunk<long double>(
shareRaw((long double *)buffer_info.ptr), offset, extent);
load_data((long double)0);
else if (r.getDatatype() == Datatype::DOUBLE)
r.loadChunk<double>(
shareRaw((double *)buffer_info.ptr), offset, extent);
load_data((double)0);
else if (r.getDatatype() == Datatype::FLOAT)
r.loadChunk<float>(shareRaw((float *)buffer_info.ptr), offset, extent);
load_data((float)0);
else if (r.getDatatype() == Datatype::CLONG_DOUBLE)
r.loadChunk<std::complex<long double>>(
shareRaw((std::complex<long double> *)buffer_info.ptr),
offset,
extent);
load_data((std::complex<long double>)0);
else if (r.getDatatype() == Datatype::CDOUBLE)
r.loadChunk<std::complex<double>>(
shareRaw((std::complex<double> *)buffer_info.ptr), offset, extent);
load_data((std::complex<double>)0);
else if (r.getDatatype() == Datatype::CFLOAT)
r.loadChunk<std::complex<float>>(
shareRaw((std::complex<float> *)buffer_info.ptr), offset, extent);
load_data((std::complex<float>)0);
else if (r.getDatatype() == Datatype::BOOL)
r.loadChunk<bool>(shareRaw((bool *)buffer_info.ptr), offset, extent);
load_data((bool)0);
else
throw std::runtime_error(
std::string("Datatype not known in 'loadChunk'!"));
Expand Down

0 comments on commit 9c4173a

Please sign in to comment.