pytorch/torch/csrc/utils/object_ptr.h
Escapeqyq 3112d2a2b6 Export function symbols to enable Windows build of Intel Extension for PyTorch (#98054)
This PR is to export specific function symbols into .dll shared library on Windows platform to support Windows build for [Intel Extension for PyTorch](https://github.com/intel/intel-extension-for-pytorch).
TORCH_API/TORCH_PYTHON_API/PYBIND11_EXPORT are macros that decorate the function as dllexport while compilation, so that the function symbol will be exported into the .dll shared library file on Windows platform. It is necessary for other libraries (such as IPEX) to import and call these functions through dynamic linking of PyTorch on Windows platform.
The code changes of this PR adds decorators to export specific functions used by IPEX.
Pull Request resolved: https://github.com/pytorch/pytorch/pull/98054
Approved by: https://github.com/ezyang
2023-04-05 23:23:18 +00:00

71 lines
1.5 KiB
C++

#pragma once
#include <torch/csrc/Export.h>
#include <torch/csrc/python_headers.h>
template <class T>
class TORCH_PYTHON_API THPPointer {
public:
THPPointer() : ptr(nullptr){};
explicit THPPointer(T* ptr) noexcept : ptr(ptr){};
THPPointer(THPPointer&& p) noexcept {
free();
ptr = p.ptr;
p.ptr = nullptr;
};
~THPPointer() {
free();
};
T* get() {
return ptr;
}
const T* get() const {
return ptr;
}
T* release() {
T* tmp = ptr;
ptr = nullptr;
return tmp;
}
operator T*() {
return ptr;
}
THPPointer& operator=(T* new_ptr) noexcept {
free();
ptr = new_ptr;
return *this;
}
THPPointer& operator=(THPPointer&& p) noexcept {
free();
ptr = p.ptr;
p.ptr = nullptr;
return *this;
}
T* operator->() {
return ptr;
}
explicit operator bool() const {
return ptr != nullptr;
}
private:
void free();
T* ptr = nullptr;
};
/**
* An RAII-style, owning pointer to a PyObject. You must protect
* destruction of this object with the GIL.
*
* WARNING: Think twice before putting this as a field in a C++
* struct. This class does NOT take out the GIL on destruction,
* so if you will need to ensure that the destructor of your struct
* is either (a) always invoked when the GIL is taken or (b) takes
* out the GIL itself. Easiest way to avoid this problem is to
* not use THPPointer in this situation.
*/
using THPObjectPtr = THPPointer<PyObject>;
using THPCodeObjectPtr = THPPointer<PyCodeObject>;
using THPFrameObjectPtr = THPPointer<PyFrameObject>;