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
@@ -0,0 +1,876 @@
|
|
1
|
+
|
2
|
+
// Copyright (C) 2003-2004 Jeremy B. Maitin-Shepard.
|
3
|
+
// Copyright (C) 2005-2011 Daniel James
|
4
|
+
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
5
|
+
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
6
|
+
|
7
|
+
#ifndef BOOST_UNORDERED_DETAIL_MANAGER_HPP_INCLUDED
|
8
|
+
#define BOOST_UNORDERED_DETAIL_MANAGER_HPP_INCLUDED
|
9
|
+
|
10
|
+
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
11
|
+
# pragma once
|
12
|
+
#endif
|
13
|
+
|
14
|
+
#include <boost/unordered/detail/util.hpp>
|
15
|
+
#include <boost/unordered/detail/allocate.hpp>
|
16
|
+
#include <boost/type_traits/aligned_storage.hpp>
|
17
|
+
#include <boost/type_traits/alignment_of.hpp>
|
18
|
+
#include <boost/type_traits/is_nothrow_move_constructible.hpp>
|
19
|
+
#include <boost/type_traits/is_nothrow_move_assignable.hpp>
|
20
|
+
#include <boost/swap.hpp>
|
21
|
+
#include <boost/assert.hpp>
|
22
|
+
#include <boost/limits.hpp>
|
23
|
+
#include <boost/iterator.hpp>
|
24
|
+
|
25
|
+
namespace boost { namespace unordered { namespace detail {
|
26
|
+
|
27
|
+
template <typename Types> struct table;
|
28
|
+
template <typename NodePointer> struct bucket;
|
29
|
+
struct ptr_bucket;
|
30
|
+
template <typename Types> struct table_impl;
|
31
|
+
template <typename Types> struct grouped_table_impl;
|
32
|
+
|
33
|
+
}}}
|
34
|
+
|
35
|
+
namespace boost { namespace unordered { namespace iterator_detail {
|
36
|
+
|
37
|
+
////////////////////////////////////////////////////////////////////////////
|
38
|
+
// Iterators
|
39
|
+
//
|
40
|
+
// all no throw
|
41
|
+
|
42
|
+
template <typename Node> struct iterator;
|
43
|
+
template <typename Node, typename ConstNodePointer> struct c_iterator;
|
44
|
+
template <typename Node, typename Policy> struct l_iterator;
|
45
|
+
template <typename Node, typename ConstNodePointer, typename Policy>
|
46
|
+
struct cl_iterator;
|
47
|
+
|
48
|
+
// Local Iterators
|
49
|
+
//
|
50
|
+
// all no throw
|
51
|
+
|
52
|
+
template <typename Node, typename Policy>
|
53
|
+
struct l_iterator
|
54
|
+
: public boost::iterator<
|
55
|
+
std::forward_iterator_tag,
|
56
|
+
typename Node::value_type,
|
57
|
+
std::ptrdiff_t,
|
58
|
+
typename Node::node_pointer,
|
59
|
+
typename Node::value_type&>
|
60
|
+
{
|
61
|
+
#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
|
62
|
+
template <typename Node2, typename ConstNodePointer, typename Policy2>
|
63
|
+
friend struct boost::unordered::iterator_detail::cl_iterator;
|
64
|
+
private:
|
65
|
+
#endif
|
66
|
+
typedef typename Node::node_pointer node_pointer;
|
67
|
+
typedef boost::unordered::iterator_detail::iterator<Node> iterator;
|
68
|
+
node_pointer ptr_;
|
69
|
+
std::size_t bucket_;
|
70
|
+
std::size_t bucket_count_;
|
71
|
+
|
72
|
+
public:
|
73
|
+
|
74
|
+
typedef typename Node::value_type value_type;
|
75
|
+
|
76
|
+
l_iterator() : ptr_() {}
|
77
|
+
|
78
|
+
l_iterator(iterator x, std::size_t b, std::size_t c)
|
79
|
+
: ptr_(x.node_), bucket_(b), bucket_count_(c) {}
|
80
|
+
|
81
|
+
value_type& operator*() const {
|
82
|
+
return ptr_->value();
|
83
|
+
}
|
84
|
+
|
85
|
+
value_type* operator->() const {
|
86
|
+
return ptr_->value_ptr();
|
87
|
+
}
|
88
|
+
|
89
|
+
l_iterator& operator++() {
|
90
|
+
ptr_ = static_cast<node_pointer>(ptr_->next_);
|
91
|
+
if (ptr_ && Policy::to_bucket(bucket_count_, ptr_->hash_)
|
92
|
+
!= bucket_)
|
93
|
+
ptr_ = node_pointer();
|
94
|
+
return *this;
|
95
|
+
}
|
96
|
+
|
97
|
+
l_iterator operator++(int) {
|
98
|
+
l_iterator tmp(*this);
|
99
|
+
++(*this);
|
100
|
+
return tmp;
|
101
|
+
}
|
102
|
+
|
103
|
+
bool operator==(l_iterator x) const {
|
104
|
+
return ptr_ == x.ptr_;
|
105
|
+
}
|
106
|
+
|
107
|
+
bool operator!=(l_iterator x) const {
|
108
|
+
return ptr_ != x.ptr_;
|
109
|
+
}
|
110
|
+
};
|
111
|
+
|
112
|
+
template <typename Node, typename ConstNodePointer, typename Policy>
|
113
|
+
struct cl_iterator
|
114
|
+
: public boost::iterator<
|
115
|
+
std::forward_iterator_tag,
|
116
|
+
typename Node::value_type,
|
117
|
+
std::ptrdiff_t,
|
118
|
+
ConstNodePointer,
|
119
|
+
typename Node::value_type const&>
|
120
|
+
{
|
121
|
+
friend struct boost::unordered::iterator_detail::l_iterator
|
122
|
+
<Node, Policy>;
|
123
|
+
private:
|
124
|
+
|
125
|
+
typedef typename Node::node_pointer node_pointer;
|
126
|
+
typedef boost::unordered::iterator_detail::iterator<Node> iterator;
|
127
|
+
node_pointer ptr_;
|
128
|
+
std::size_t bucket_;
|
129
|
+
std::size_t bucket_count_;
|
130
|
+
|
131
|
+
public:
|
132
|
+
|
133
|
+
typedef typename Node::value_type value_type;
|
134
|
+
|
135
|
+
cl_iterator() : ptr_() {}
|
136
|
+
|
137
|
+
cl_iterator(iterator x, std::size_t b, std::size_t c) :
|
138
|
+
ptr_(x.node_), bucket_(b), bucket_count_(c) {}
|
139
|
+
|
140
|
+
cl_iterator(boost::unordered::iterator_detail::l_iterator<
|
141
|
+
Node, Policy> const& x) :
|
142
|
+
ptr_(x.ptr_), bucket_(x.bucket_), bucket_count_(x.bucket_count_)
|
143
|
+
{}
|
144
|
+
|
145
|
+
value_type const& operator*() const {
|
146
|
+
return ptr_->value();
|
147
|
+
}
|
148
|
+
|
149
|
+
value_type const* operator->() const {
|
150
|
+
return ptr_->value_ptr();
|
151
|
+
}
|
152
|
+
|
153
|
+
cl_iterator& operator++() {
|
154
|
+
ptr_ = static_cast<node_pointer>(ptr_->next_);
|
155
|
+
if (ptr_ && Policy::to_bucket(bucket_count_, ptr_->hash_)
|
156
|
+
!= bucket_)
|
157
|
+
ptr_ = node_pointer();
|
158
|
+
return *this;
|
159
|
+
}
|
160
|
+
|
161
|
+
cl_iterator operator++(int) {
|
162
|
+
cl_iterator tmp(*this);
|
163
|
+
++(*this);
|
164
|
+
return tmp;
|
165
|
+
}
|
166
|
+
|
167
|
+
friend bool operator==(cl_iterator const& x, cl_iterator const& y) {
|
168
|
+
return x.ptr_ == y.ptr_;
|
169
|
+
}
|
170
|
+
|
171
|
+
friend bool operator!=(cl_iterator const& x, cl_iterator const& y) {
|
172
|
+
return x.ptr_ != y.ptr_;
|
173
|
+
}
|
174
|
+
};
|
175
|
+
|
176
|
+
template <typename Node>
|
177
|
+
struct iterator
|
178
|
+
: public boost::iterator<
|
179
|
+
std::forward_iterator_tag,
|
180
|
+
typename Node::value_type,
|
181
|
+
std::ptrdiff_t,
|
182
|
+
typename Node::node_pointer,
|
183
|
+
typename Node::value_type&>
|
184
|
+
{
|
185
|
+
#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
|
186
|
+
template <typename, typename>
|
187
|
+
friend struct boost::unordered::iterator_detail::c_iterator;
|
188
|
+
template <typename, typename>
|
189
|
+
friend struct boost::unordered::iterator_detail::l_iterator;
|
190
|
+
template <typename, typename, typename>
|
191
|
+
friend struct boost::unordered::iterator_detail::cl_iterator;
|
192
|
+
template <typename>
|
193
|
+
friend struct boost::unordered::detail::table;
|
194
|
+
template <typename>
|
195
|
+
friend struct boost::unordered::detail::table_impl;
|
196
|
+
template <typename>
|
197
|
+
friend struct boost::unordered::detail::grouped_table_impl;
|
198
|
+
private:
|
199
|
+
#endif
|
200
|
+
typedef typename Node::node_pointer node_pointer;
|
201
|
+
node_pointer node_;
|
202
|
+
|
203
|
+
public:
|
204
|
+
|
205
|
+
typedef typename Node::value_type value_type;
|
206
|
+
|
207
|
+
iterator() : node_() {}
|
208
|
+
|
209
|
+
explicit iterator(typename Node::link_pointer x) :
|
210
|
+
node_(static_cast<node_pointer>(x)) {}
|
211
|
+
|
212
|
+
value_type& operator*() const {
|
213
|
+
return node_->value();
|
214
|
+
}
|
215
|
+
|
216
|
+
value_type* operator->() const {
|
217
|
+
return &node_->value();
|
218
|
+
}
|
219
|
+
|
220
|
+
iterator& operator++() {
|
221
|
+
node_ = static_cast<node_pointer>(node_->next_);
|
222
|
+
return *this;
|
223
|
+
}
|
224
|
+
|
225
|
+
iterator operator++(int) {
|
226
|
+
iterator tmp(node_);
|
227
|
+
node_ = static_cast<node_pointer>(node_->next_);
|
228
|
+
return tmp;
|
229
|
+
}
|
230
|
+
|
231
|
+
bool operator==(iterator const& x) const {
|
232
|
+
return node_ == x.node_;
|
233
|
+
}
|
234
|
+
|
235
|
+
bool operator!=(iterator const& x) const {
|
236
|
+
return node_ != x.node_;
|
237
|
+
}
|
238
|
+
};
|
239
|
+
|
240
|
+
template <typename Node, typename ConstNodePointer>
|
241
|
+
struct c_iterator
|
242
|
+
: public boost::iterator<
|
243
|
+
std::forward_iterator_tag,
|
244
|
+
typename Node::value_type,
|
245
|
+
std::ptrdiff_t,
|
246
|
+
ConstNodePointer,
|
247
|
+
typename Node::value_type const&>
|
248
|
+
{
|
249
|
+
friend struct boost::unordered::iterator_detail::iterator<Node>;
|
250
|
+
|
251
|
+
#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
|
252
|
+
template <typename>
|
253
|
+
friend struct boost::unordered::detail::table;
|
254
|
+
template <typename>
|
255
|
+
friend struct boost::unordered::detail::table_impl;
|
256
|
+
template <typename>
|
257
|
+
friend struct boost::unordered::detail::grouped_table_impl;
|
258
|
+
|
259
|
+
private:
|
260
|
+
#endif
|
261
|
+
typedef typename Node::node_pointer node_pointer;
|
262
|
+
typedef boost::unordered::iterator_detail::iterator<Node> iterator;
|
263
|
+
node_pointer node_;
|
264
|
+
|
265
|
+
public:
|
266
|
+
|
267
|
+
typedef typename Node::value_type value_type;
|
268
|
+
|
269
|
+
c_iterator() : node_() {}
|
270
|
+
|
271
|
+
explicit c_iterator(typename Node::link_pointer x) :
|
272
|
+
node_(static_cast<node_pointer>(x)) {}
|
273
|
+
|
274
|
+
c_iterator(iterator const& x) : node_(x.node_) {}
|
275
|
+
|
276
|
+
value_type const& operator*() const {
|
277
|
+
return node_->value();
|
278
|
+
}
|
279
|
+
|
280
|
+
value_type const* operator->() const {
|
281
|
+
return &node_->value();
|
282
|
+
}
|
283
|
+
|
284
|
+
c_iterator& operator++() {
|
285
|
+
node_ = static_cast<node_pointer>(node_->next_);
|
286
|
+
return *this;
|
287
|
+
}
|
288
|
+
|
289
|
+
c_iterator operator++(int) {
|
290
|
+
c_iterator tmp(node_);
|
291
|
+
node_ = static_cast<node_pointer>(node_->next_);
|
292
|
+
return tmp;
|
293
|
+
}
|
294
|
+
|
295
|
+
friend bool operator==(c_iterator const& x, c_iterator const& y) {
|
296
|
+
return x.node_ == y.node_;
|
297
|
+
}
|
298
|
+
|
299
|
+
friend bool operator!=(c_iterator const& x, c_iterator const& y) {
|
300
|
+
return x.node_ != y.node_;
|
301
|
+
}
|
302
|
+
};
|
303
|
+
}}}
|
304
|
+
|
305
|
+
namespace boost { namespace unordered { namespace detail {
|
306
|
+
|
307
|
+
///////////////////////////////////////////////////////////////////
|
308
|
+
//
|
309
|
+
// Node construction
|
310
|
+
|
311
|
+
template <typename NodeAlloc>
|
312
|
+
struct node_constructor
|
313
|
+
{
|
314
|
+
private:
|
315
|
+
|
316
|
+
typedef NodeAlloc node_allocator;
|
317
|
+
typedef boost::unordered::detail::allocator_traits<NodeAlloc>
|
318
|
+
node_allocator_traits;
|
319
|
+
typedef typename node_allocator_traits::value_type node;
|
320
|
+
typedef typename node_allocator_traits::pointer node_pointer;
|
321
|
+
typedef typename node::value_type value_type;
|
322
|
+
|
323
|
+
protected:
|
324
|
+
|
325
|
+
node_allocator& alloc_;
|
326
|
+
node_pointer node_;
|
327
|
+
bool node_constructed_;
|
328
|
+
bool value_constructed_;
|
329
|
+
|
330
|
+
public:
|
331
|
+
|
332
|
+
node_constructor(node_allocator& n) :
|
333
|
+
alloc_(n),
|
334
|
+
node_(),
|
335
|
+
node_constructed_(false),
|
336
|
+
value_constructed_(false)
|
337
|
+
{
|
338
|
+
}
|
339
|
+
|
340
|
+
~node_constructor();
|
341
|
+
|
342
|
+
void construct();
|
343
|
+
|
344
|
+
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
345
|
+
void construct_with_value(BOOST_UNORDERED_EMPLACE_ARGS)
|
346
|
+
{
|
347
|
+
construct();
|
348
|
+
boost::unordered::detail::construct_value_impl(
|
349
|
+
alloc_, node_->value_ptr(), BOOST_UNORDERED_EMPLACE_FORWARD);
|
350
|
+
value_constructed_ = true;
|
351
|
+
}
|
352
|
+
|
353
|
+
template <typename A0>
|
354
|
+
void construct_with_value2(BOOST_FWD_REF(A0) a0)
|
355
|
+
{
|
356
|
+
construct();
|
357
|
+
boost::unordered::detail::construct_value_impl(
|
358
|
+
alloc_, node_->value_ptr(),
|
359
|
+
BOOST_UNORDERED_EMPLACE_ARGS1(boost::forward<A0>(a0)));
|
360
|
+
value_constructed_ = true;
|
361
|
+
}
|
362
|
+
|
363
|
+
value_type const& value() const {
|
364
|
+
BOOST_ASSERT(node_ && node_constructed_ && value_constructed_);
|
365
|
+
return node_->value();
|
366
|
+
}
|
367
|
+
|
368
|
+
// no throw
|
369
|
+
node_pointer release()
|
370
|
+
{
|
371
|
+
BOOST_ASSERT(node_ && node_constructed_);
|
372
|
+
node_pointer p = node_;
|
373
|
+
node_ = node_pointer();
|
374
|
+
return p;
|
375
|
+
}
|
376
|
+
|
377
|
+
private:
|
378
|
+
node_constructor(node_constructor const&);
|
379
|
+
node_constructor& operator=(node_constructor const&);
|
380
|
+
};
|
381
|
+
|
382
|
+
template <typename Alloc>
|
383
|
+
node_constructor<Alloc>::~node_constructor()
|
384
|
+
{
|
385
|
+
if (node_) {
|
386
|
+
if (value_constructed_) {
|
387
|
+
boost::unordered::detail::destroy_value_impl(alloc_,
|
388
|
+
node_->value_ptr());
|
389
|
+
}
|
390
|
+
|
391
|
+
if (node_constructed_) {
|
392
|
+
node_allocator_traits::destroy(alloc_,
|
393
|
+
boost::addressof(*node_));
|
394
|
+
}
|
395
|
+
|
396
|
+
node_allocator_traits::deallocate(alloc_, node_, 1);
|
397
|
+
}
|
398
|
+
}
|
399
|
+
|
400
|
+
template <typename Alloc>
|
401
|
+
void node_constructor<Alloc>::construct()
|
402
|
+
{
|
403
|
+
if(!node_) {
|
404
|
+
node_constructed_ = false;
|
405
|
+
value_constructed_ = false;
|
406
|
+
|
407
|
+
node_ = node_allocator_traits::allocate(alloc_, 1);
|
408
|
+
|
409
|
+
node_allocator_traits::construct(alloc_,
|
410
|
+
boost::addressof(*node_), node());
|
411
|
+
node_->init(node_);
|
412
|
+
node_constructed_ = true;
|
413
|
+
}
|
414
|
+
else {
|
415
|
+
BOOST_ASSERT(node_constructed_);
|
416
|
+
|
417
|
+
if (value_constructed_)
|
418
|
+
{
|
419
|
+
boost::unordered::detail::destroy_value_impl(alloc_,
|
420
|
+
node_->value_ptr());
|
421
|
+
value_constructed_ = false;
|
422
|
+
}
|
423
|
+
}
|
424
|
+
}
|
425
|
+
|
426
|
+
///////////////////////////////////////////////////////////////////
|
427
|
+
//
|
428
|
+
// Node Holder
|
429
|
+
//
|
430
|
+
// Temporary store for nodes. Deletes any that aren't used.
|
431
|
+
|
432
|
+
template <typename NodeAlloc>
|
433
|
+
struct node_holder : private node_constructor<NodeAlloc>
|
434
|
+
{
|
435
|
+
private:
|
436
|
+
typedef node_constructor<NodeAlloc> base;
|
437
|
+
|
438
|
+
typedef NodeAlloc node_allocator;
|
439
|
+
typedef boost::unordered::detail::allocator_traits<NodeAlloc>
|
440
|
+
node_allocator_traits;
|
441
|
+
typedef typename node_allocator_traits::value_type node;
|
442
|
+
typedef typename node_allocator_traits::pointer node_pointer;
|
443
|
+
typedef typename node::value_type value_type;
|
444
|
+
typedef typename node::link_pointer link_pointer;
|
445
|
+
typedef boost::unordered::iterator_detail::iterator<node> iterator;
|
446
|
+
|
447
|
+
node_pointer nodes_;
|
448
|
+
|
449
|
+
public:
|
450
|
+
|
451
|
+
template <typename Table>
|
452
|
+
explicit node_holder(Table& b) :
|
453
|
+
base(b.node_alloc()),
|
454
|
+
nodes_()
|
455
|
+
{
|
456
|
+
if (b.size_) {
|
457
|
+
typename Table::link_pointer prev = b.get_previous_start();
|
458
|
+
nodes_ = static_cast<node_pointer>(prev->next_);
|
459
|
+
prev->next_ = link_pointer();
|
460
|
+
b.size_ = 0;
|
461
|
+
}
|
462
|
+
}
|
463
|
+
|
464
|
+
~node_holder();
|
465
|
+
|
466
|
+
void node_for_assignment()
|
467
|
+
{
|
468
|
+
if (!this->node_ && nodes_) {
|
469
|
+
this->node_ = nodes_;
|
470
|
+
nodes_ = static_cast<node_pointer>(nodes_->next_);
|
471
|
+
this->node_->init(this->node_);
|
472
|
+
this->node_->next_ = link_pointer();
|
473
|
+
|
474
|
+
this->node_constructed_ = true;
|
475
|
+
this->value_constructed_ = true;
|
476
|
+
}
|
477
|
+
}
|
478
|
+
|
479
|
+
template <typename T>
|
480
|
+
inline void assign_impl(T const& v) {
|
481
|
+
if (this->node_ && this->value_constructed_) {
|
482
|
+
this->node_->value() = v;
|
483
|
+
}
|
484
|
+
else {
|
485
|
+
this->construct_with_value2(v);
|
486
|
+
}
|
487
|
+
}
|
488
|
+
|
489
|
+
template <typename T1, typename T2>
|
490
|
+
inline void assign_impl(std::pair<T1 const, T2> const& v) {
|
491
|
+
this->construct_with_value2(v);
|
492
|
+
}
|
493
|
+
|
494
|
+
template <typename T>
|
495
|
+
inline void move_assign_impl(T& v) {
|
496
|
+
if (this->node_ && this->value_constructed_) {
|
497
|
+
this->node_->value() = boost::move(v);
|
498
|
+
}
|
499
|
+
else {
|
500
|
+
this->construct_with_value2(boost::move(v));
|
501
|
+
}
|
502
|
+
}
|
503
|
+
|
504
|
+
template <typename T1, typename T2>
|
505
|
+
inline void move_assign_impl(std::pair<T1 const, T2>& v) {
|
506
|
+
this->construct_with_value2(boost::move(v));
|
507
|
+
}
|
508
|
+
|
509
|
+
node_pointer copy_of(value_type const& v)
|
510
|
+
{
|
511
|
+
node_for_assignment();
|
512
|
+
assign_impl(v);
|
513
|
+
return base::release();
|
514
|
+
}
|
515
|
+
|
516
|
+
node_pointer move_copy_of(value_type& v)
|
517
|
+
{
|
518
|
+
node_for_assignment();
|
519
|
+
move_assign_impl(v);
|
520
|
+
return base::release();
|
521
|
+
}
|
522
|
+
|
523
|
+
iterator begin() const
|
524
|
+
{
|
525
|
+
return iterator(nodes_);
|
526
|
+
}
|
527
|
+
};
|
528
|
+
|
529
|
+
template <typename Alloc>
|
530
|
+
node_holder<Alloc>::~node_holder()
|
531
|
+
{
|
532
|
+
while (nodes_) {
|
533
|
+
node_pointer p = nodes_;
|
534
|
+
nodes_ = static_cast<node_pointer>(p->next_);
|
535
|
+
|
536
|
+
boost::unordered::detail::destroy_value_impl(this->alloc_,
|
537
|
+
p->value_ptr());
|
538
|
+
node_allocator_traits::destroy(this->alloc_, boost::addressof(*p));
|
539
|
+
node_allocator_traits::deallocate(this->alloc_, p, 1);
|
540
|
+
}
|
541
|
+
}
|
542
|
+
|
543
|
+
///////////////////////////////////////////////////////////////////
|
544
|
+
//
|
545
|
+
// Bucket
|
546
|
+
|
547
|
+
template <typename NodePointer>
|
548
|
+
struct bucket
|
549
|
+
{
|
550
|
+
typedef NodePointer link_pointer;
|
551
|
+
link_pointer next_;
|
552
|
+
|
553
|
+
bucket() : next_() {}
|
554
|
+
|
555
|
+
link_pointer first_from_start()
|
556
|
+
{
|
557
|
+
return next_;
|
558
|
+
}
|
559
|
+
|
560
|
+
enum { extra_node = true };
|
561
|
+
};
|
562
|
+
|
563
|
+
struct ptr_bucket
|
564
|
+
{
|
565
|
+
typedef ptr_bucket* link_pointer;
|
566
|
+
link_pointer next_;
|
567
|
+
|
568
|
+
ptr_bucket() : next_(0) {}
|
569
|
+
|
570
|
+
link_pointer first_from_start()
|
571
|
+
{
|
572
|
+
return this;
|
573
|
+
}
|
574
|
+
|
575
|
+
enum { extra_node = false };
|
576
|
+
};
|
577
|
+
|
578
|
+
///////////////////////////////////////////////////////////////////
|
579
|
+
//
|
580
|
+
// Hash Policy
|
581
|
+
|
582
|
+
template <typename SizeT>
|
583
|
+
struct prime_policy
|
584
|
+
{
|
585
|
+
template <typename Hash, typename T>
|
586
|
+
static inline SizeT apply_hash(Hash const& hf, T const& x) {
|
587
|
+
return hf(x);
|
588
|
+
}
|
589
|
+
|
590
|
+
static inline SizeT to_bucket(SizeT bucket_count, SizeT hash) {
|
591
|
+
return hash % bucket_count;
|
592
|
+
}
|
593
|
+
|
594
|
+
static inline SizeT new_bucket_count(SizeT min) {
|
595
|
+
return boost::unordered::detail::next_prime(min);
|
596
|
+
}
|
597
|
+
|
598
|
+
static inline SizeT prev_bucket_count(SizeT max) {
|
599
|
+
return boost::unordered::detail::prev_prime(max);
|
600
|
+
}
|
601
|
+
};
|
602
|
+
|
603
|
+
template <typename SizeT>
|
604
|
+
struct mix64_policy
|
605
|
+
{
|
606
|
+
template <typename Hash, typename T>
|
607
|
+
static inline SizeT apply_hash(Hash const& hf, T const& x) {
|
608
|
+
SizeT key = hf(x);
|
609
|
+
key = (~key) + (key << 21); // key = (key << 21) - key - 1;
|
610
|
+
key = key ^ (key >> 24);
|
611
|
+
key = (key + (key << 3)) + (key << 8); // key * 265
|
612
|
+
key = key ^ (key >> 14);
|
613
|
+
key = (key + (key << 2)) + (key << 4); // key * 21
|
614
|
+
key = key ^ (key >> 28);
|
615
|
+
key = key + (key << 31);
|
616
|
+
return key;
|
617
|
+
}
|
618
|
+
|
619
|
+
static inline SizeT to_bucket(SizeT bucket_count, SizeT hash) {
|
620
|
+
return hash & (bucket_count - 1);
|
621
|
+
}
|
622
|
+
|
623
|
+
static inline SizeT new_bucket_count(SizeT min) {
|
624
|
+
if (min <= 4) return 4;
|
625
|
+
--min;
|
626
|
+
min |= min >> 1;
|
627
|
+
min |= min >> 2;
|
628
|
+
min |= min >> 4;
|
629
|
+
min |= min >> 8;
|
630
|
+
min |= min >> 16;
|
631
|
+
min |= min >> 32;
|
632
|
+
return min + 1;
|
633
|
+
}
|
634
|
+
|
635
|
+
static inline SizeT prev_bucket_count(SizeT max) {
|
636
|
+
max |= max >> 1;
|
637
|
+
max |= max >> 2;
|
638
|
+
max |= max >> 4;
|
639
|
+
max |= max >> 8;
|
640
|
+
max |= max >> 16;
|
641
|
+
max |= max >> 32;
|
642
|
+
return (max >> 1) + 1;
|
643
|
+
}
|
644
|
+
};
|
645
|
+
|
646
|
+
template <int digits, int radix>
|
647
|
+
struct pick_policy_impl {
|
648
|
+
typedef prime_policy<std::size_t> type;
|
649
|
+
};
|
650
|
+
|
651
|
+
template <>
|
652
|
+
struct pick_policy_impl<64, 2> {
|
653
|
+
typedef mix64_policy<std::size_t> type;
|
654
|
+
};
|
655
|
+
|
656
|
+
struct pick_policy :
|
657
|
+
pick_policy_impl<
|
658
|
+
std::numeric_limits<std::size_t>::digits,
|
659
|
+
std::numeric_limits<std::size_t>::radix> {};
|
660
|
+
|
661
|
+
////////////////////////////////////////////////////////////////////////////
|
662
|
+
// Functions
|
663
|
+
|
664
|
+
// Assigning and swapping the equality and hash function objects
|
665
|
+
// needs strong exception safety. To implement that normally we'd
|
666
|
+
// require one of them to be known to not throw and the other to
|
667
|
+
// guarantee strong exception safety. Unfortunately they both only
|
668
|
+
// have basic exception safety. So to acheive strong exception
|
669
|
+
// safety we have storage space for two copies, and assign the new
|
670
|
+
// copies to the unused space. Then switch to using that to use
|
671
|
+
// them. This is implemented in 'set_hash_functions' which
|
672
|
+
// atomically assigns the new function objects in a strongly
|
673
|
+
// exception safe manner.
|
674
|
+
|
675
|
+
template <class H, class P, bool NoThrowMoveAssign>
|
676
|
+
class set_hash_functions;
|
677
|
+
|
678
|
+
template <class H, class P>
|
679
|
+
class functions
|
680
|
+
{
|
681
|
+
public:
|
682
|
+
static const bool nothrow_move_assignable =
|
683
|
+
boost::is_nothrow_move_assignable<H>::value &&
|
684
|
+
boost::is_nothrow_move_assignable<P>::value;
|
685
|
+
static const bool nothrow_move_constructible =
|
686
|
+
boost::is_nothrow_move_constructible<H>::value &&
|
687
|
+
boost::is_nothrow_move_constructible<P>::value;
|
688
|
+
|
689
|
+
private:
|
690
|
+
friend class boost::unordered::detail::set_hash_functions<H, P,
|
691
|
+
nothrow_move_assignable>;
|
692
|
+
functions& operator=(functions const&);
|
693
|
+
|
694
|
+
typedef compressed<H, P> function_pair;
|
695
|
+
|
696
|
+
typedef typename boost::aligned_storage<
|
697
|
+
sizeof(function_pair),
|
698
|
+
boost::alignment_of<function_pair>::value>::type aligned_function;
|
699
|
+
|
700
|
+
bool current_; // The currently active functions.
|
701
|
+
aligned_function funcs_[2];
|
702
|
+
|
703
|
+
function_pair const& current() const {
|
704
|
+
return *static_cast<function_pair const*>(
|
705
|
+
static_cast<void const*>(&funcs_[current_]));
|
706
|
+
}
|
707
|
+
|
708
|
+
function_pair& current() {
|
709
|
+
return *static_cast<function_pair*>(
|
710
|
+
static_cast<void*>(&funcs_[current_]));
|
711
|
+
}
|
712
|
+
|
713
|
+
void construct(bool which, H const& hf, P const& eq)
|
714
|
+
{
|
715
|
+
new((void*) &funcs_[which]) function_pair(hf, eq);
|
716
|
+
}
|
717
|
+
|
718
|
+
void construct(bool which, function_pair const& f)
|
719
|
+
{
|
720
|
+
new((void*) &funcs_[which]) function_pair(f);
|
721
|
+
}
|
722
|
+
|
723
|
+
void construct(bool which, function_pair& f,
|
724
|
+
boost::unordered::detail::move_tag m)
|
725
|
+
{
|
726
|
+
new((void*) &funcs_[which]) function_pair(f, m);
|
727
|
+
}
|
728
|
+
|
729
|
+
void destroy(bool which)
|
730
|
+
{
|
731
|
+
boost::unordered::detail::destroy((function_pair*)(&funcs_[which]));
|
732
|
+
}
|
733
|
+
|
734
|
+
public:
|
735
|
+
|
736
|
+
typedef boost::unordered::detail::set_hash_functions<H, P,
|
737
|
+
nothrow_move_assignable> set_hash_functions;
|
738
|
+
|
739
|
+
functions(H const& hf, P const& eq)
|
740
|
+
: current_(false)
|
741
|
+
{
|
742
|
+
construct(current_, hf, eq);
|
743
|
+
}
|
744
|
+
|
745
|
+
functions(functions const& bf)
|
746
|
+
: current_(false)
|
747
|
+
{
|
748
|
+
construct(current_, bf.current());
|
749
|
+
}
|
750
|
+
|
751
|
+
functions(functions& bf, boost::unordered::detail::move_tag m)
|
752
|
+
: current_(false)
|
753
|
+
{
|
754
|
+
if (nothrow_move_constructible) {
|
755
|
+
construct(current_, bf.current(), m);
|
756
|
+
}
|
757
|
+
else {
|
758
|
+
construct(current_, bf.current());
|
759
|
+
}
|
760
|
+
}
|
761
|
+
|
762
|
+
~functions() {
|
763
|
+
this->destroy(current_);
|
764
|
+
}
|
765
|
+
|
766
|
+
H const& hash_function() const {
|
767
|
+
return current().first();
|
768
|
+
}
|
769
|
+
|
770
|
+
P const& key_eq() const {
|
771
|
+
return current().second();
|
772
|
+
}
|
773
|
+
};
|
774
|
+
|
775
|
+
template <class H, class P>
|
776
|
+
class set_hash_functions<H, P, false>
|
777
|
+
{
|
778
|
+
set_hash_functions(set_hash_functions const&);
|
779
|
+
set_hash_functions& operator=(set_hash_functions const&);
|
780
|
+
|
781
|
+
typedef functions<H, P> functions_type;
|
782
|
+
|
783
|
+
functions_type& functions_;
|
784
|
+
bool tmp_functions_;
|
785
|
+
|
786
|
+
public:
|
787
|
+
|
788
|
+
set_hash_functions(functions_type& f, H const& h, P const& p)
|
789
|
+
: functions_(f),
|
790
|
+
tmp_functions_(!f.current_)
|
791
|
+
{
|
792
|
+
f.construct(tmp_functions_, h, p);
|
793
|
+
}
|
794
|
+
|
795
|
+
set_hash_functions(functions_type& f, functions_type const& other)
|
796
|
+
: functions_(f),
|
797
|
+
tmp_functions_(!f.current_)
|
798
|
+
{
|
799
|
+
f.construct(tmp_functions_, other.current());
|
800
|
+
}
|
801
|
+
|
802
|
+
~set_hash_functions()
|
803
|
+
{
|
804
|
+
functions_.destroy(tmp_functions_);
|
805
|
+
}
|
806
|
+
|
807
|
+
void commit()
|
808
|
+
{
|
809
|
+
functions_.current_ = tmp_functions_;
|
810
|
+
tmp_functions_ = !tmp_functions_;
|
811
|
+
}
|
812
|
+
};
|
813
|
+
|
814
|
+
template <class H, class P>
|
815
|
+
class set_hash_functions<H, P, true>
|
816
|
+
{
|
817
|
+
set_hash_functions(set_hash_functions const&);
|
818
|
+
set_hash_functions& operator=(set_hash_functions const&);
|
819
|
+
|
820
|
+
typedef functions<H, P> functions_type;
|
821
|
+
|
822
|
+
functions_type& functions_;
|
823
|
+
H hash_;
|
824
|
+
P pred_;
|
825
|
+
|
826
|
+
public:
|
827
|
+
|
828
|
+
set_hash_functions(functions_type& f, H const& h, P const& p) :
|
829
|
+
functions_(f),
|
830
|
+
hash_(h),
|
831
|
+
pred_(p) {}
|
832
|
+
|
833
|
+
set_hash_functions(functions_type& f, functions_type const& other) :
|
834
|
+
functions_(f),
|
835
|
+
hash_(other.hash_function()),
|
836
|
+
pred_(other.key_eq()) {}
|
837
|
+
|
838
|
+
void commit()
|
839
|
+
{
|
840
|
+
functions_.current().first() = boost::move(hash_);
|
841
|
+
functions_.current().second() = boost::move(pred_);
|
842
|
+
}
|
843
|
+
};
|
844
|
+
|
845
|
+
////////////////////////////////////////////////////////////////////////////
|
846
|
+
// rvalue parameters when type can't be a BOOST_RV_REF(T) parameter
|
847
|
+
// e.g. for int
|
848
|
+
|
849
|
+
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
850
|
+
# define BOOST_UNORDERED_RV_REF(T) BOOST_RV_REF(T)
|
851
|
+
#else
|
852
|
+
struct please_ignore_this_overload {
|
853
|
+
typedef please_ignore_this_overload type;
|
854
|
+
};
|
855
|
+
|
856
|
+
template <typename T>
|
857
|
+
struct rv_ref_impl {
|
858
|
+
typedef BOOST_RV_REF(T) type;
|
859
|
+
};
|
860
|
+
|
861
|
+
template <typename T>
|
862
|
+
struct rv_ref :
|
863
|
+
boost::detail::if_true<
|
864
|
+
boost::is_class<T>::value
|
865
|
+
>::BOOST_NESTED_TEMPLATE then <
|
866
|
+
boost::unordered::detail::rv_ref_impl<T>,
|
867
|
+
please_ignore_this_overload
|
868
|
+
>::type
|
869
|
+
{};
|
870
|
+
|
871
|
+
# define BOOST_UNORDERED_RV_REF(T) \
|
872
|
+
typename boost::unordered::detail::rv_ref<T>::type
|
873
|
+
#endif
|
874
|
+
}}}
|
875
|
+
|
876
|
+
#endif
|