+ return std::unique_ptr<char, std::function<void(char*)>>(xbt_strdup(name), &xbt_free_f);
+}
+
+class BacktraceImpl {
+ short refcount_ = 1;
+
+public:
+ void ref() { refcount_++; }
+ bool unref()
+ {
+ refcount_--;
+ if (refcount_ == 0) {
+ delete this;
+ return true;
+ } else {
+ return false;
+ }
+ }
+#if HAVE_BOOST_STACKTRACE_BACKTRACE || HAVE_BOOST_STACKTRACE_ADDR2LINE
+ boost::stacktrace::stacktrace st;
+#endif
+};
+
+Backtrace::Backtrace()
+{
+#if HAVE_BOOST_STACKTRACE_BACKTRACE || HAVE_BOOST_STACKTRACE_ADDR2LINE
+ impl_ = new BacktraceImpl();
+ impl_->st = boost::stacktrace::stacktrace();
+#endif
+}
+Backtrace::Backtrace(const Backtrace& bt)
+{
+ impl_ = bt.impl_;
+ if (impl_)
+ impl_->ref();