diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
commit | 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch) | |
tree | e5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/boost/libs/dll/example/tutorial6 | |
parent | Initial commit. (diff) | |
download | ceph-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.cpp | 48 | ||||
-rw-r--r-- | src/boost/libs/dll/example/tutorial6/tutorial6.cpp | 39 |
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; +} +//] + |