#ifndef THDP_COPY_UTILS_H #define THDP_COPY_UTILS_H extern THDTensorDescriptor* THDPModule_makeDescriptor(PyObject *obj); template void THDPInsertCopyFunctionFromWorker( THPCopyList& copyList, void (*copyFunc)(THDTensorDescriptor* x, TensorSrc *z)) { auto wrapper = [copyFunc](PyObject* dst_, PyObject* src_) { TensorSrc* src = THPTypeInfo::cdata(src_); PyThreadState *_save = nullptr; try { Py_UNBLOCK_THREADS; copyFunc(LIBRARY_STATE THDPModule_makeDescriptor(dst_), src); Py_BLOCK_THREADS; } catch (...) { if (_save) { Py_BLOCK_THREADS; } throw; } }; PyTypeObject* srcType = THPTypeInfo::pyType(); copyList.push_back({ srcType, wrapper, false }); } template void THDPInsertCopyFunctionFromMaster( THPCopyList& copyList, void (*copyFunc)(TensorDst *x, THDTensorDescriptor* z), PyTypeObject *srcType) { auto wrapper = [copyFunc](PyObject* dst_, PyObject* src_) { TensorDst* dst = THPTypeInfo::cdata(dst_); PyThreadState *_save = nullptr; try { Py_UNBLOCK_THREADS; copyFunc(LIBRARY_STATE dst, THDPModule_makeDescriptor(src_)); Py_BLOCK_THREADS; } catch (...) { if (_save) { Py_BLOCK_THREADS; } throw; } }; copyList.push_back({ srcType, wrapper, false }); } #endif