summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/dll/example/tutorial6
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
commit483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch)
treee5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/boost/libs/dll/example/tutorial6
parentInitial commit. (diff)
downloadceph-upstream.tar.xz
ceph-upstream.zip
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/dll/example/tutorial6')
-rw-r--r--src/boost/libs/dll/example/tutorial6/on_unload_lib.cpp48
-rw-r--r--src/boost/libs/dll/example/tutorial6/tutorial6.cpp39
2 files changed, 87 insertions, 0 deletions
diff --git a/src/boost/libs/dll/example/tutorial6/on_unload_lib.cpp b/src/boost/libs/dll/example/tutorial6/on_unload_lib.cpp
new file mode 100644
index 00000000..f09ede95
--- /dev/null
+++ b/src/boost/libs/dll/example/tutorial6/on_unload_lib.cpp
@@ -0,0 +1,48 @@
+// Copyright 2014 Renato Tegon Forti, Antony Polukhin.
+// Copyright 2015-2019 Antony Polukhin.
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// MinGW related workaround
+#define BOOST_DLL_FORCE_ALIAS_INSTANTIATION
+
+//[plugcpp_on_unload
+#include <boost/dll/alias.hpp> // for BOOST_DLL_ALIAS
+#include <boost/function.hpp>
+#include <vector>
+
+namespace my_namespace {
+
+struct on_unload {
+ typedef boost::function<void()> callback_t;
+ typedef on_unload this_type;
+
+ ~on_unload() {
+ for (std::size_t i = 0; i < callbacks_.size(); ++i) {
+ callback_t& function = callbacks_[i];
+ function(); // calling the callback
+ }
+ }
+
+ // not thread safe
+ static void add(const callback_t& function) {
+ static this_type instance;
+ instance.callbacks_.push_back(function);
+ }
+
+private:
+ std::vector<callback_t> callbacks_;
+ on_unload() {} // prohibit construction outside of the `add` function
+};
+
+// Exporting the static "add" function with name "on_unload"
+BOOST_DLL_ALIAS(my_namespace::on_unload::add, on_unload)
+
+} // namespace my_namespace
+
+//]
+
+
+
diff --git a/src/boost/libs/dll/example/tutorial6/tutorial6.cpp b/src/boost/libs/dll/example/tutorial6/tutorial6.cpp
new file mode 100644
index 00000000..87003f02
--- /dev/null
+++ b/src/boost/libs/dll/example/tutorial6/tutorial6.cpp
@@ -0,0 +1,39 @@
+// Copyright 2014 Renato Tegon Forti, Antony Polukhin.
+// Copyright 2015-2019 Antony Polukhin.
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include "../b2_workarounds.hpp"
+
+//[callplugcpp_tutorial6
+#include <boost/dll/import.hpp>
+#include <boost/function.hpp>
+#include <iostream>
+
+typedef boost::function<void()> callback_t;
+
+void print_unloaded() {
+ std::cout << "unloaded" << std::endl;
+}
+
+int main(int argc, char* argv[]) {
+ // argv[1] contains full path to our plugin library
+ boost::dll::fs::path shared_library_path = /*<-*/ b2_workarounds::first_lib_from_argv(argc, argv); /*->*/ //=argv[1];
+
+ // loading library and getting a function from it
+ boost::function<void(const callback_t&)> on_unload
+ = boost::dll::import_alias<void(const callback_t&)>(
+ shared_library_path, "on_unload"
+ );
+
+ on_unload(&print_unloaded); // adding a callback
+ std::cout << "Before library unload." << std::endl;
+
+ // Releasing last reference to the library, so that it gets unloaded
+ on_unload.clear();
+ std::cout << "After library unload." << std::endl;
+}
+//]
+