passenger 4.0.20 → 4.0.21
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.gitignore +1 -0
- data/.travis.yml +1 -1
- data/NEWS +15 -0
- data/README.md +5 -3
- data/Rakefile +1 -0
- data/bin/passenger-config +1 -5
- data/bin/passenger-install-apache2-module +53 -5
- data/bin/passenger-install-nginx-module +19 -6
- data/bin/passenger-memory-stats +3 -3
- data/build/agents.rb +11 -8
- data/build/apache2.rb +9 -5
- data/build/basics.rb +15 -21
- data/build/common_library.rb +16 -6
- data/build/cplusplus_support.rb +5 -5
- data/build/cxx_tests.rb +3 -3
- data/build/documentation.rb +1 -1
- data/build/misc.rb +4 -37
- data/build/node_tests.rb +29 -0
- data/build/oxt_tests.rb +1 -1
- data/build/packaging.rb +29 -10
- data/build/preprocessor.rb +2 -1
- data/build/test_basics.rb +15 -6
- data/debian.template/locations.ini.template +1 -0
- data/debian.template/passenger.install.template +1 -0
- data/dev/copy_boost_headers.rb +7 -3
- data/dev/run_travis.sh +32 -16
- data/doc/Users guide Apache.idmap.txt +22 -34
- data/doc/Users guide Apache.txt +20 -234
- data/doc/Users guide Nginx.idmap.txt +84 -66
- data/doc/Users guide Nginx.txt +50 -1
- data/doc/Users guide Standalone.idmap.txt +74 -0
- data/doc/Users guide Standalone.txt +22 -9
- data/doc/Users guide.txt +51 -0
- data/doc/users_guide_snippets/environment_variables.txt +0 -3
- data/doc/users_guide_snippets/installation.txt +337 -380
- data/doc/users_guide_snippets/installation/run_installer.txt +58 -0
- data/doc/users_guide_snippets/installation/verify_running_epilogue.txt +6 -0
- data/doc/users_guide_snippets/support_information.txt +2 -9
- data/doc/users_guide_snippets/troubleshooting/default.txt +112 -0
- data/doc/users_guide_snippets/troubleshooting/rails.txt +56 -0
- data/doc/users_guide_snippets/where_to_get_support.txt +9 -0
- data/ext/apache2/Bucket.h +1 -1
- data/ext/apache2/Configuration.hpp +0 -44
- data/ext/apache2/CreateDirConfig.cpp +1 -1
- data/ext/apache2/CreateDirConfig.cpp.erb +1 -1
- data/ext/apache2/Hooks.cpp +28 -21
- data/ext/apache2/MergeDirConfig.cpp +1 -0
- data/ext/apache2/MergeDirConfig.cpp.erb +1 -1
- data/ext/apache2/SetHeaders.cpp +73 -0
- data/ext/apache2/SetHeaders.cpp.erb +88 -0
- data/ext/boost/algorithm/string/detail/find_format.hpp +5 -5
- data/ext/boost/algorithm/string/detail/find_format_all.hpp +5 -5
- data/ext/boost/algorithm/string/detail/finder.hpp +1 -1
- data/ext/boost/algorithm/string/formatter.hpp +2 -2
- data/ext/boost/assert.hpp +6 -1
- data/ext/boost/atomic.hpp +18 -0
- data/ext/boost/atomic/atomic.hpp +241 -0
- data/ext/boost/atomic/detail/base.hpp +585 -0
- data/ext/boost/atomic/detail/cas32strong.hpp +885 -0
- data/ext/boost/atomic/detail/cas32weak.hpp +947 -0
- data/ext/boost/atomic/detail/cas64strong.hpp +443 -0
- data/ext/boost/atomic/detail/config.hpp +54 -0
- data/ext/boost/atomic/detail/gcc-alpha.hpp +368 -0
- data/ext/boost/atomic/detail/gcc-armv6plus.hpp +252 -0
- data/ext/boost/atomic/detail/gcc-cas.hpp +157 -0
- data/ext/boost/atomic/detail/gcc-ppc.hpp +2850 -0
- data/ext/boost/atomic/detail/gcc-sparcv9.hpp +1259 -0
- data/ext/boost/atomic/detail/gcc-x86.hpp +1766 -0
- data/ext/boost/atomic/detail/generic-cas.hpp +206 -0
- data/ext/boost/atomic/detail/interlocked.hpp +200 -0
- data/ext/boost/atomic/detail/linux-arm.hpp +189 -0
- data/ext/boost/atomic/detail/lockpool.hpp +97 -0
- data/ext/boost/atomic/detail/platform.hpp +62 -0
- data/ext/boost/atomic/detail/type-classification.hpp +45 -0
- data/ext/boost/chrono/config.hpp +8 -3
- data/ext/boost/chrono/duration.hpp +9 -10
- data/ext/boost/chrono/system_clocks.hpp +1 -1
- data/ext/boost/chrono/time_point.hpp +4 -3
- data/ext/boost/config/auto_link.hpp +53 -52
- data/ext/boost/config/compiler/borland.hpp +1 -0
- data/ext/boost/config/compiler/clang.hpp +24 -1
- data/ext/boost/config/compiler/codegear.hpp +1 -0
- data/ext/boost/config/compiler/common_edg.hpp +1 -0
- data/ext/boost/config/compiler/cray.hpp +1 -0
- data/ext/boost/config/compiler/digitalmars.hpp +1 -0
- data/ext/boost/config/compiler/gcc.hpp +29 -3
- data/ext/boost/config/compiler/gcc_xml.hpp +2 -1
- data/ext/boost/config/compiler/hp_acc.hpp +1 -0
- data/ext/boost/config/compiler/intel.hpp +1 -1
- data/ext/boost/config/compiler/metrowerks.hpp +1 -0
- data/ext/boost/config/compiler/mpw.hpp +1 -0
- data/ext/boost/config/compiler/pathscale.hpp +1 -0
- data/ext/boost/config/compiler/pgi.hpp +1 -0
- data/ext/boost/config/compiler/sunpro_cc.hpp +1 -0
- data/ext/boost/config/compiler/vacpp.hpp +3 -2
- data/ext/boost/config/compiler/visualc.hpp +25 -11
- data/ext/boost/config/platform/vxworks.hpp +353 -15
- data/ext/boost/config/select_compiler_config.hpp +4 -4
- data/ext/boost/config/stdlib/dinkumware.hpp +10 -3
- data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
- data/ext/boost/config/suffix.hpp +45 -19
- data/ext/boost/date_time/format_date_parser.hpp +1 -11
- data/ext/boost/date_time/strings_from_facet.hpp +5 -3
- data/ext/boost/detail/atomic_redef_macros.hpp +19 -0
- data/ext/boost/detail/atomic_undef_macros.hpp +39 -0
- data/ext/boost/detail/endian.hpp +52 -4
- data/ext/boost/detail/scoped_enum_emulation.hpp +10 -10
- data/ext/boost/detail/select_type.hpp +36 -0
- data/ext/boost/exception/current_exception_cast.hpp +1 -1
- data/ext/boost/exception/detail/error_info_impl.hpp +3 -5
- data/ext/boost/exception/detail/exception_ptr.hpp +3 -3
- data/ext/boost/exception/detail/is_output_streamable.hpp +1 -1
- data/ext/boost/exception/detail/object_hex_dump.hpp +1 -1
- data/ext/boost/exception/detail/type_info.hpp +1 -1
- data/ext/boost/exception/diagnostic_information.hpp +15 -14
- data/ext/boost/exception/exception.hpp +1 -1
- data/ext/boost/exception/get_error_info.hpp +1 -1
- data/ext/boost/exception/info.hpp +12 -13
- data/ext/boost/exception/to_string.hpp +6 -1
- data/ext/boost/exception/to_string_stub.hpp +9 -1
- data/ext/boost/foreach.hpp +5 -5
- data/ext/boost/function/function_template.hpp +6 -6
- data/ext/boost/functional/hash/detail/float_functions.hpp +90 -0
- data/ext/boost/functional/hash/detail/hash_float.hpp +11 -2
- data/ext/boost/functional/hash/extensions.hpp +14 -2
- data/ext/boost/functional/hash/hash.hpp +26 -5
- data/ext/boost/get_pointer.hpp +17 -2
- data/ext/boost/integer_traits.hpp +1 -1
- data/ext/boost/lexical_cast.hpp +615 -395
- data/ext/boost/libs/atomic/lockpool.cpp +24 -0
- data/ext/boost/libs/system/src/error_code.cpp +25 -18
- data/ext/boost/libs/thread/src/future.cpp +7 -5
- data/ext/boost/libs/thread/src/pthread/once.cpp +9 -3
- data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +90 -0
- data/ext/boost/libs/thread/src/pthread/thread.cpp +129 -95
- data/ext/boost/libs/thread/src/pthread/timeconv.inl +20 -1
- data/ext/boost/limits.hpp +1 -1
- data/ext/boost/math/policies/policy.hpp +10 -0
- data/ext/boost/math/special_functions/detail/round_fwd.hpp +17 -4
- data/ext/boost/math/special_functions/fpclassify.hpp +114 -45
- data/ext/boost/math/special_functions/math_fwd.hpp +195 -83
- data/ext/boost/math/special_functions/sign.hpp +13 -8
- data/ext/boost/math/tools/config.hpp +38 -16
- data/ext/boost/move/algorithm.hpp +275 -0
- data/ext/boost/move/core.hpp +332 -0
- data/ext/boost/move/detail/config_begin.hpp +23 -0
- data/ext/boost/move/detail/config_end.hpp +20 -0
- data/ext/boost/move/detail/meta_utils.hpp +158 -0
- data/ext/boost/move/iterator.hpp +298 -0
- data/ext/boost/move/move.hpp +10 -1256
- data/ext/boost/move/traits.hpp +142 -0
- data/ext/boost/move/utility.hpp +194 -0
- data/ext/boost/mpl/assert.hpp +72 -4
- data/ext/boost/noncopyable.hpp +15 -3
- data/ext/boost/pointer_to_other.hpp +55 -0
- data/ext/boost/range/concepts.hpp +4 -4
- data/ext/boost/range/detail/extract_optional_type.hpp +1 -1
- data/ext/boost/range/empty.hpp +1 -1
- data/ext/boost/range/iterator_range_core.hpp +4 -1
- data/ext/boost/range/iterator_range_io.hpp +2 -2
- data/ext/boost/ratio/config.hpp +6 -0
- data/ext/boost/ratio/detail/overflow_helpers.hpp +2 -2
- data/ext/boost/smart_ptr/allocate_shared_array.hpp +250 -0
- data/ext/boost/smart_ptr/detail/allocate_array_helper.hpp +169 -0
- data/ext/boost/smart_ptr/detail/array_deleter.hpp +124 -0
- data/ext/boost/smart_ptr/detail/array_traits.hpp +53 -0
- data/ext/boost/smart_ptr/detail/array_utility.hpp +178 -0
- data/ext/boost/smart_ptr/detail/make_array_helper.hpp +157 -0
- data/ext/boost/smart_ptr/detail/operator_bool.hpp +16 -9
- data/ext/boost/smart_ptr/detail/shared_count.hpp +78 -7
- data/ext/boost/smart_ptr/detail/sp_convertible.hpp +15 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +12 -6
- data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +162 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +15 -0
- data/ext/boost/smart_ptr/detail/sp_forward.hpp +39 -0
- data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +19 -3
- data/ext/boost/smart_ptr/detail/sp_if_array.hpp +31 -0
- data/ext/boost/smart_ptr/detail/sp_nullptr_t.hpp +45 -0
- data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +5 -12
- data/ext/boost/smart_ptr/enable_shared_from_this.hpp +4 -4
- data/ext/boost/smart_ptr/make_shared.hpp +5 -1060
- data/ext/boost/smart_ptr/make_shared_array.hpp +247 -0
- data/ext/boost/smart_ptr/make_shared_object.hpp +1128 -0
- data/ext/boost/smart_ptr/scoped_array.hpp +32 -7
- data/ext/boost/smart_ptr/scoped_ptr.hpp +31 -5
- data/ext/boost/smart_ptr/shared_array.hpp +135 -20
- data/ext/boost/smart_ptr/shared_ptr.hpp +444 -126
- data/ext/boost/smart_ptr/weak_ptr.hpp +39 -28
- data/ext/boost/static_assert.hpp +74 -17
- data/ext/boost/system/error_code.hpp +76 -68
- data/ext/boost/system/system_error.hpp +5 -1
- data/ext/boost/thread/barrier.hpp +6 -2
- data/ext/boost/thread/completion_latch.hpp +233 -0
- data/ext/boost/thread/condition.hpp +6 -1
- data/ext/boost/thread/detail/async_func.hpp +571 -0
- data/ext/boost/thread/detail/config.hpp +248 -40
- data/ext/boost/thread/detail/counter.hpp +93 -0
- data/ext/boost/thread/detail/delete.hpp +12 -0
- data/ext/boost/thread/detail/invoke.hpp +1351 -0
- data/ext/boost/thread/detail/is_convertible.hpp +48 -0
- data/ext/boost/thread/detail/lockable_wrapper.hpp +45 -0
- data/ext/boost/thread/detail/log.hpp +83 -0
- data/ext/boost/thread/detail/make_tuple_indices.hpp +224 -0
- data/ext/boost/thread/detail/move.hpp +32 -16
- data/ext/boost/thread/detail/thread.hpp +236 -41
- data/ext/boost/thread/detail/thread_group.hpp +55 -9
- data/ext/boost/thread/detail/thread_interruption.hpp +4 -1
- data/ext/boost/thread/exceptions.hpp +2 -0
- data/ext/boost/thread/externally_locked.hpp +351 -0
- data/ext/boost/thread/externally_locked_stream.hpp +170 -0
- data/ext/boost/thread/future.hpp +2517 -455
- data/ext/boost/thread/future_error_code.hpp +61 -0
- data/ext/boost/thread/is_locked_by_this_thread.hpp +39 -0
- data/ext/boost/thread/latch.hpp +142 -0
- data/ext/boost/thread/lock_algorithms.hpp +468 -0
- data/ext/boost/thread/lock_concepts.hpp +197 -0
- data/ext/boost/thread/lock_factories.hpp +78 -0
- data/ext/boost/thread/lock_guard.hpp +88 -0
- data/ext/boost/thread/lock_options.hpp +31 -0
- data/ext/boost/thread/lock_traits.hpp +45 -0
- data/ext/boost/thread/lock_types.hpp +1226 -0
- data/ext/boost/thread/lockable_adapter.hpp +226 -0
- data/ext/boost/thread/lockable_concepts.hpp +157 -0
- data/ext/boost/thread/lockable_traits.hpp +207 -0
- data/ext/boost/thread/locks.hpp +5 -1816
- data/ext/boost/thread/mutex.hpp +33 -1
- data/ext/boost/thread/null_mutex.hpp +243 -0
- data/ext/boost/thread/once.hpp +10 -1
- data/ext/boost/thread/poly_lockable.hpp +68 -0
- data/ext/boost/thread/poly_lockable_adapter.hpp +89 -0
- data/ext/boost/thread/poly_shared_lockable.hpp +135 -0
- data/ext/boost/thread/poly_shared_lockable_adapter.hpp +170 -0
- data/ext/boost/thread/pthread/condition_variable.hpp +74 -26
- data/ext/boost/thread/pthread/condition_variable_fwd.hpp +54 -27
- data/ext/boost/thread/pthread/mutex.hpp +101 -38
- data/ext/boost/thread/pthread/once.hpp +459 -44
- data/ext/boost/thread/pthread/once_atomic.hpp +313 -0
- data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -10
- data/ext/boost/thread/pthread/shared_mutex.hpp +226 -61
- data/ext/boost/thread/pthread/shared_mutex_assert.hpp +724 -0
- data/ext/boost/thread/pthread/thread_data.hpp +53 -50
- data/ext/boost/thread/pthread/timespec.hpp +96 -12
- data/ext/boost/thread/recursive_mutex.hpp +44 -1
- data/ext/boost/thread/reverse_lock.hpp +3 -2
- data/ext/boost/thread/scoped_thread.hpp +285 -0
- data/ext/boost/thread/shared_lock_guard.hpp +2 -1
- data/ext/boost/thread/shared_mutex.hpp +23 -0
- data/ext/boost/thread/strict_lock.hpp +235 -0
- data/ext/boost/thread/sync_bounded_queue.hpp +594 -0
- data/ext/boost/thread/sync_queue.hpp +516 -0
- data/ext/boost/thread/synchronized_value.hpp +1001 -0
- data/ext/boost/thread/testable_mutex.hpp +148 -0
- data/ext/boost/thread/thread.hpp +1 -13
- data/ext/boost/thread/thread_functors.hpp +57 -0
- data/ext/boost/thread/thread_guard.hpp +46 -0
- data/ext/boost/thread/thread_only.hpp +29 -0
- data/ext/boost/thread/v2/shared_mutex.hpp +1062 -0
- data/ext/boost/thread/v2/thread.hpp +37 -10
- data/ext/boost/thread/xtime.hpp +2 -1
- data/ext/boost/token_functions.hpp +16 -16
- data/ext/boost/type_traits/add_lvalue_reference.hpp +26 -0
- data/ext/boost/type_traits/add_reference.hpp +1 -1
- data/ext/boost/type_traits/add_rvalue_reference.hpp +4 -4
- data/ext/boost/type_traits/aligned_storage.hpp +13 -0
- data/ext/boost/type_traits/common_type.hpp +11 -12
- data/ext/boost/type_traits/config.hpp +1 -1
- data/ext/boost/type_traits/detail/common_type_imp.hpp +1 -1
- data/ext/boost/type_traits/detail/has_binary_operator.hpp +1 -1
- data/ext/boost/type_traits/detail/is_function_ptr_tester.hpp +1 -1
- data/ext/boost/type_traits/has_left_shift.hpp +49 -0
- data/ext/boost/type_traits/has_right_shift.hpp +49 -0
- data/ext/boost/type_traits/has_trivial_move_assign.hpp +57 -0
- data/ext/boost/type_traits/has_trivial_move_constructor.hpp +57 -0
- data/ext/boost/type_traits/intrinsics.hpp +18 -2
- data/ext/boost/type_traits/is_abstract.hpp +1 -1
- data/ext/boost/type_traits/is_array.hpp +1 -1
- data/ext/boost/type_traits/is_const.hpp +1 -1
- data/ext/boost/type_traits/is_convertible.hpp +78 -17
- data/ext/boost/type_traits/is_function.hpp +6 -1
- data/ext/boost/type_traits/is_integral.hpp +6 -1
- data/ext/boost/type_traits/is_nothrow_move_assignable.hpp +84 -0
- data/ext/boost/type_traits/is_nothrow_move_constructible.hpp +84 -0
- data/ext/boost/type_traits/is_pod.hpp +3 -1
- data/ext/boost/type_traits/is_rvalue_reference.hpp +1 -1
- data/ext/boost/type_traits/is_volatile.hpp +1 -1
- data/ext/boost/type_traits/make_signed.hpp +153 -0
- data/ext/boost/type_traits/make_unsigned.hpp +16 -0
- data/ext/boost/type_traits/remove_const.hpp +1 -1
- data/ext/boost/type_traits/remove_cv.hpp +1 -1
- data/ext/boost/type_traits/remove_reference.hpp +1 -1
- data/ext/boost/type_traits/remove_volatile.hpp +1 -1
- data/ext/boost/unordered/detail/allocate.hpp +1120 -0
- data/ext/boost/unordered/detail/buckets.hpp +876 -0
- data/ext/boost/unordered/detail/equivalent.hpp +680 -0
- data/ext/boost/unordered/detail/extract_key.hpp +183 -0
- data/ext/boost/unordered/detail/fwd.hpp +23 -0
- data/ext/boost/unordered/detail/table.hpp +861 -0
- data/ext/boost/unordered/detail/unique.hpp +622 -0
- data/ext/boost/unordered/detail/util.hpp +260 -0
- data/ext/boost/unordered/unordered_map.hpp +1652 -0
- data/ext/boost/unordered/unordered_map_fwd.hpp +65 -0
- data/ext/boost/unordered/unordered_set.hpp +1549 -0
- data/ext/boost/unordered/unordered_set_fwd.hpp +63 -0
- data/ext/boost/unordered_map.hpp +18 -0
- data/ext/boost/unordered_set.hpp +18 -0
- data/ext/boost/utility/addressof.hpp +2 -2
- data/ext/boost/utility/result_of.hpp +8 -1
- data/ext/boost/version.hpp +2 -2
- data/ext/common/Account.h +1 -1
- data/ext/common/AccountsDatabase.h +1 -1
- data/ext/common/AgentsStarter.cpp +3 -1
- data/ext/common/AgentsStarter.h +2 -2
- data/ext/common/ApplicationPool2/AppTypes.cpp +24 -6
- data/ext/common/ApplicationPool2/AppTypes.h +17 -8
- data/ext/common/ApplicationPool2/Common.h +12 -12
- data/ext/common/ApplicationPool2/DirectSpawner.h +2 -2
- data/ext/common/ApplicationPool2/DummySpawner.h +3 -3
- data/ext/common/ApplicationPool2/Group.h +6 -6
- data/ext/common/ApplicationPool2/Implementation.cpp +19 -19
- data/ext/common/ApplicationPool2/PipeWatcher.h +5 -5
- data/ext/common/ApplicationPool2/Pool.h +21 -21
- data/ext/common/ApplicationPool2/Process.h +6 -6
- data/ext/common/ApplicationPool2/Session.h +1 -1
- data/ext/common/ApplicationPool2/SmartSpawner.h +24 -12
- data/ext/common/ApplicationPool2/Socket.h +2 -2
- data/ext/common/ApplicationPool2/Spawner.h +64 -14
- data/ext/common/ApplicationPool2/SpawnerFactory.h +7 -7
- data/ext/common/ApplicationPool2/SuperGroup.h +5 -5
- data/ext/common/BackgroundEventLoop.cpp +4 -4
- data/ext/common/BackgroundEventLoop.h +1 -1
- data/ext/common/Constants.h +13 -1
- data/ext/common/EventedBufferedInput.h +8 -8
- data/ext/common/Exceptions.cpp +71 -0
- data/ext/common/Exceptions.h +60 -7
- data/ext/common/FileDescriptor.h +4 -4
- data/ext/common/MessageClient.h +1 -1
- data/ext/common/MessageServer.h +5 -5
- data/ext/common/MultiLibeio.cpp +3 -3
- data/ext/common/MultiLibeio.h +2 -2
- data/ext/common/RandomGenerator.h +11 -11
- data/ext/common/ResourceLocator.h +8 -1
- data/ext/common/SafeLibev.h +12 -12
- data/ext/common/ServerInstanceDir.h +11 -3
- data/ext/common/UnionStation.h +10 -10
- data/ext/common/Utils.cpp +11 -13
- data/ext/common/Utils.h +9 -9
- data/ext/common/Utils/BlockingQueue.h +10 -10
- data/ext/common/Utils/BufferedIO.h +1 -1
- data/ext/common/Utils/CachedFileStat.hpp +2 -2
- data/ext/common/Utils/FileChangeChecker.h +1 -1
- data/ext/common/Utils/HashMap.h +13 -4
- data/ext/common/Utils/IOUtils.cpp +33 -10
- data/ext/common/Utils/IniFile.h +3 -3
- data/ext/common/Utils/Lock.h +2 -2
- data/ext/common/Utils/MessagePassing.h +10 -10
- data/ext/common/Utils/ProcessMetricsCollector.h +24 -6
- data/ext/common/Utils/ScopeGuard.h +5 -5
- data/ext/common/Utils/jsoncpp.cpp +2 -0
- data/ext/common/agents/HelperAgent/FileBackedPipe.h +26 -26
- data/ext/common/agents/HelperAgent/Main.cpp +18 -18
- data/ext/common/agents/HelperAgent/RequestHandler.cpp +4 -4
- data/ext/common/agents/HelperAgent/RequestHandler.h +30 -21
- data/ext/common/agents/LoggingAgent/AdminController.h +1 -1
- data/ext/common/agents/LoggingAgent/FilterSupport.h +13 -11
- data/ext/common/agents/LoggingAgent/LoggingServer.h +11 -11
- data/ext/common/agents/LoggingAgent/Main.cpp +9 -9
- data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
- data/ext/common/agents/SpawnPreparer.cpp +1 -0
- data/ext/common/agents/Watchdog/AgentWatcher.cpp +8 -7
- data/ext/common/agents/Watchdog/Main.cpp +81 -73
- data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +1 -1
- data/ext/libev/Changes +57 -0
- data/ext/libev/LICENSE +2 -1
- data/ext/libev/Makefile.in +110 -50
- data/ext/libev/README +8 -8
- data/ext/libev/aclocal.m4 +1503 -861
- data/ext/libev/config.guess +290 -304
- data/ext/libev/config.sub +77 -198
- data/ext/libev/configure +1735 -890
- data/ext/libev/configure.ac +3 -2
- data/ext/libev/ev++.h +6 -6
- data/ext/libev/ev.c +541 -214
- data/ext/libev/ev.h +106 -100
- data/ext/libev/ev_epoll.c +1 -1
- data/ext/libev/ev_kqueue.c +20 -4
- data/ext/libev/ev_vars.h +15 -16
- data/ext/libev/ev_win32.c +12 -2
- data/ext/libev/ev_wrap.h +162 -160
- data/ext/libev/event.c +29 -6
- data/ext/libev/event.h +9 -2
- data/ext/libev/ltmain.sh +2632 -1384
- data/ext/nginx/ConfigurationCommands.c +1 -1
- data/ext/nginx/ConfigurationCommands.c.erb +3 -1
- data/ext/nginx/ContentHandler.c +25 -2
- data/ext/nginx/CreateLocationConfig.c +1 -0
- data/ext/nginx/CreateLocationConfig.c.erb +1 -1
- data/ext/nginx/MergeLocationConfig.c +1 -0
- data/ext/nginx/MergeLocationConfig.c.erb +1 -1
- data/ext/nginx/config +12 -0
- data/ext/oxt/dynamic_thread_group.hpp +7 -4
- data/ext/oxt/system_calls.cpp +5 -1
- data/ext/oxt/system_calls.hpp +3 -0
- data/helper-scripts/node-loader.js +117 -249
- data/lib/phusion_passenger.rb +27 -5
- data/lib/phusion_passenger/abstract_installer.rb +104 -9
- data/lib/phusion_passenger/admin_tools/memory_stats.rb +10 -9
- data/lib/phusion_passenger/apache2/config_options.rb +6 -3
- data/lib/phusion_passenger/common_library.rb +7 -1
- data/lib/phusion_passenger/constants.rb +6 -0
- data/lib/phusion_passenger/loader_shared_helpers.rb +7 -4
- data/lib/phusion_passenger/nginx/config_options.rb +2 -1
- data/lib/phusion_passenger/packaging.rb +3 -0
- data/lib/phusion_passenger/platform_info/apache.rb +43 -6
- data/lib/phusion_passenger/platform_info/apache_detector.rb +15 -5
- data/lib/phusion_passenger/platform_info/compiler.rb +167 -32
- data/lib/phusion_passenger/platform_info/cxx_portability.rb +133 -77
- data/lib/phusion_passenger/platform_info/depcheck.rb +17 -7
- data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +3 -3
- data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
- data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -6
- data/lib/phusion_passenger/platform_info/linux.rb +2 -1
- data/lib/phusion_passenger/platform_info/operating_system.rb +1 -1
- data/lib/phusion_passenger/platform_info/ruby.rb +18 -3
- data/lib/phusion_passenger/standalone/runtime_installer.rb +6 -2
- data/lib/phusion_passenger/standalone/start_command.rb +8 -2
- data/lib/phusion_passenger/utils/ansi_colors.rb +9 -0
- data/lib/phusion_passenger/utils/hosts_file_parser.rb +4 -2
- data/node_lib/phusion_passenger/httplib_emulation.js +141 -0
- data/node_lib/phusion_passenger/line_reader.js +154 -0
- data/node_lib/phusion_passenger/request_handler.js +65 -0
- data/node_lib/phusion_passenger/session_protocol_parser.js +113 -0
- data/resources/templates/apache2/deployment_example.txt.erb +2 -1
- data/resources/templates/apache2/installing_against_a_different_apache.txt.erb +14 -0
- data/resources/templates/apache2/multiple_apache_installations_detected.txt.erb +15 -0
- data/resources/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
- data/resources/templates/general_error_with_html.html.template +1 -1
- data/resources/templates/installer_common/gem_install_permission_problems.txt.erb +17 -0
- data/resources/templates/installer_common/low_amount_of_memory_warning.txt.erb +6 -4
- data/resources/templates/installer_common/world_inaccessible_directories.txt.erb +16 -0
- data/resources/templates/nginx/deployment_example.txt.erb +2 -1
- data/resources/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
- data/resources/templates/standalone/config.erb +1 -0
- data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +3 -3
- data/test/cxx/ApplicationPool2/PoolTest.cpp +4 -4
- data/test/cxx/ApplicationPool2/ProcessTest.cpp +5 -5
- data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +5 -5
- data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +1 -1
- data/test/cxx/EventedBufferedInputTest.cpp +6 -6
- data/test/cxx/FileBackedPipeTest.cpp +1 -1
- data/test/cxx/MessagePassingTest.cpp +1 -1
- data/test/cxx/MessageServerTest.cpp +4 -4
- data/test/cxx/RequestHandlerTest.cpp +7 -7
- data/test/cxx/UnionStationTest.cpp +2 -2
- data/test/node/line_reader_spec.js +338 -0
- data/test/node/spec_helper.js +27 -0
- data/test/ruby/standalone/runtime_installer_spec.rb +2 -1
- metadata +131 -22
- metadata.gz.asc +7 -7
- data/ext/boost/functional/hash/detail/container_fwd_0x.hpp +0 -29
- data/ext/boost/lambda/core.hpp +0 -79
- data/ext/boost/lambda/detail/actions.hpp +0 -174
- data/ext/boost/lambda/detail/arity_code.hpp +0 -110
- data/ext/boost/lambda/detail/function_adaptors.hpp +0 -789
- data/ext/boost/lambda/detail/is_instance_of.hpp +0 -104
- data/ext/boost/lambda/detail/lambda_config.hpp +0 -48
- data/ext/boost/lambda/detail/lambda_functor_base.hpp +0 -615
- data/ext/boost/lambda/detail/lambda_functors.hpp +0 -324
- data/ext/boost/lambda/detail/lambda_fwd.hpp +0 -74
- data/ext/boost/lambda/detail/lambda_traits.hpp +0 -578
- data/ext/boost/lambda/detail/member_ptr.hpp +0 -737
- data/ext/boost/lambda/detail/operator_actions.hpp +0 -139
- data/ext/boost/lambda/detail/operator_lambda_func_base.hpp +0 -271
- data/ext/boost/lambda/detail/operator_return_type_traits.hpp +0 -917
- data/ext/boost/lambda/detail/operators.hpp +0 -370
- data/ext/boost/lambda/detail/ret.hpp +0 -325
- data/ext/boost/lambda/detail/return_type_traits.hpp +0 -282
- data/ext/boost/lambda/detail/select_functions.hpp +0 -74
- data/ext/boost/lambda/lambda.hpp +0 -34
@@ -21,7 +21,7 @@ namespace boost
|
|
21
21
|
|
22
22
|
class BOOST_SYMBOL_VISIBLE system_error : public std::runtime_error
|
23
23
|
// BOOST_SYMBOL_VISIBLE is needed by GCC to ensure system_error thrown from a shared
|
24
|
-
// library can be caught. See svn.boost.org/trac/boost/ticket/3697
|
24
|
+
// library can be caught. See svn.boost.org/trac/boost/ticket/3697
|
25
25
|
{
|
26
26
|
public:
|
27
27
|
system_error( error_code ec )
|
@@ -61,13 +61,17 @@ namespace boost
|
|
61
61
|
{
|
62
62
|
if ( m_what.empty() )
|
63
63
|
{
|
64
|
+
#ifndef BOOST_NO_EXCEPTIONS
|
64
65
|
try
|
66
|
+
#endif
|
65
67
|
{
|
66
68
|
m_what = this->std::runtime_error::what();
|
67
69
|
if ( !m_what.empty() ) m_what += ": ";
|
68
70
|
m_what += m_error_code.message();
|
69
71
|
}
|
72
|
+
#ifndef BOOST_NO_EXCEPTIONS
|
70
73
|
catch (...) { return std::runtime_error::what(); }
|
74
|
+
#endif
|
71
75
|
}
|
72
76
|
return m_what.c_str();
|
73
77
|
}
|
@@ -9,9 +9,11 @@
|
|
9
9
|
#define BOOST_BARRIER_JDM030602_HPP
|
10
10
|
|
11
11
|
#include <boost/thread/detail/config.hpp>
|
12
|
-
#include <boost/
|
12
|
+
#include <boost/thread/detail/delete.hpp>
|
13
13
|
|
14
|
+
#include <boost/throw_exception.hpp>
|
14
15
|
#include <boost/thread/mutex.hpp>
|
16
|
+
#include <boost/thread/lock_types.hpp>
|
15
17
|
#include <boost/thread/condition_variable.hpp>
|
16
18
|
#include <string>
|
17
19
|
#include <stdexcept>
|
@@ -24,6 +26,8 @@ namespace boost
|
|
24
26
|
class barrier
|
25
27
|
{
|
26
28
|
public:
|
29
|
+
BOOST_THREAD_NO_COPYABLE( barrier )
|
30
|
+
|
27
31
|
barrier(unsigned int count)
|
28
32
|
: m_threshold(count), m_count(count), m_generation(0)
|
29
33
|
{
|
@@ -33,7 +37,7 @@ namespace boost
|
|
33
37
|
|
34
38
|
bool wait()
|
35
39
|
{
|
36
|
-
boost::mutex
|
40
|
+
boost::unique_lock<boost::mutex> lock(m_mutex);
|
37
41
|
unsigned int gen = m_generation;
|
38
42
|
|
39
43
|
if (--m_count == 0)
|
@@ -0,0 +1,233 @@
|
|
1
|
+
// Distributed under the Boost Software License, Version 1.0. (See
|
2
|
+
// accompanying file LICENSE_1_0.txt or copy at
|
3
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
4
|
+
// (C) Copyright 2013 Vicente J. Botet Escriba
|
5
|
+
|
6
|
+
#ifndef BOOST_THREAD_COMPLETION_LATCH_HPP
|
7
|
+
#define BOOST_THREAD_COMPLETION_LATCH_HPP
|
8
|
+
|
9
|
+
#include <boost/thread/detail/config.hpp>
|
10
|
+
#include <boost/thread/detail/delete.hpp>
|
11
|
+
#include <boost/thread/detail/counter.hpp>
|
12
|
+
|
13
|
+
#include <boost/thread/mutex.hpp>
|
14
|
+
#include <boost/thread/lock_types.hpp>
|
15
|
+
#include <boost/thread/condition_variable.hpp>
|
16
|
+
#include <boost/chrono/duration.hpp>
|
17
|
+
#include <boost/chrono/time_point.hpp>
|
18
|
+
#include <boost/assert.hpp>
|
19
|
+
#ifdef BOOST_NO_CXX11_HDR_FUNCTIONAL
|
20
|
+
#include <boost/function.hpp>
|
21
|
+
#else
|
22
|
+
#include <functional>
|
23
|
+
#endif
|
24
|
+
//#include <boost/thread/latch.hpp>
|
25
|
+
|
26
|
+
#include <boost/config/abi_prefix.hpp>
|
27
|
+
|
28
|
+
namespace boost
|
29
|
+
{
|
30
|
+
namespace thread_detail
|
31
|
+
{
|
32
|
+
void noop()
|
33
|
+
{
|
34
|
+
}
|
35
|
+
}
|
36
|
+
class completion_latch
|
37
|
+
{
|
38
|
+
public:
|
39
|
+
/// the implementation defined completion function type
|
40
|
+
#ifdef BOOST_NO_CXX11_HDR_FUNCTIONAL
|
41
|
+
typedef function<void()> completion_function;
|
42
|
+
#else
|
43
|
+
typedef std::function<void()> completion_function;
|
44
|
+
#endif
|
45
|
+
/// noop completion function factory
|
46
|
+
static completion_function noop()
|
47
|
+
{
|
48
|
+
return completion_function(&thread_detail::noop);
|
49
|
+
}
|
50
|
+
|
51
|
+
private:
|
52
|
+
struct around_wait;
|
53
|
+
friend struct around_wait;
|
54
|
+
struct around_wait
|
55
|
+
{
|
56
|
+
completion_latch &that_;
|
57
|
+
boost::unique_lock<boost::mutex> &lk_;
|
58
|
+
around_wait(completion_latch &that, boost::unique_lock<boost::mutex> &lk)
|
59
|
+
: that_(that), lk_(lk)
|
60
|
+
{
|
61
|
+
that_.leavers_.cond_.wait(lk, detail::counter_is_zero(that_.leavers_));
|
62
|
+
that_.waiters_.inc_and_notify_all();
|
63
|
+
that_.leavers_.cond_.wait(lk, detail::counter_is_not_zero(that_.leavers_));
|
64
|
+
}
|
65
|
+
~around_wait()
|
66
|
+
{
|
67
|
+
that_.waiters_.dec_and_notify_all();
|
68
|
+
}
|
69
|
+
};
|
70
|
+
|
71
|
+
bool count_down(unique_lock<mutex> &lk)
|
72
|
+
{
|
73
|
+
BOOST_ASSERT(count_ > 0);
|
74
|
+
if (--count_ == 0)
|
75
|
+
{
|
76
|
+
waiters_.cond_.wait(lk, detail::counter_is_not_zero(waiters_));
|
77
|
+
leavers_.assign_and_notify_all(waiters_);
|
78
|
+
count_.cond_.notify_all();
|
79
|
+
waiters_.cond_.wait(lk, detail::counter_is_zero(waiters_));
|
80
|
+
leavers_.assign_and_notify_all(0);
|
81
|
+
lk.unlock();
|
82
|
+
funct_();
|
83
|
+
return true;
|
84
|
+
}
|
85
|
+
return false;
|
86
|
+
}
|
87
|
+
|
88
|
+
public:
|
89
|
+
BOOST_THREAD_NO_COPYABLE( completion_latch )
|
90
|
+
|
91
|
+
/// Constructs a latch with a given count.
|
92
|
+
completion_latch(std::size_t count) :
|
93
|
+
count_(count), funct_(noop()), waiters_(0), leavers_(0)
|
94
|
+
{
|
95
|
+
}
|
96
|
+
|
97
|
+
/// Constructs a latch with a given count and a completion function.
|
98
|
+
template <typename F>
|
99
|
+
completion_latch(std::size_t count, BOOST_THREAD_RV_REF(F) funct) :
|
100
|
+
count_(count),
|
101
|
+
funct_(boost::move(funct)),
|
102
|
+
waiters_(0),
|
103
|
+
leavers_(0)
|
104
|
+
{
|
105
|
+
}
|
106
|
+
template <typename F>
|
107
|
+
completion_latch(std::size_t count, void(*funct)()) :
|
108
|
+
count_(count), funct_(funct), waiters_(0), leavers_(0)
|
109
|
+
{
|
110
|
+
}
|
111
|
+
|
112
|
+
///
|
113
|
+
~completion_latch()
|
114
|
+
{
|
115
|
+
}
|
116
|
+
|
117
|
+
/// Blocks until the latch has counted down to zero.
|
118
|
+
void wait()
|
119
|
+
{
|
120
|
+
boost::unique_lock<boost::mutex> lk(mutex_);
|
121
|
+
around_wait aw(*this, lk);
|
122
|
+
count_.cond_.wait(lk, detail::counter_is_zero(count_));
|
123
|
+
}
|
124
|
+
|
125
|
+
/// @return true if the internal counter is already 0, false otherwise
|
126
|
+
bool try_wait()
|
127
|
+
{
|
128
|
+
boost::unique_lock<boost::mutex> lk(mutex_);
|
129
|
+
around_wait aw(*this, lk);
|
130
|
+
return (count_ == 0);
|
131
|
+
}
|
132
|
+
|
133
|
+
/// try to wait for a specified amount of time
|
134
|
+
/// @return whether there is a timeout or not.
|
135
|
+
template <class Rep, class Period>
|
136
|
+
cv_status wait_for(const chrono::duration<Rep, Period>& rel_time)
|
137
|
+
{
|
138
|
+
boost::unique_lock<boost::mutex> lk(mutex_);
|
139
|
+
around_wait aw(*this, lk);
|
140
|
+
return count_.cond_.wait_for(lk, rel_time, detail::counter_is_zero(count_))
|
141
|
+
? cv_status::no_timeout
|
142
|
+
: cv_status::timeout;
|
143
|
+
}
|
144
|
+
|
145
|
+
/// try to wait until the specified time_point is reached
|
146
|
+
/// @return whether there is a timeout or not.
|
147
|
+
template <class Clock, class Duration>
|
148
|
+
cv_status wait_until(const chrono::time_point<Clock, Duration>& abs_time)
|
149
|
+
{
|
150
|
+
boost::unique_lock<boost::mutex> lk(mutex_);
|
151
|
+
around_wait aw(*this, lk);
|
152
|
+
return count_.cond_.wait_until(lk, abs_time, detail::counter_is_zero(count_))
|
153
|
+
? cv_status::no_timeout
|
154
|
+
: cv_status::timeout;
|
155
|
+
}
|
156
|
+
|
157
|
+
/// Decrement the count and notify anyone waiting if we reach zero.
|
158
|
+
/// @Requires count must be greater than 0
|
159
|
+
void count_down()
|
160
|
+
{
|
161
|
+
unique_lock<mutex> lk(mutex_);
|
162
|
+
count_down(lk);
|
163
|
+
}
|
164
|
+
void signal()
|
165
|
+
{
|
166
|
+
count_down();
|
167
|
+
}
|
168
|
+
|
169
|
+
/// Decrement the count and notify anyone waiting if we reach zero.
|
170
|
+
/// Blocks until the latch has counted down to zero.
|
171
|
+
/// @Requires count must be greater than 0
|
172
|
+
void count_down_and_wait()
|
173
|
+
{
|
174
|
+
boost::unique_lock<boost::mutex> lk(mutex_);
|
175
|
+
if (count_down(lk))
|
176
|
+
{
|
177
|
+
return;
|
178
|
+
}
|
179
|
+
around_wait aw(*this, lk);
|
180
|
+
count_.cond_.wait(lk, detail::counter_is_zero(count_));
|
181
|
+
}
|
182
|
+
void sync()
|
183
|
+
{
|
184
|
+
count_down_and_wait();
|
185
|
+
}
|
186
|
+
|
187
|
+
/// Reset the counter
|
188
|
+
/// #Requires This method may only be invoked when there are no other threads currently inside the count_down_and_wait() method.
|
189
|
+
void reset(std::size_t count)
|
190
|
+
{
|
191
|
+
boost::lock_guard<boost::mutex> lk(mutex_);
|
192
|
+
//BOOST_ASSERT(count_ == 0);
|
193
|
+
count_ = count;
|
194
|
+
}
|
195
|
+
|
196
|
+
/// Resets the latch with the new completion function.
|
197
|
+
/// The next time the internal count reaches 0, this function will be invoked.
|
198
|
+
/// This completion function may only be invoked when there are no other threads
|
199
|
+
/// currently inside the count_down and wait related functions.
|
200
|
+
/// It may also be invoked from within the registered completion function.
|
201
|
+
/// @Returns the old completion function if any or noop if
|
202
|
+
|
203
|
+
#ifdef BOOST_NO_CXX11_HDR_FUNCTIONAL
|
204
|
+
template <typename F>
|
205
|
+
completion_function then(BOOST_THREAD_RV_REF(F) funct)
|
206
|
+
{
|
207
|
+
boost::lock_guard<boost::mutex> lk(mutex_);
|
208
|
+
completion_function tmp(funct_);
|
209
|
+
funct_ = boost::move(funct);
|
210
|
+
return tmp;
|
211
|
+
}
|
212
|
+
#endif
|
213
|
+
completion_function then(void(*funct)())
|
214
|
+
{
|
215
|
+
boost::lock_guard<boost::mutex> lk(mutex_);
|
216
|
+
completion_function tmp(funct_);
|
217
|
+
funct_ = completion_function(funct);
|
218
|
+
return tmp;
|
219
|
+
}
|
220
|
+
|
221
|
+
private:
|
222
|
+
mutex mutex_;
|
223
|
+
detail::counter count_;
|
224
|
+
completion_function funct_;
|
225
|
+
detail::counter waiters_;
|
226
|
+
detail::counter leavers_;
|
227
|
+
};
|
228
|
+
|
229
|
+
} // namespace boost
|
230
|
+
|
231
|
+
#include <boost/config/abi_suffix.hpp>
|
232
|
+
|
233
|
+
#endif
|
@@ -1,11 +1,15 @@
|
|
1
1
|
#ifndef BOOST_THREAD_CONDITION_HPP
|
2
2
|
#define BOOST_THREAD_CONDITION_HPP
|
3
|
-
// (C) Copyright 2007 Anthony Williams
|
3
|
+
// (C) Copyright 2007 Anthony Williams
|
4
4
|
//
|
5
5
|
// Distributed under the Boost Software License, Version 1.0. (See
|
6
6
|
// accompanying file LICENSE_1_0.txt or copy at
|
7
7
|
// http://www.boost.org/LICENSE_1_0.txt)
|
8
8
|
|
9
|
+
#include <boost/thread/detail/config.hpp>
|
10
|
+
|
11
|
+
#if defined BOOST_THREAD_PROVIDES_CONDITION
|
12
|
+
|
9
13
|
#include <boost/thread/condition_variable.hpp>
|
10
14
|
|
11
15
|
namespace boost
|
@@ -14,3 +18,4 @@ namespace boost
|
|
14
18
|
}
|
15
19
|
|
16
20
|
#endif
|
21
|
+
#endif
|
@@ -0,0 +1,571 @@
|
|
1
|
+
// Copyright (C) 2012 Vicente J. Botet Escriba
|
2
|
+
//
|
3
|
+
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
4
|
+
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
5
|
+
|
6
|
+
// 2013/04 Vicente J. Botet Escriba
|
7
|
+
// Provide implementation up to 9 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined.
|
8
|
+
// Make use of Boost.Move
|
9
|
+
// Make use of Boost.Tuple (movable)
|
10
|
+
// 2012/11 Vicente J. Botet Escriba
|
11
|
+
// Adapt to boost libc++ implementation
|
12
|
+
|
13
|
+
//===----------------------------------------------------------------------===//
|
14
|
+
//
|
15
|
+
// The LLVM Compiler Infrastructure
|
16
|
+
//
|
17
|
+
// This file is dual licensed under the MIT and the University of Illinois Open
|
18
|
+
// Source Licenses. See LICENSE.TXT for details.
|
19
|
+
//
|
20
|
+
// The async_func code is based on the one from libcxx.
|
21
|
+
//===----------------------------------------------------------------------===//
|
22
|
+
|
23
|
+
#ifndef BOOST_THREAD_DETAIL_ASYNC_FUNCT_HPP
|
24
|
+
#define BOOST_THREAD_DETAIL_ASYNC_FUNCT_HPP
|
25
|
+
|
26
|
+
#include <boost/config.hpp>
|
27
|
+
|
28
|
+
#include <boost/utility/result_of.hpp>
|
29
|
+
#include <boost/thread/detail/move.hpp>
|
30
|
+
#include <boost/thread/detail/invoke.hpp>
|
31
|
+
#include <boost/thread/detail/make_tuple_indices.hpp>
|
32
|
+
|
33
|
+
#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
|
34
|
+
! defined(BOOST_NO_CXX11_HDR_TUPLE)
|
35
|
+
#include <tuple>
|
36
|
+
#else
|
37
|
+
#include <boost/tuple/tuple.hpp>
|
38
|
+
#endif
|
39
|
+
|
40
|
+
namespace boost
|
41
|
+
{
|
42
|
+
namespace detail
|
43
|
+
{
|
44
|
+
|
45
|
+
#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
|
46
|
+
! defined(BOOST_NO_CXX11_HDR_TUPLE)
|
47
|
+
|
48
|
+
template <class Fp, class ... Args>
|
49
|
+
class async_func
|
50
|
+
{
|
51
|
+
std::tuple<Fp, Args...> f_;
|
52
|
+
|
53
|
+
public:
|
54
|
+
BOOST_THREAD_MOVABLE_ONLY( async_func)
|
55
|
+
//typedef typename invoke_of<_Fp, _Args...>::type Rp;
|
56
|
+
typedef typename result_of<Fp(Args...)>::type result_type;
|
57
|
+
|
58
|
+
BOOST_SYMBOL_VISIBLE
|
59
|
+
explicit async_func(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args)... args)
|
60
|
+
: f_(boost::move(f), boost::move(args)...)
|
61
|
+
{}
|
62
|
+
|
63
|
+
BOOST_SYMBOL_VISIBLE
|
64
|
+
async_func(BOOST_THREAD_RV_REF(async_func) f) : f_(boost::move(f.f_))
|
65
|
+
{}
|
66
|
+
|
67
|
+
result_type operator()()
|
68
|
+
{
|
69
|
+
typedef typename make_tuple_indices<1+sizeof...(Args), 1>::type Index;
|
70
|
+
return execute(Index());
|
71
|
+
}
|
72
|
+
private:
|
73
|
+
template <size_t ...Indices>
|
74
|
+
result_type
|
75
|
+
execute(tuple_indices<Indices...>)
|
76
|
+
{
|
77
|
+
return invoke(boost::move(std::get<0>(f_)), boost::move(std::get<Indices>(f_))...);
|
78
|
+
}
|
79
|
+
};
|
80
|
+
//BOOST_THREAD_DCL_MOVABLE_BEG(X) async_func<Fp> BOOST_THREAD_DCL_MOVABLE_END
|
81
|
+
#else
|
82
|
+
template <class Fp,
|
83
|
+
class T0 = tuples::null_type, class T1 = tuples::null_type, class T2 = tuples::null_type,
|
84
|
+
class T3 = tuples::null_type, class T4 = tuples::null_type, class T5 = tuples::null_type,
|
85
|
+
class T6 = tuples::null_type, class T7 = tuples::null_type, class T8 = tuples::null_type
|
86
|
+
, class T9 = tuples::null_type
|
87
|
+
>
|
88
|
+
class async_func;
|
89
|
+
|
90
|
+
template <class Fp,
|
91
|
+
class T0 , class T1 , class T2 ,
|
92
|
+
class T3 , class T4 , class T5 ,
|
93
|
+
class T6 , class T7 , class T8 >
|
94
|
+
class async_func<Fp, T0, T1, T2, T3, T4, T5, T6, T7, T8>
|
95
|
+
{
|
96
|
+
Fp fp_;
|
97
|
+
T0 v0_;
|
98
|
+
T1 v1_;
|
99
|
+
T2 v2_;
|
100
|
+
T3 v3_;
|
101
|
+
T4 v4_;
|
102
|
+
T5 v5_;
|
103
|
+
T6 v6_;
|
104
|
+
T7 v7_;
|
105
|
+
T8 v8_;
|
106
|
+
//::boost::tuple<Fp, T0, T1, T2, T3, T4, T5, T6, T7, T8> f_;
|
107
|
+
|
108
|
+
public:
|
109
|
+
BOOST_THREAD_MOVABLE_ONLY(async_func)
|
110
|
+
typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6, T7, T8)>::type result_type;
|
111
|
+
|
112
|
+
BOOST_SYMBOL_VISIBLE
|
113
|
+
explicit async_func(BOOST_THREAD_RV_REF(Fp) f
|
114
|
+
, BOOST_THREAD_RV_REF(T0) a0
|
115
|
+
, BOOST_THREAD_RV_REF(T1) a1
|
116
|
+
, BOOST_THREAD_RV_REF(T2) a2
|
117
|
+
, BOOST_THREAD_RV_REF(T3) a3
|
118
|
+
, BOOST_THREAD_RV_REF(T4) a4
|
119
|
+
, BOOST_THREAD_RV_REF(T5) a5
|
120
|
+
, BOOST_THREAD_RV_REF(T6) a6
|
121
|
+
, BOOST_THREAD_RV_REF(T7) a7
|
122
|
+
, BOOST_THREAD_RV_REF(T8) a8
|
123
|
+
)
|
124
|
+
: fp_(boost::move(f))
|
125
|
+
, v0_(boost::move(a0))
|
126
|
+
, v1_(boost::move(a1))
|
127
|
+
, v2_(boost::move(a2))
|
128
|
+
, v3_(boost::move(a3))
|
129
|
+
, v4_(boost::move(a4))
|
130
|
+
, v5_(boost::move(a5))
|
131
|
+
, v6_(boost::move(a6))
|
132
|
+
, v7_(boost::move(a7))
|
133
|
+
, v8_(boost::move(a8))
|
134
|
+
{}
|
135
|
+
|
136
|
+
BOOST_SYMBOL_VISIBLE
|
137
|
+
async_func(BOOST_THREAD_RV_REF(async_func) f)
|
138
|
+
: fp_(boost::move(f.fp))
|
139
|
+
, v0_(boost::move(f.a0))
|
140
|
+
, v1_(boost::move(f.a1))
|
141
|
+
, v2_(boost::move(f.a2))
|
142
|
+
, v3_(boost::move(f.a3))
|
143
|
+
, v4_(boost::move(f.a4))
|
144
|
+
, v5_(boost::move(f.a5))
|
145
|
+
, v6_(boost::move(f.a6))
|
146
|
+
, v7_(boost::move(f.a7))
|
147
|
+
, v8_(boost::move(f.a8))
|
148
|
+
{}
|
149
|
+
|
150
|
+
result_type operator()()
|
151
|
+
{
|
152
|
+
return invoke(boost::move(fp_)
|
153
|
+
, boost::move(v0_)
|
154
|
+
, boost::move(v1_)
|
155
|
+
, boost::move(v2_)
|
156
|
+
, boost::move(v3_)
|
157
|
+
, boost::move(v4_)
|
158
|
+
, boost::move(v5_)
|
159
|
+
, boost::move(v6_)
|
160
|
+
, boost::move(v7_)
|
161
|
+
, boost::move(v8_)
|
162
|
+
);
|
163
|
+
}
|
164
|
+
};
|
165
|
+
template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7 >
|
166
|
+
class async_func<Fp, T0, T1, T2, T3, T4, T5, T6, T7>
|
167
|
+
{
|
168
|
+
Fp fp_;
|
169
|
+
T0 v0_;
|
170
|
+
T1 v1_;
|
171
|
+
T2 v2_;
|
172
|
+
T3 v3_;
|
173
|
+
T4 v4_;
|
174
|
+
T5 v5_;
|
175
|
+
T6 v6_;
|
176
|
+
T7 v7_;
|
177
|
+
public:
|
178
|
+
BOOST_THREAD_MOVABLE_ONLY(async_func)
|
179
|
+
typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6, T7)>::type result_type;
|
180
|
+
|
181
|
+
BOOST_SYMBOL_VISIBLE
|
182
|
+
explicit async_func(BOOST_THREAD_RV_REF(Fp) f
|
183
|
+
, BOOST_THREAD_RV_REF(T0) a0
|
184
|
+
, BOOST_THREAD_RV_REF(T1) a1
|
185
|
+
, BOOST_THREAD_RV_REF(T2) a2
|
186
|
+
, BOOST_THREAD_RV_REF(T3) a3
|
187
|
+
, BOOST_THREAD_RV_REF(T4) a4
|
188
|
+
, BOOST_THREAD_RV_REF(T5) a5
|
189
|
+
, BOOST_THREAD_RV_REF(T6) a6
|
190
|
+
, BOOST_THREAD_RV_REF(T7) a7
|
191
|
+
)
|
192
|
+
: fp_(boost::move(f))
|
193
|
+
, v0_(boost::move(a0))
|
194
|
+
, v1_(boost::move(a1))
|
195
|
+
, v2_(boost::move(a2))
|
196
|
+
, v3_(boost::move(a3))
|
197
|
+
, v4_(boost::move(a4))
|
198
|
+
, v5_(boost::move(a5))
|
199
|
+
, v6_(boost::move(a6))
|
200
|
+
, v7_(boost::move(a7))
|
201
|
+
{}
|
202
|
+
|
203
|
+
BOOST_SYMBOL_VISIBLE
|
204
|
+
async_func(BOOST_THREAD_RV_REF(async_func) f)
|
205
|
+
: fp_(boost::move(f.fp))
|
206
|
+
, v0_(boost::move(f.a0))
|
207
|
+
, v1_(boost::move(f.a1))
|
208
|
+
, v2_(boost::move(f.a2))
|
209
|
+
, v3_(boost::move(f.a3))
|
210
|
+
, v4_(boost::move(f.a4))
|
211
|
+
, v5_(boost::move(f.a5))
|
212
|
+
, v6_(boost::move(f.a6))
|
213
|
+
, v7_(boost::move(f.a7))
|
214
|
+
{}
|
215
|
+
|
216
|
+
result_type operator()()
|
217
|
+
{
|
218
|
+
return invoke(boost::move(fp_)
|
219
|
+
, boost::move(v0_)
|
220
|
+
, boost::move(v1_)
|
221
|
+
, boost::move(v2_)
|
222
|
+
, boost::move(v3_)
|
223
|
+
, boost::move(v4_)
|
224
|
+
, boost::move(v5_)
|
225
|
+
, boost::move(v6_)
|
226
|
+
, boost::move(v7_)
|
227
|
+
);
|
228
|
+
}
|
229
|
+
};
|
230
|
+
template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5, class T6>
|
231
|
+
class async_func<Fp, T0, T1, T2, T3, T4, T5, T6>
|
232
|
+
{
|
233
|
+
Fp fp_;
|
234
|
+
T0 v0_;
|
235
|
+
T1 v1_;
|
236
|
+
T2 v2_;
|
237
|
+
T3 v3_;
|
238
|
+
T4 v4_;
|
239
|
+
T5 v5_;
|
240
|
+
T6 v6_;
|
241
|
+
public:
|
242
|
+
BOOST_THREAD_MOVABLE_ONLY(async_func)
|
243
|
+
typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6)>::type result_type;
|
244
|
+
|
245
|
+
BOOST_SYMBOL_VISIBLE
|
246
|
+
explicit async_func(BOOST_THREAD_RV_REF(Fp) f
|
247
|
+
, BOOST_THREAD_RV_REF(T0) a0
|
248
|
+
, BOOST_THREAD_RV_REF(T1) a1
|
249
|
+
, BOOST_THREAD_RV_REF(T2) a2
|
250
|
+
, BOOST_THREAD_RV_REF(T3) a3
|
251
|
+
, BOOST_THREAD_RV_REF(T4) a4
|
252
|
+
, BOOST_THREAD_RV_REF(T5) a5
|
253
|
+
, BOOST_THREAD_RV_REF(T6) a6
|
254
|
+
)
|
255
|
+
: fp_(boost::move(f))
|
256
|
+
, v0_(boost::move(a0))
|
257
|
+
, v1_(boost::move(a1))
|
258
|
+
, v2_(boost::move(a2))
|
259
|
+
, v3_(boost::move(a3))
|
260
|
+
, v4_(boost::move(a4))
|
261
|
+
, v5_(boost::move(a5))
|
262
|
+
, v6_(boost::move(a6))
|
263
|
+
{}
|
264
|
+
|
265
|
+
BOOST_SYMBOL_VISIBLE
|
266
|
+
async_func(BOOST_THREAD_RV_REF(async_func) f)
|
267
|
+
: fp_(boost::move(f.fp))
|
268
|
+
, v0_(boost::move(f.a0))
|
269
|
+
, v1_(boost::move(f.a1))
|
270
|
+
, v2_(boost::move(f.a2))
|
271
|
+
, v3_(boost::move(f.a3))
|
272
|
+
, v4_(boost::move(f.a4))
|
273
|
+
, v5_(boost::move(f.a5))
|
274
|
+
, v6_(boost::move(f.a6))
|
275
|
+
{}
|
276
|
+
|
277
|
+
result_type operator()()
|
278
|
+
{
|
279
|
+
return invoke(boost::move(fp_)
|
280
|
+
, boost::move(v0_)
|
281
|
+
, boost::move(v1_)
|
282
|
+
, boost::move(v2_)
|
283
|
+
, boost::move(v3_)
|
284
|
+
, boost::move(v4_)
|
285
|
+
, boost::move(v5_)
|
286
|
+
, boost::move(v6_)
|
287
|
+
);
|
288
|
+
}
|
289
|
+
};
|
290
|
+
template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5>
|
291
|
+
class async_func<Fp, T0, T1, T2, T3, T4, T5>
|
292
|
+
{
|
293
|
+
Fp fp_;
|
294
|
+
T0 v0_;
|
295
|
+
T1 v1_;
|
296
|
+
T2 v2_;
|
297
|
+
T3 v3_;
|
298
|
+
T4 v4_;
|
299
|
+
T5 v5_;
|
300
|
+
public:
|
301
|
+
BOOST_THREAD_MOVABLE_ONLY(async_func)
|
302
|
+
typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5)>::type result_type;
|
303
|
+
|
304
|
+
BOOST_SYMBOL_VISIBLE
|
305
|
+
explicit async_func(BOOST_THREAD_RV_REF(Fp) f
|
306
|
+
, BOOST_THREAD_RV_REF(T0) a0
|
307
|
+
, BOOST_THREAD_RV_REF(T1) a1
|
308
|
+
, BOOST_THREAD_RV_REF(T2) a2
|
309
|
+
, BOOST_THREAD_RV_REF(T3) a3
|
310
|
+
, BOOST_THREAD_RV_REF(T4) a4
|
311
|
+
, BOOST_THREAD_RV_REF(T5) a5
|
312
|
+
)
|
313
|
+
: fp_(boost::move(f))
|
314
|
+
, v0_(boost::move(a0))
|
315
|
+
, v1_(boost::move(a1))
|
316
|
+
, v2_(boost::move(a2))
|
317
|
+
, v3_(boost::move(a3))
|
318
|
+
, v4_(boost::move(a4))
|
319
|
+
, v5_(boost::move(a5))
|
320
|
+
{}
|
321
|
+
|
322
|
+
BOOST_SYMBOL_VISIBLE
|
323
|
+
async_func(BOOST_THREAD_RV_REF(async_func) f)
|
324
|
+
: fp_(boost::move(f.fp))
|
325
|
+
, v0_(boost::move(f.a0))
|
326
|
+
, v1_(boost::move(f.a1))
|
327
|
+
, v2_(boost::move(f.a2))
|
328
|
+
, v3_(boost::move(f.a3))
|
329
|
+
, v4_(boost::move(f.a4))
|
330
|
+
, v5_(boost::move(f.a5))
|
331
|
+
{}
|
332
|
+
|
333
|
+
result_type operator()()
|
334
|
+
{
|
335
|
+
return invoke(boost::move(fp_)
|
336
|
+
, boost::move(v0_)
|
337
|
+
, boost::move(v1_)
|
338
|
+
, boost::move(v2_)
|
339
|
+
, boost::move(v3_)
|
340
|
+
, boost::move(v4_)
|
341
|
+
, boost::move(v5_)
|
342
|
+
);
|
343
|
+
}
|
344
|
+
};
|
345
|
+
template <class Fp, class T0, class T1, class T2, class T3, class T4>
|
346
|
+
class async_func<Fp, T0, T1, T2, T3, T4>
|
347
|
+
{
|
348
|
+
Fp fp_;
|
349
|
+
T0 v0_;
|
350
|
+
T1 v1_;
|
351
|
+
T2 v2_;
|
352
|
+
T3 v3_;
|
353
|
+
T4 v4_;
|
354
|
+
public:
|
355
|
+
BOOST_THREAD_MOVABLE_ONLY(async_func)
|
356
|
+
typedef typename result_of<Fp(T0, T1, T2, T3, T4)>::type result_type;
|
357
|
+
|
358
|
+
BOOST_SYMBOL_VISIBLE
|
359
|
+
explicit async_func(BOOST_THREAD_RV_REF(Fp) f
|
360
|
+
, BOOST_THREAD_RV_REF(T0) a0
|
361
|
+
, BOOST_THREAD_RV_REF(T1) a1
|
362
|
+
, BOOST_THREAD_RV_REF(T2) a2
|
363
|
+
, BOOST_THREAD_RV_REF(T3) a3
|
364
|
+
, BOOST_THREAD_RV_REF(T4) a4
|
365
|
+
)
|
366
|
+
: fp_(boost::move(f))
|
367
|
+
, v0_(boost::move(a0))
|
368
|
+
, v1_(boost::move(a1))
|
369
|
+
, v2_(boost::move(a2))
|
370
|
+
, v3_(boost::move(a3))
|
371
|
+
, v4_(boost::move(a4))
|
372
|
+
{}
|
373
|
+
|
374
|
+
BOOST_SYMBOL_VISIBLE
|
375
|
+
async_func(BOOST_THREAD_RV_REF(async_func) f)
|
376
|
+
: fp_(boost::move(f.fp))
|
377
|
+
, v0_(boost::move(f.a0))
|
378
|
+
, v1_(boost::move(f.a1))
|
379
|
+
, v2_(boost::move(f.a2))
|
380
|
+
, v3_(boost::move(f.a3))
|
381
|
+
, v4_(boost::move(f.a4))
|
382
|
+
{}
|
383
|
+
|
384
|
+
result_type operator()()
|
385
|
+
{
|
386
|
+
return invoke(boost::move(fp_)
|
387
|
+
, boost::move(v0_)
|
388
|
+
, boost::move(v1_)
|
389
|
+
, boost::move(v2_)
|
390
|
+
, boost::move(v3_)
|
391
|
+
, boost::move(v4_)
|
392
|
+
);
|
393
|
+
}
|
394
|
+
};
|
395
|
+
template <class Fp, class T0, class T1, class T2, class T3>
|
396
|
+
class async_func<Fp, T0, T1, T2, T3>
|
397
|
+
{
|
398
|
+
Fp fp_;
|
399
|
+
T0 v0_;
|
400
|
+
T1 v1_;
|
401
|
+
T2 v2_;
|
402
|
+
T3 v3_;
|
403
|
+
public:
|
404
|
+
BOOST_THREAD_MOVABLE_ONLY(async_func)
|
405
|
+
typedef typename result_of<Fp(T0, T1, T2, T3)>::type result_type;
|
406
|
+
|
407
|
+
BOOST_SYMBOL_VISIBLE
|
408
|
+
explicit async_func(BOOST_THREAD_RV_REF(Fp) f
|
409
|
+
, BOOST_THREAD_RV_REF(T0) a0
|
410
|
+
, BOOST_THREAD_RV_REF(T1) a1
|
411
|
+
, BOOST_THREAD_RV_REF(T2) a2
|
412
|
+
, BOOST_THREAD_RV_REF(T3) a3
|
413
|
+
)
|
414
|
+
: fp_(boost::move(f))
|
415
|
+
, v0_(boost::move(a0))
|
416
|
+
, v1_(boost::move(a1))
|
417
|
+
, v2_(boost::move(a2))
|
418
|
+
, v3_(boost::move(a3))
|
419
|
+
{}
|
420
|
+
|
421
|
+
BOOST_SYMBOL_VISIBLE
|
422
|
+
async_func(BOOST_THREAD_RV_REF(async_func) f)
|
423
|
+
: fp_(boost::move(f.fp))
|
424
|
+
, v0_(boost::move(f.a0))
|
425
|
+
, v1_(boost::move(f.a1))
|
426
|
+
, v2_(boost::move(f.a2))
|
427
|
+
, v3_(boost::move(f.a3))
|
428
|
+
{}
|
429
|
+
|
430
|
+
result_type operator()()
|
431
|
+
{
|
432
|
+
return invoke(boost::move(fp_)
|
433
|
+
, boost::move(v0_)
|
434
|
+
, boost::move(v1_)
|
435
|
+
, boost::move(v2_)
|
436
|
+
, boost::move(v3_)
|
437
|
+
);
|
438
|
+
}
|
439
|
+
};
|
440
|
+
template <class Fp, class T0, class T1, class T2>
|
441
|
+
class async_func<Fp, T0, T1, T2>
|
442
|
+
{
|
443
|
+
Fp fp_;
|
444
|
+
T0 v0_;
|
445
|
+
T1 v1_;
|
446
|
+
T2 v2_;
|
447
|
+
public:
|
448
|
+
BOOST_THREAD_MOVABLE_ONLY(async_func)
|
449
|
+
typedef typename result_of<Fp(T0, T1, T2)>::type result_type;
|
450
|
+
|
451
|
+
BOOST_SYMBOL_VISIBLE
|
452
|
+
explicit async_func(BOOST_THREAD_RV_REF(Fp) f
|
453
|
+
, BOOST_THREAD_RV_REF(T0) a0
|
454
|
+
, BOOST_THREAD_RV_REF(T1) a1
|
455
|
+
, BOOST_THREAD_RV_REF(T2) a2
|
456
|
+
)
|
457
|
+
: fp_(boost::move(f))
|
458
|
+
, v0_(boost::move(a0))
|
459
|
+
, v1_(boost::move(a1))
|
460
|
+
, v2_(boost::move(a2))
|
461
|
+
{}
|
462
|
+
|
463
|
+
BOOST_SYMBOL_VISIBLE
|
464
|
+
async_func(BOOST_THREAD_RV_REF(async_func) f)
|
465
|
+
: fp_(boost::move(f.fp))
|
466
|
+
, v0_(boost::move(f.a0))
|
467
|
+
, v1_(boost::move(f.a1))
|
468
|
+
, v2_(boost::move(f.a2))
|
469
|
+
{}
|
470
|
+
|
471
|
+
result_type operator()()
|
472
|
+
{
|
473
|
+
return invoke(boost::move(fp_)
|
474
|
+
, boost::move(v0_)
|
475
|
+
, boost::move(v1_)
|
476
|
+
, boost::move(v2_)
|
477
|
+
);
|
478
|
+
}
|
479
|
+
};
|
480
|
+
template <class Fp, class T0, class T1>
|
481
|
+
class async_func<Fp, T0, T1>
|
482
|
+
{
|
483
|
+
Fp fp_;
|
484
|
+
T0 v0_;
|
485
|
+
T1 v1_;
|
486
|
+
public:
|
487
|
+
BOOST_THREAD_MOVABLE_ONLY(async_func)
|
488
|
+
typedef typename result_of<Fp(T0, T1)>::type result_type;
|
489
|
+
|
490
|
+
BOOST_SYMBOL_VISIBLE
|
491
|
+
explicit async_func(BOOST_THREAD_RV_REF(Fp) f
|
492
|
+
, BOOST_THREAD_RV_REF(T0) a0
|
493
|
+
, BOOST_THREAD_RV_REF(T1) a1
|
494
|
+
)
|
495
|
+
: fp_(boost::move(f))
|
496
|
+
, v0_(boost::move(a0))
|
497
|
+
, v1_(boost::move(a1))
|
498
|
+
{}
|
499
|
+
|
500
|
+
BOOST_SYMBOL_VISIBLE
|
501
|
+
async_func(BOOST_THREAD_RV_REF(async_func) f)
|
502
|
+
: fp_(boost::move(f.fp))
|
503
|
+
, v0_(boost::move(f.a0))
|
504
|
+
, v1_(boost::move(f.a1))
|
505
|
+
{}
|
506
|
+
|
507
|
+
result_type operator()()
|
508
|
+
{
|
509
|
+
return invoke(boost::move(fp_)
|
510
|
+
, boost::move(v0_)
|
511
|
+
, boost::move(v1_)
|
512
|
+
);
|
513
|
+
}
|
514
|
+
};
|
515
|
+
template <class Fp, class T0>
|
516
|
+
class async_func<Fp, T0>
|
517
|
+
{
|
518
|
+
Fp fp_;
|
519
|
+
T0 v0_;
|
520
|
+
public:
|
521
|
+
BOOST_THREAD_MOVABLE_ONLY(async_func)
|
522
|
+
typedef typename result_of<Fp(T0)>::type result_type;
|
523
|
+
|
524
|
+
BOOST_SYMBOL_VISIBLE
|
525
|
+
explicit async_func(BOOST_THREAD_RV_REF(Fp) f
|
526
|
+
, BOOST_THREAD_RV_REF(T0) a0
|
527
|
+
)
|
528
|
+
: fp_(boost::move(f))
|
529
|
+
, v0_(boost::move(a0))
|
530
|
+
{}
|
531
|
+
|
532
|
+
BOOST_SYMBOL_VISIBLE
|
533
|
+
async_func(BOOST_THREAD_RV_REF(async_func) f)
|
534
|
+
: fp_(boost::move(f.fp))
|
535
|
+
, v0_(boost::move(f.a0))
|
536
|
+
{}
|
537
|
+
|
538
|
+
result_type operator()()
|
539
|
+
{
|
540
|
+
return invoke(boost::move(fp_)
|
541
|
+
, boost::move(v0_)
|
542
|
+
);
|
543
|
+
}
|
544
|
+
};
|
545
|
+
template <class Fp>
|
546
|
+
class async_func<Fp>
|
547
|
+
{
|
548
|
+
Fp fp_;
|
549
|
+
public:
|
550
|
+
BOOST_THREAD_COPYABLE_AND_MOVABLE(async_func)
|
551
|
+
typedef typename result_of<Fp()>::type result_type;
|
552
|
+
BOOST_SYMBOL_VISIBLE
|
553
|
+
explicit async_func(BOOST_THREAD_FWD_REF(Fp) f)
|
554
|
+
: fp_(boost::move(f))
|
555
|
+
{}
|
556
|
+
|
557
|
+
BOOST_SYMBOL_VISIBLE
|
558
|
+
async_func(BOOST_THREAD_FWD_REF(async_func) f)
|
559
|
+
: fp_(boost::move(f.fp_))
|
560
|
+
{}
|
561
|
+
result_type operator()()
|
562
|
+
{
|
563
|
+
return fp_();
|
564
|
+
}
|
565
|
+
};
|
566
|
+
#endif
|
567
|
+
|
568
|
+
}
|
569
|
+
}
|
570
|
+
|
571
|
+
#endif // header
|