14 #ifndef DTOOLBASE_CC_H 15 #define DTOOLBASE_CC_H 27 #include "checkPandaVersion.h" 31 #define __PDT_STDBOOL_H_ 42 #define ALWAYS_INLINE inline 45 #define EXPORT_TEMPLATE_CLASS(expcl, exptp, classname) 50 #define PUBLISHED __published 52 #define PHAVE_ATOMIC 1 54 typedef int ios_openmode;
55 typedef int ios_fmtflags;
56 typedef int ios_iostate;
57 typedef int ios_seekdir;
74 #include "fakestringstream.h" 85 #ifndef HAVE_IOS_TYPEDEFS 86 typedef int ios_openmode;
87 typedef int ios_fmtflags;
88 typedef int ios_iostate;
90 typedef ios::seek_dir ios_seekdir;
92 typedef std::ios::openmode ios_openmode;
93 typedef std::ios::fmtflags ios_fmtflags;
94 typedef std::ios::iostate ios_iostate;
95 typedef std::ios::seekdir ios_seekdir;
99 #define ALWAYS_INLINE __forceinline 100 #elif defined(__GNUC__) 101 #define ALWAYS_INLINE __attribute__((always_inline)) inline 103 #define ALWAYS_INLINE inline 106 #ifdef FORCE_INLINING 110 #define INLINE ALWAYS_INLINE 112 #define INLINE inline 117 #if defined(__GLIBCXX__) && __GLIBCXX__ <= 20070719 122 using std::tr1::tuple;
124 using std::tr1::copysign;
126 typedef decltype(
nullptr) nullptr_t;
128 template<class T> struct remove_reference {
typedef T type;};
129 template<
class T>
struct remove_reference<T&> {
typedef T type;};
130 template<
class T>
struct remove_reference<T&& >{
typedef T type;};
132 template<
class T>
typename remove_reference<T>::type &&move(T &&t) {
133 return static_cast<typename remove_reference<T>::type&&
>(t);
136 template<
class T>
struct owner_less;
138 typedef enum memory_order {
139 memory_order_relaxed,
140 memory_order_consume,
141 memory_order_acquire,
142 memory_order_release,
143 memory_order_acq_rel,
144 memory_order_seq_cst,
147 #define ATOMIC_FLAG_INIT { 0 } 152 atomic_flag() noexcept = default;
153 ALWAYS_INLINE constexpr atomic_flag(
bool flag) noexcept : _flag(flag) {}
154 atomic_flag(
const atomic_flag &) =
delete;
155 ~atomic_flag() noexcept = default;
156 atomic_flag &operator = (const atomic_flag&) = delete;
158 ALWAYS_INLINE
bool test_and_set(memory_order order = memory_order_seq_cst) noexcept {
159 return __atomic_test_and_set(&_flag, order);
161 ALWAYS_INLINE
void clear(memory_order order = memory_order_seq_cst) noexcept {
162 __atomic_clear(&_flag, order);
168 #define PHAVE_ATOMIC 1 172 #if defined(_MSC_VER) && _MSC_VER < 1900 // Visual Studio 2015 173 #error Microsoft Visual C++ 2015 or later is required to compile Panda3D. 177 #define MOVE(x) (std::move(x)) 180 #ifndef LINK_ALL_STATIC 185 #define EXPORT_TEMPLATE_CLASS(expcl, exptp, classname) \ 186 exptp template class expcl classname; 188 #define EXPORT_TEMPLATE_CLASS(expcl, exptp, classname) 194 #define PUBLISHED public 205 EXPCL_DTOOL_DTOOLBASE
extern MemoryHook *memory_hook;
209 #ifndef USE_MEMORY_NOWRAPPERS 210 #define PANDA_MALLOC_SINGLE(size) (ASSUME_ALIGNED(memory_hook->heap_alloc_single(size), MEMORY_HOOK_ALIGNMENT)) 211 #define PANDA_FREE_SINGLE(ptr) memory_hook->heap_free_single(ptr) 212 #define PANDA_MALLOC_ARRAY(size) (ASSUME_ALIGNED(memory_hook->heap_alloc_array(size), MEMORY_HOOK_ALIGNMENT)) 213 #define PANDA_REALLOC_ARRAY(ptr, size) (ASSUME_ALIGNED(memory_hook->heap_realloc_array(ptr, size), MEMORY_HOOK_ALIGNMENT)) 214 #define PANDA_FREE_ARRAY(ptr) memory_hook->heap_free_array(ptr) 216 #define PANDA_MALLOC_SINGLE(size) ::malloc(size) 217 #define PANDA_FREE_SINGLE(ptr) ::free(ptr) 218 #define PANDA_MALLOC_ARRAY(size) ::malloc(size) 219 #define PANDA_REALLOC_ARRAY(ptr, size) ::realloc(ptr, size) 220 #define PANDA_FREE_ARRAY(ptr) ::free(ptr) 221 #endif // USE_MEMORY_NOWRAPPERS 223 #if defined(HAVE_THREADS) && defined(SIMPLE_THREADS) 226 extern EXPCL_DTOOL_DTOOLBASE void (*global_thread_yield)();
227 extern EXPCL_DTOOL_DTOOLBASE void (*global_thread_consider_yield)();
229 INLINE
void thread_yield() {
230 (*global_thread_yield)();
232 INLINE
void thread_consider_yield() {
233 (*global_thread_consider_yield)();
237 typedef struct _ts PyThreadState;
238 extern EXPCL_DTOOL_DTOOLBASE PyThreadState *(*global_thread_state_swap)(PyThreadState *tstate);
240 INLINE PyThreadState *thread_state_swap(PyThreadState *tstate) {
241 return (*global_thread_state_swap)(tstate);
243 #endif // HAVE_PYTHON 247 INLINE
void thread_yield() {
249 INLINE
void thread_consider_yield() {
252 #endif // HAVE_THREADS && SIMPLE_THREADS 254 #if defined(USE_TAU) && defined(WIN32) 256 extern EXPCL_DTOOL_DTOOLBASE
bool __tau_shutdown;
257 class EXPCL_DTOOL_DTOOLBASE TauProfile {
259 TauProfile(
void *&tautimer,
char *name,
char *type,
int group,
char *group_name) {
260 Tau_profile_c_timer(&tautimer, name, type, group, group_name);
261 _tautimer = tautimer;
262 TAU_PROFILE_START(_tautimer);
265 if (!__tau_shutdown) {
266 TAU_PROFILE_STOP(_tautimer);
275 #define TAU_PROFILE(name, type, group) \ 276 static void *__tautimer; \ 277 TauProfile __taupr(__tautimer, name, type, group, #group) 279 #undef TAU_PROFILE_EXIT 280 #define TAU_PROFILE_EXIT(msg) \ 281 __tau_shutdown = true; \ 286 #endif // __cplusplus
A base class for all things that want to be reference-counted.
This class provides a wrapper around the various possible malloc schemes Panda might employ.