diff --git a/sprokit/src/bindings/python/modules/registration.cxx b/sprokit/src/bindings/python/modules/registration.cxx index 5b812ee2a1..c8deaea6e5 100644 --- a/sprokit/src/bindings/python/modules/registration.cxx +++ b/sprokit/src/bindings/python/modules/registration.cxx @@ -40,6 +40,7 @@ #endif #include +#include #include #include #include @@ -80,6 +81,9 @@ class scoped_save_thread }; +static sprokit::python::pyoptions options; + + // ================================================================== /** * @brief Python module loader. diff --git a/sprokit/src/bindings/python/sprokit/pipeline/config.cxx b/sprokit/src/bindings/python/sprokit/pipeline/config.cxx index d2e0574ee4..7cd68de2d9 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline/config.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline/config.cxx @@ -33,6 +33,8 @@ #include #include +#include + #include /** @@ -76,6 +78,9 @@ static void config_delitem( kwiver::vital::config_block_sptr self, kwiver::vital::config_block_key_t const& key ); +static sprokit::python::pyoptions options; + + PYBIND11_MODULE(config, m) { m.def("empty_config", &kwiver::vital::config_block::empty_config diff --git a/sprokit/src/bindings/python/sprokit/pipeline/datum.cxx b/sprokit/src/bindings/python/sprokit/pipeline/datum.cxx index 7521578010..973dd0681f 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline/datum.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline/datum.cxx @@ -41,6 +41,7 @@ #include +#include #include // Type conversions @@ -86,6 +87,9 @@ template T datum_get_object(sprokit::datum &); char const* sprokit_datum_PyCapsule_name() { return "sprokit::datum"; } +static sprokit::python::pyoptions options; + + PYBIND11_MODULE(datum, m) { diff --git a/sprokit/src/bindings/python/sprokit/pipeline/edge.cxx b/sprokit/src/bindings/python/sprokit/pipeline/edge.cxx index 41aa034997..e74f1f1d41 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline/edge.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline/edge.cxx @@ -32,6 +32,7 @@ #include #include +#include #include #include @@ -50,6 +51,8 @@ static void push_datum(sprokit::edge& self, wrap_edge_datum const& datum); static wrap_edge_datum get_datum(sprokit::edge& self); static wrap_edge_datum peek_datum(sprokit::edge& self, pybind11::size_t const& idx); +static sprokit::python::pyoptions options; + PYBIND11_MODULE(edge, m) { class_(m, "EdgeDatum") diff --git a/sprokit/src/bindings/python/sprokit/pipeline/modules.cxx b/sprokit/src/bindings/python/sprokit/pipeline/modules.cxx index a281ef2455..cbfab72b7a 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline/modules.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline/modules.cxx @@ -32,6 +32,8 @@ #include +#include + /** * \file modules.cxx * @@ -49,6 +51,8 @@ void load_known_modules() kwiver::vital::plugin_manager::instance().load_all_plugins(); } +static sprokit::python::pyoptions options; + PYBIND11_MODULE(modules, m) { m.def("load_known_modules", &sprokit::load_known_modules diff --git a/sprokit/src/bindings/python/sprokit/pipeline/pipeline.cxx b/sprokit/src/bindings/python/sprokit/pipeline/pipeline.cxx index 3e0b16a949..3ee7df58e9 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline/pipeline.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline/pipeline.cxx @@ -30,6 +30,7 @@ #include #include +#include #if WIN32 #pragma warning (push) @@ -54,6 +55,8 @@ static std::shared_ptr cluster_by_name(sprokit::pipeline& static std::vector connections_from_addr(sprokit::pipeline& self, sprokit::process::name_t const& name, sprokit::process::port_t const& port); static std::vector receivers_for_port(sprokit::pipeline& self, sprokit::process::name_t const& name, sprokit::process::port_t const& port); +static sprokit::python::pyoptions options; + PYBIND11_MODULE(pipeline,m) { bind_vector >(m, "names_t"); diff --git a/sprokit/src/bindings/python/sprokit/pipeline/process.cxx b/sprokit/src/bindings/python/sprokit/pipeline/process.cxx index 2dd1fcc8d3..7b33537809 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline/process.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline/process.cxx @@ -32,6 +32,7 @@ typedef std::set string_set; // This has to be done first thing, or the macro breaks PYBIND11_MAKE_OPAQUE(string_set) +#include #include #include @@ -155,6 +156,8 @@ void push_datum_to_port(sprokit::process &self, sprokit::process::port_t const& std::string config_value(sprokit::process &self, kwiver::vital::config_block_key_t const& key); +static sprokit::python::pyoptions options; + PYBIND11_MODULE(process, m) { bind_vector(m, "ProcessNames" diff --git a/sprokit/src/bindings/python/sprokit/pipeline/process_cluster.cxx b/sprokit/src/bindings/python/sprokit/pipeline/process_cluster.cxx index 0d2643b7e6..13970e980f 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline/process_cluster.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline/process_cluster.cxx @@ -32,6 +32,7 @@ #include #include +#include #include #include @@ -49,6 +50,8 @@ using namespace pybind11; static object cluster_from_process(sprokit::process_t const& process); +static sprokit::python::pyoptions options; + PYBIND11_MODULE(process_cluster, m) { class_(m, "PythonProcessCluster" diff --git a/sprokit/src/bindings/python/sprokit/pipeline/process_factory.cxx b/sprokit/src/bindings/python/sprokit/pipeline/process_factory.cxx index 109a85d8c7..5d7a0a1567 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline/process_factory.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline/process_factory.cxx @@ -39,6 +39,7 @@ #include #include +#include #include #include @@ -129,6 +130,9 @@ create_object(kwiver::vital::config_block_sptr const& config) } +static sprokit::python::pyoptions options; + + // ================================================================== PYBIND11_MODULE(process_factory, m) { diff --git a/sprokit/src/bindings/python/sprokit/pipeline/scheduler.cxx b/sprokit/src/bindings/python/sprokit/pipeline/scheduler.cxx index 28c08b327a..dc7284d36c 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline/scheduler.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline/scheduler.cxx @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -73,6 +74,8 @@ class scheduler_trampoline void _stop() override; }; +static sprokit::python::pyoptions options; + PYBIND11_MODULE(scheduler, m) { class_(m, "PythonScheduler" diff --git a/sprokit/src/bindings/python/sprokit/pipeline/scheduler_factory.cxx b/sprokit/src/bindings/python/sprokit/pipeline/scheduler_factory.cxx index 4e56a86fef..0bf9fa54b5 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline/scheduler_factory.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline/scheduler_factory.cxx @@ -39,6 +39,7 @@ #include #include +#include #include #include @@ -111,6 +112,9 @@ create_object(sprokit::pipeline_t const& pipe, kwiver::vital::config_block_sptr } +static sprokit::python::pyoptions options; + + //================================================================== PYBIND11_MODULE(scheduler_factory, m) { diff --git a/sprokit/src/bindings/python/sprokit/pipeline/stamp.cxx b/sprokit/src/bindings/python/sprokit/pipeline/stamp.cxx index 1efd340e2f..df1d060715 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline/stamp.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline/stamp.cxx @@ -32,6 +32,8 @@ #include "python_wrappers.cxx" +#include + /** * \file stamp.cxx * @@ -40,6 +42,8 @@ using namespace pybind11; +static sprokit::python::pyoptions options; + PYBIND11_MODULE(stamp, m) { m.def("new_stamp", &new_stamp diff --git a/sprokit/src/bindings/python/sprokit/pipeline/utils.cxx b/sprokit/src/bindings/python/sprokit/pipeline/utils.cxx index f542a3d8f5..73ea15b8bd 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline/utils.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline/utils.cxx @@ -33,6 +33,8 @@ #include +#include + /** * \file utils.cxx * @@ -41,6 +43,8 @@ using namespace pybind11; +static sprokit::python::pyoptions options; + PYBIND11_MODULE(utils, m) { m.def("name_thread", &sprokit::name_thread diff --git a/sprokit/src/bindings/python/sprokit/pipeline/version.cxx b/sprokit/src/bindings/python/sprokit/pipeline/version.cxx index 4fb80d85b3..2f8c672253 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline/version.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline/version.cxx @@ -34,6 +34,8 @@ #include +#include + /** * \file version.cxx @@ -78,6 +80,8 @@ class runtime { }; +static sprokit::python::pyoptions options; + PYBIND11_MODULE(version, m) { class_(m,"compile" diff --git a/sprokit/src/bindings/python/sprokit/pipeline_util/bake.cxx b/sprokit/src/bindings/python/sprokit/pipeline_util/bake.cxx index d4f66c2edd..2520a86aab 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline_util/bake.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline_util/bake.cxx @@ -35,6 +35,7 @@ #include #include +#include #include #include @@ -61,6 +62,8 @@ static sprokit::pipeline_t bake_pipe(object stream); static sprokit::cluster_info_t bake_cluster_file(std::string const& path); static sprokit::cluster_info_t bake_cluster(object stream); +static sprokit::python::pyoptions options; + PYBIND11_MODULE(bake, m) { class_(m, "ClusterInfo" diff --git a/sprokit/src/bindings/python/sprokit/pipeline_util/export.cxx b/sprokit/src/bindings/python/sprokit/pipeline_util/export.cxx index fcd41fd3a6..2f33a01733 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline_util/export.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline_util/export.cxx @@ -33,6 +33,7 @@ #include #include +#include #include #include @@ -50,6 +51,8 @@ using namespace pybind11; void export_dot(object const& stream, sprokit::pipeline_t const pipe, std::string const& graph_name); +static sprokit::python::pyoptions options; + PYBIND11_MODULE(export_, m) { m.def("export_dot", &export_dot, call_guard() diff --git a/sprokit/src/bindings/python/sprokit/pipeline_util/load.cxx b/sprokit/src/bindings/python/sprokit/pipeline_util/load.cxx index ac44bd61b7..2bfd16b319 100644 --- a/sprokit/src/bindings/python/sprokit/pipeline_util/load.cxx +++ b/sprokit/src/bindings/python/sprokit/pipeline_util/load.cxx @@ -35,6 +35,7 @@ #include +#include #include #include @@ -79,6 +80,8 @@ static sprokit::cluster_blocks load_cluster(object const& stream); static std::vector get_targets(sprokit::cluster_input_t const& self); static void set_targets(sprokit::cluster_input_t &self, std::vector const& wrap_targets); +static sprokit::python::pyoptions options; + PYBIND11_MODULE(load, m) { bind_vector(m, "ConfigFlags" diff --git a/sprokit/src/sprokit/python/util/CMakeLists.txt b/sprokit/src/sprokit/python/util/CMakeLists.txt index d3b0c67bd7..6e64e94a90 100644 --- a/sprokit/src/sprokit/python/util/CMakeLists.txt +++ b/sprokit/src/sprokit/python/util/CMakeLists.txt @@ -4,6 +4,7 @@ set(python_util_srcs python_exceptions.cxx) set(python_util_headers + pyoptions.h python_exceptions.h python_gil.h python.h) diff --git a/sprokit/src/sprokit/python/util/pyoptions.h b/sprokit/src/sprokit/python/util/pyoptions.h new file mode 100644 index 0000000000..962342055c --- /dev/null +++ b/sprokit/src/sprokit/python/util/pyoptions.h @@ -0,0 +1,55 @@ +/*ckwg +29 + * Copyright 2011-2013 by Kitware, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither name of Kitware, Inc. nor the names of any contributors may be used + * to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SPROKIT_PYTHON_UTIL_PYOPTIONS_H +#define SPROKIT_PYTHON_UTIL_PYOPTIONS_H + +#include + +namespace sprokit { +namespace python { + +// NOTE: This has to be in the header because pybind11 is header-only, so each +// shared library gets its own copy of the pybind11::options singleton. DO NOT +// EXPORT THIS CLASS! +class pyoptions + : public pybind11::options +{ + public: + pyoptions() + { + enable_use_gilstate(); + } +}; + +} +} + +#endif // SPROKIT_PYTHON_UTIL_PYOPTIONS_H