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,680 @@
|
|
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_EQUIVALENT_HPP_INCLUDED
|
8
|
+
#define BOOST_UNORDERED_DETAIL_EQUIVALENT_HPP_INCLUDED
|
9
|
+
|
10
|
+
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
11
|
+
# pragma once
|
12
|
+
#endif
|
13
|
+
|
14
|
+
#include <boost/unordered/detail/table.hpp>
|
15
|
+
#include <boost/unordered/detail/extract_key.hpp>
|
16
|
+
|
17
|
+
namespace boost { namespace unordered { namespace detail {
|
18
|
+
|
19
|
+
template <typename A, typename T> struct grouped_node;
|
20
|
+
template <typename T> struct grouped_ptr_node;
|
21
|
+
template <typename Types> struct grouped_table_impl;
|
22
|
+
|
23
|
+
template <typename A, typename T>
|
24
|
+
struct grouped_node :
|
25
|
+
boost::unordered::detail::value_base<T>
|
26
|
+
{
|
27
|
+
typedef typename ::boost::unordered::detail::rebind_wrap<
|
28
|
+
A, grouped_node<A, T> >::type allocator;
|
29
|
+
typedef typename ::boost::unordered::detail::
|
30
|
+
allocator_traits<allocator>::pointer node_pointer;
|
31
|
+
typedef node_pointer link_pointer;
|
32
|
+
|
33
|
+
link_pointer next_;
|
34
|
+
node_pointer group_prev_;
|
35
|
+
std::size_t hash_;
|
36
|
+
|
37
|
+
grouped_node() :
|
38
|
+
next_(),
|
39
|
+
group_prev_(),
|
40
|
+
hash_(0)
|
41
|
+
{}
|
42
|
+
|
43
|
+
void init(node_pointer self)
|
44
|
+
{
|
45
|
+
group_prev_ = self;
|
46
|
+
}
|
47
|
+
|
48
|
+
private:
|
49
|
+
grouped_node& operator=(grouped_node const&);
|
50
|
+
};
|
51
|
+
|
52
|
+
template <typename T>
|
53
|
+
struct grouped_ptr_node :
|
54
|
+
boost::unordered::detail::value_base<T>,
|
55
|
+
boost::unordered::detail::ptr_bucket
|
56
|
+
{
|
57
|
+
typedef boost::unordered::detail::ptr_bucket bucket_base;
|
58
|
+
typedef grouped_ptr_node<T>* node_pointer;
|
59
|
+
typedef ptr_bucket* link_pointer;
|
60
|
+
|
61
|
+
node_pointer group_prev_;
|
62
|
+
std::size_t hash_;
|
63
|
+
|
64
|
+
grouped_ptr_node() :
|
65
|
+
bucket_base(),
|
66
|
+
group_prev_(0),
|
67
|
+
hash_(0)
|
68
|
+
{}
|
69
|
+
|
70
|
+
void init(node_pointer self)
|
71
|
+
{
|
72
|
+
group_prev_ = self;
|
73
|
+
}
|
74
|
+
|
75
|
+
private:
|
76
|
+
grouped_ptr_node& operator=(grouped_ptr_node const&);
|
77
|
+
};
|
78
|
+
|
79
|
+
// If the allocator uses raw pointers use grouped_ptr_node
|
80
|
+
// Otherwise use grouped_node.
|
81
|
+
|
82
|
+
template <typename A, typename T, typename NodePtr, typename BucketPtr>
|
83
|
+
struct pick_grouped_node2
|
84
|
+
{
|
85
|
+
typedef boost::unordered::detail::grouped_node<A, T> node;
|
86
|
+
|
87
|
+
typedef typename boost::unordered::detail::allocator_traits<
|
88
|
+
typename boost::unordered::detail::rebind_wrap<A, node>::type
|
89
|
+
>::pointer node_pointer;
|
90
|
+
|
91
|
+
typedef boost::unordered::detail::bucket<node_pointer> bucket;
|
92
|
+
typedef node_pointer link_pointer;
|
93
|
+
};
|
94
|
+
|
95
|
+
template <typename A, typename T>
|
96
|
+
struct pick_grouped_node2<A, T,
|
97
|
+
boost::unordered::detail::grouped_ptr_node<T>*,
|
98
|
+
boost::unordered::detail::ptr_bucket*>
|
99
|
+
{
|
100
|
+
typedef boost::unordered::detail::grouped_ptr_node<T> node;
|
101
|
+
typedef boost::unordered::detail::ptr_bucket bucket;
|
102
|
+
typedef bucket* link_pointer;
|
103
|
+
};
|
104
|
+
|
105
|
+
template <typename A, typename T>
|
106
|
+
struct pick_grouped_node
|
107
|
+
{
|
108
|
+
typedef boost::unordered::detail::allocator_traits<
|
109
|
+
typename boost::unordered::detail::rebind_wrap<A,
|
110
|
+
boost::unordered::detail::grouped_ptr_node<T> >::type
|
111
|
+
> tentative_node_traits;
|
112
|
+
|
113
|
+
typedef boost::unordered::detail::allocator_traits<
|
114
|
+
typename boost::unordered::detail::rebind_wrap<A,
|
115
|
+
boost::unordered::detail::ptr_bucket >::type
|
116
|
+
> tentative_bucket_traits;
|
117
|
+
|
118
|
+
typedef pick_grouped_node2<A, T,
|
119
|
+
typename tentative_node_traits::pointer,
|
120
|
+
typename tentative_bucket_traits::pointer> pick;
|
121
|
+
|
122
|
+
typedef typename pick::node node;
|
123
|
+
typedef typename pick::bucket bucket;
|
124
|
+
typedef typename pick::link_pointer link_pointer;
|
125
|
+
};
|
126
|
+
|
127
|
+
template <typename A, typename T, typename H, typename P>
|
128
|
+
struct multiset
|
129
|
+
{
|
130
|
+
typedef boost::unordered::detail::multiset<A, T, H, P> types;
|
131
|
+
|
132
|
+
typedef A allocator;
|
133
|
+
typedef T value_type;
|
134
|
+
typedef H hasher;
|
135
|
+
typedef P key_equal;
|
136
|
+
typedef T key_type;
|
137
|
+
|
138
|
+
typedef boost::unordered::detail::allocator_traits<allocator> traits;
|
139
|
+
typedef boost::unordered::detail::pick_grouped_node<allocator,
|
140
|
+
value_type> pick;
|
141
|
+
typedef typename pick::node node;
|
142
|
+
typedef typename pick::bucket bucket;
|
143
|
+
typedef typename pick::link_pointer link_pointer;
|
144
|
+
|
145
|
+
typedef boost::unordered::detail::grouped_table_impl<types> table;
|
146
|
+
typedef boost::unordered::detail::set_extractor<value_type> extractor;
|
147
|
+
|
148
|
+
typedef boost::unordered::detail::pick_policy::type policy;
|
149
|
+
};
|
150
|
+
|
151
|
+
template <typename A, typename K, typename M, typename H, typename P>
|
152
|
+
struct multimap
|
153
|
+
{
|
154
|
+
typedef boost::unordered::detail::multimap<A, K, M, H, P> types;
|
155
|
+
|
156
|
+
typedef A allocator;
|
157
|
+
typedef std::pair<K const, M> value_type;
|
158
|
+
typedef H hasher;
|
159
|
+
typedef P key_equal;
|
160
|
+
typedef K key_type;
|
161
|
+
|
162
|
+
typedef boost::unordered::detail::allocator_traits<allocator> traits;
|
163
|
+
typedef boost::unordered::detail::pick_grouped_node<allocator,
|
164
|
+
value_type> pick;
|
165
|
+
typedef typename pick::node node;
|
166
|
+
typedef typename pick::bucket bucket;
|
167
|
+
typedef typename pick::link_pointer link_pointer;
|
168
|
+
|
169
|
+
typedef boost::unordered::detail::grouped_table_impl<types> table;
|
170
|
+
typedef boost::unordered::detail::map_extractor<key_type, value_type>
|
171
|
+
extractor;
|
172
|
+
|
173
|
+
typedef boost::unordered::detail::pick_policy::type policy;
|
174
|
+
};
|
175
|
+
|
176
|
+
template <typename Types>
|
177
|
+
struct grouped_table_impl : boost::unordered::detail::table<Types>
|
178
|
+
{
|
179
|
+
typedef boost::unordered::detail::table<Types> table;
|
180
|
+
typedef typename table::value_type value_type;
|
181
|
+
typedef typename table::bucket bucket;
|
182
|
+
typedef typename table::policy policy;
|
183
|
+
typedef typename table::node_pointer node_pointer;
|
184
|
+
typedef typename table::node_allocator node_allocator;
|
185
|
+
typedef typename table::node_allocator_traits node_allocator_traits;
|
186
|
+
typedef typename table::bucket_pointer bucket_pointer;
|
187
|
+
typedef typename table::link_pointer link_pointer;
|
188
|
+
typedef typename table::hasher hasher;
|
189
|
+
typedef typename table::key_equal key_equal;
|
190
|
+
typedef typename table::key_type key_type;
|
191
|
+
typedef typename table::node_constructor node_constructor;
|
192
|
+
typedef typename table::extractor extractor;
|
193
|
+
typedef typename table::iterator iterator;
|
194
|
+
typedef typename table::c_iterator c_iterator;
|
195
|
+
|
196
|
+
// Constructors
|
197
|
+
|
198
|
+
grouped_table_impl(std::size_t n,
|
199
|
+
hasher const& hf,
|
200
|
+
key_equal const& eq,
|
201
|
+
node_allocator const& a)
|
202
|
+
: table(n, hf, eq, a)
|
203
|
+
{}
|
204
|
+
|
205
|
+
grouped_table_impl(grouped_table_impl const& x)
|
206
|
+
: table(x, node_allocator_traits::
|
207
|
+
select_on_container_copy_construction(x.node_alloc()))
|
208
|
+
{
|
209
|
+
this->init(x);
|
210
|
+
}
|
211
|
+
|
212
|
+
grouped_table_impl(grouped_table_impl const& x,
|
213
|
+
node_allocator const& a)
|
214
|
+
: table(x, a)
|
215
|
+
{
|
216
|
+
this->init(x);
|
217
|
+
}
|
218
|
+
|
219
|
+
grouped_table_impl(grouped_table_impl& x,
|
220
|
+
boost::unordered::detail::move_tag m)
|
221
|
+
: table(x, m)
|
222
|
+
{}
|
223
|
+
|
224
|
+
grouped_table_impl(grouped_table_impl& x,
|
225
|
+
node_allocator const& a,
|
226
|
+
boost::unordered::detail::move_tag m)
|
227
|
+
: table(x, a, m)
|
228
|
+
{
|
229
|
+
this->move_init(x);
|
230
|
+
}
|
231
|
+
|
232
|
+
// Accessors
|
233
|
+
|
234
|
+
template <class Key, class Pred>
|
235
|
+
iterator find_node_impl(
|
236
|
+
std::size_t key_hash,
|
237
|
+
Key const& k,
|
238
|
+
Pred const& eq) const
|
239
|
+
{
|
240
|
+
std::size_t bucket_index = this->hash_to_bucket(key_hash);
|
241
|
+
iterator n = this->begin(bucket_index);
|
242
|
+
|
243
|
+
for (;;)
|
244
|
+
{
|
245
|
+
if (!n.node_) return n;
|
246
|
+
|
247
|
+
std::size_t node_hash = n.node_->hash_;
|
248
|
+
if (key_hash == node_hash)
|
249
|
+
{
|
250
|
+
if (eq(k, this->get_key(*n)))
|
251
|
+
return n;
|
252
|
+
}
|
253
|
+
else
|
254
|
+
{
|
255
|
+
if (this->hash_to_bucket(node_hash) != bucket_index)
|
256
|
+
return iterator();
|
257
|
+
}
|
258
|
+
|
259
|
+
n = iterator(n.node_->group_prev_->next_);
|
260
|
+
}
|
261
|
+
}
|
262
|
+
|
263
|
+
std::size_t count(key_type const& k) const
|
264
|
+
{
|
265
|
+
iterator n = this->find_node(k);
|
266
|
+
if (!n.node_) return 0;
|
267
|
+
|
268
|
+
std::size_t x = 0;
|
269
|
+
node_pointer it = n.node_;
|
270
|
+
do {
|
271
|
+
it = it->group_prev_;
|
272
|
+
++x;
|
273
|
+
} while(it != n.node_);
|
274
|
+
|
275
|
+
return x;
|
276
|
+
}
|
277
|
+
|
278
|
+
std::pair<iterator, iterator>
|
279
|
+
equal_range(key_type const& k) const
|
280
|
+
{
|
281
|
+
iterator n = this->find_node(k);
|
282
|
+
return std::make_pair(
|
283
|
+
n, n.node_ ? iterator(n.node_->group_prev_->next_) : n);
|
284
|
+
}
|
285
|
+
|
286
|
+
// Equality
|
287
|
+
|
288
|
+
bool equals(grouped_table_impl const& other) const
|
289
|
+
{
|
290
|
+
if(this->size_ != other.size_) return false;
|
291
|
+
|
292
|
+
for(iterator n1 = this->begin(); n1.node_;)
|
293
|
+
{
|
294
|
+
iterator n2 = other.find_matching_node(n1);
|
295
|
+
if (!n2.node_) return false;
|
296
|
+
iterator end1(n1.node_->group_prev_->next_);
|
297
|
+
iterator end2(n2.node_->group_prev_->next_);
|
298
|
+
if (!group_equals(n1, end1, n2, end2)) return false;
|
299
|
+
n1 = end1;
|
300
|
+
}
|
301
|
+
|
302
|
+
return true;
|
303
|
+
}
|
304
|
+
|
305
|
+
static bool group_equals(iterator n1, iterator end1,
|
306
|
+
iterator n2, iterator end2)
|
307
|
+
{
|
308
|
+
for(;;)
|
309
|
+
{
|
310
|
+
if (*n1 != *n2) break;
|
311
|
+
|
312
|
+
++n1;
|
313
|
+
++n2;
|
314
|
+
|
315
|
+
if (n1 == end1) return n2 == end2;
|
316
|
+
if (n2 == end2) return false;
|
317
|
+
}
|
318
|
+
|
319
|
+
for(iterator n1a = n1, n2a = n2;;)
|
320
|
+
{
|
321
|
+
++n1a;
|
322
|
+
++n2a;
|
323
|
+
|
324
|
+
if (n1a == end1)
|
325
|
+
{
|
326
|
+
if (n2a == end2) break;
|
327
|
+
else return false;
|
328
|
+
}
|
329
|
+
|
330
|
+
if (n2a == end2) return false;
|
331
|
+
}
|
332
|
+
|
333
|
+
iterator start = n1;
|
334
|
+
for(;n1 != end1; ++n1)
|
335
|
+
{
|
336
|
+
value_type const& v = *n1;
|
337
|
+
if (find(start, n1, v)) continue;
|
338
|
+
std::size_t matches = count_equal(n2, end2, v);
|
339
|
+
if (!matches) return false;
|
340
|
+
iterator next = n1;
|
341
|
+
++next;
|
342
|
+
if (matches != 1 + count_equal(next, end1, v)) return false;
|
343
|
+
}
|
344
|
+
|
345
|
+
return true;
|
346
|
+
}
|
347
|
+
|
348
|
+
static bool find(iterator n, iterator end, value_type const& v)
|
349
|
+
{
|
350
|
+
for(;n != end; ++n)
|
351
|
+
if (*n == v)
|
352
|
+
return true;
|
353
|
+
return false;
|
354
|
+
}
|
355
|
+
|
356
|
+
static std::size_t count_equal(iterator n, iterator end,
|
357
|
+
value_type const& v)
|
358
|
+
{
|
359
|
+
std::size_t count = 0;
|
360
|
+
for(;n != end; ++n)
|
361
|
+
if (*n == v) ++count;
|
362
|
+
return count;
|
363
|
+
}
|
364
|
+
|
365
|
+
// Emplace/Insert
|
366
|
+
|
367
|
+
static inline void add_after_node(
|
368
|
+
node_pointer n,
|
369
|
+
node_pointer pos)
|
370
|
+
{
|
371
|
+
n->next_ = pos->group_prev_->next_;
|
372
|
+
n->group_prev_ = pos->group_prev_;
|
373
|
+
pos->group_prev_->next_ = n;
|
374
|
+
pos->group_prev_ = n;
|
375
|
+
}
|
376
|
+
|
377
|
+
inline iterator add_node(
|
378
|
+
node_constructor& a,
|
379
|
+
std::size_t key_hash,
|
380
|
+
iterator pos)
|
381
|
+
{
|
382
|
+
node_pointer n = a.release();
|
383
|
+
n->hash_ = key_hash;
|
384
|
+
if (pos.node_) {
|
385
|
+
this->add_after_node(n, pos.node_);
|
386
|
+
if (n->next_) {
|
387
|
+
std::size_t next_bucket = this->hash_to_bucket(
|
388
|
+
static_cast<node_pointer>(n->next_)->hash_);
|
389
|
+
if (next_bucket != this->hash_to_bucket(key_hash)) {
|
390
|
+
this->get_bucket(next_bucket)->next_ = n;
|
391
|
+
}
|
392
|
+
}
|
393
|
+
}
|
394
|
+
else {
|
395
|
+
bucket_pointer b = this->get_bucket(
|
396
|
+
this->hash_to_bucket(key_hash));
|
397
|
+
|
398
|
+
if (!b->next_)
|
399
|
+
{
|
400
|
+
link_pointer start_node = this->get_previous_start();
|
401
|
+
|
402
|
+
if (start_node->next_) {
|
403
|
+
this->get_bucket(this->hash_to_bucket(
|
404
|
+
static_cast<node_pointer>(start_node->next_)->hash_
|
405
|
+
))->next_ = n;
|
406
|
+
}
|
407
|
+
|
408
|
+
b->next_ = start_node;
|
409
|
+
n->next_ = start_node->next_;
|
410
|
+
start_node->next_ = n;
|
411
|
+
}
|
412
|
+
else
|
413
|
+
{
|
414
|
+
n->next_ = b->next_->next_;
|
415
|
+
b->next_->next_ = n;
|
416
|
+
}
|
417
|
+
}
|
418
|
+
++this->size_;
|
419
|
+
return iterator(n);
|
420
|
+
}
|
421
|
+
|
422
|
+
iterator emplace_impl(node_constructor& a)
|
423
|
+
{
|
424
|
+
key_type const& k = this->get_key(a.value());
|
425
|
+
std::size_t key_hash = this->hash(k);
|
426
|
+
iterator position = this->find_node(key_hash, k);
|
427
|
+
|
428
|
+
// reserve has basic exception safety if the hash function
|
429
|
+
// throws, strong otherwise.
|
430
|
+
this->reserve_for_insert(this->size_ + 1);
|
431
|
+
return this->add_node(a, key_hash, position);
|
432
|
+
}
|
433
|
+
|
434
|
+
void emplace_impl_no_rehash(node_constructor& a)
|
435
|
+
{
|
436
|
+
key_type const& k = this->get_key(a.value());
|
437
|
+
std::size_t key_hash = this->hash(k);
|
438
|
+
this->add_node(a, key_hash, this->find_node(key_hash, k));
|
439
|
+
}
|
440
|
+
|
441
|
+
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
442
|
+
# if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
443
|
+
iterator emplace(boost::unordered::detail::emplace_args1<
|
444
|
+
boost::unordered::detail::please_ignore_this_overload> const&)
|
445
|
+
{
|
446
|
+
BOOST_ASSERT(false);
|
447
|
+
return iterator();
|
448
|
+
}
|
449
|
+
# else
|
450
|
+
iterator emplace(
|
451
|
+
boost::unordered::detail::please_ignore_this_overload const&)
|
452
|
+
{
|
453
|
+
BOOST_ASSERT(false);
|
454
|
+
return iterator();
|
455
|
+
}
|
456
|
+
# endif
|
457
|
+
#endif
|
458
|
+
|
459
|
+
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
460
|
+
iterator emplace(BOOST_UNORDERED_EMPLACE_ARGS)
|
461
|
+
{
|
462
|
+
node_constructor a(this->node_alloc());
|
463
|
+
a.construct_with_value(BOOST_UNORDERED_EMPLACE_FORWARD);
|
464
|
+
|
465
|
+
return iterator(emplace_impl(a));
|
466
|
+
}
|
467
|
+
|
468
|
+
////////////////////////////////////////////////////////////////////////
|
469
|
+
// Insert range methods
|
470
|
+
|
471
|
+
// if hash function throws, or inserting > 1 element, basic exception
|
472
|
+
// safety. Strong otherwise
|
473
|
+
template <class I>
|
474
|
+
typename boost::unordered::detail::enable_if_forward<I, void>::type
|
475
|
+
insert_range(I i, I j)
|
476
|
+
{
|
477
|
+
if(i == j) return;
|
478
|
+
|
479
|
+
std::size_t distance = boost::unordered::detail::distance(i, j);
|
480
|
+
if(distance == 1) {
|
481
|
+
node_constructor a(this->node_alloc());
|
482
|
+
a.construct_with_value2(*i);
|
483
|
+
emplace_impl(a);
|
484
|
+
}
|
485
|
+
else {
|
486
|
+
// Only require basic exception safety here
|
487
|
+
this->reserve_for_insert(this->size_ + distance);
|
488
|
+
|
489
|
+
node_constructor a(this->node_alloc());
|
490
|
+
for (; i != j; ++i) {
|
491
|
+
a.construct_with_value2(*i);
|
492
|
+
emplace_impl_no_rehash(a);
|
493
|
+
}
|
494
|
+
}
|
495
|
+
}
|
496
|
+
|
497
|
+
template <class I>
|
498
|
+
typename boost::unordered::detail::disable_if_forward<I, void>::type
|
499
|
+
insert_range(I i, I j)
|
500
|
+
{
|
501
|
+
node_constructor a(this->node_alloc());
|
502
|
+
for (; i != j; ++i) {
|
503
|
+
a.construct_with_value2(*i);
|
504
|
+
emplace_impl(a);
|
505
|
+
}
|
506
|
+
}
|
507
|
+
|
508
|
+
////////////////////////////////////////////////////////////////////////
|
509
|
+
// Erase
|
510
|
+
//
|
511
|
+
// no throw
|
512
|
+
|
513
|
+
std::size_t erase_key(key_type const& k)
|
514
|
+
{
|
515
|
+
if(!this->size_) return 0;
|
516
|
+
|
517
|
+
std::size_t key_hash = this->hash(k);
|
518
|
+
std::size_t bucket_index = this->hash_to_bucket(key_hash);
|
519
|
+
link_pointer prev = this->get_previous_start(bucket_index);
|
520
|
+
if (!prev) return 0;
|
521
|
+
|
522
|
+
for (;;)
|
523
|
+
{
|
524
|
+
if (!prev->next_) return 0;
|
525
|
+
std::size_t node_hash =
|
526
|
+
static_cast<node_pointer>(prev->next_)->hash_;
|
527
|
+
if (this->hash_to_bucket(node_hash) != bucket_index)
|
528
|
+
return 0;
|
529
|
+
if (node_hash == key_hash &&
|
530
|
+
this->key_eq()(k, this->get_key(
|
531
|
+
static_cast<node_pointer>(prev->next_)->value())))
|
532
|
+
break;
|
533
|
+
prev = static_cast<node_pointer>(prev->next_)->group_prev_;
|
534
|
+
}
|
535
|
+
|
536
|
+
node_pointer first_node = static_cast<node_pointer>(prev->next_);
|
537
|
+
link_pointer end = first_node->group_prev_->next_;
|
538
|
+
|
539
|
+
std::size_t count = this->delete_nodes(prev, end);
|
540
|
+
this->fix_bucket(bucket_index, prev);
|
541
|
+
return count;
|
542
|
+
}
|
543
|
+
|
544
|
+
iterator erase(c_iterator r)
|
545
|
+
{
|
546
|
+
BOOST_ASSERT(r.node_);
|
547
|
+
iterator next(r.node_);
|
548
|
+
++next;
|
549
|
+
erase_nodes(r.node_, next.node_);
|
550
|
+
return next;
|
551
|
+
}
|
552
|
+
|
553
|
+
iterator erase_range(c_iterator r1, c_iterator r2)
|
554
|
+
{
|
555
|
+
if (r1 == r2) return iterator(r2.node_);
|
556
|
+
erase_nodes(r1.node_, r2.node_);
|
557
|
+
return iterator(r2.node_);
|
558
|
+
}
|
559
|
+
|
560
|
+
link_pointer erase_nodes(node_pointer begin, node_pointer end)
|
561
|
+
{
|
562
|
+
std::size_t bucket_index = this->hash_to_bucket(begin->hash_);
|
563
|
+
|
564
|
+
// Split the groups containing 'begin' and 'end'.
|
565
|
+
// And get the pointer to the node before begin while
|
566
|
+
// we're at it.
|
567
|
+
link_pointer prev = split_groups(begin, end);
|
568
|
+
|
569
|
+
// If we don't have a 'prev' it means that begin is at the
|
570
|
+
// beginning of a block, so search through the blocks in the
|
571
|
+
// same bucket.
|
572
|
+
if (!prev) {
|
573
|
+
prev = this->get_previous_start(bucket_index);
|
574
|
+
while (prev->next_ != begin)
|
575
|
+
prev = static_cast<node_pointer>(prev->next_)->group_prev_;
|
576
|
+
}
|
577
|
+
|
578
|
+
// Delete the nodes.
|
579
|
+
do {
|
580
|
+
link_pointer group_end =
|
581
|
+
static_cast<node_pointer>(prev->next_)->group_prev_->next_;
|
582
|
+
this->delete_nodes(prev, group_end);
|
583
|
+
bucket_index = this->fix_bucket(bucket_index, prev);
|
584
|
+
} while(prev->next_ != end);
|
585
|
+
|
586
|
+
return prev;
|
587
|
+
}
|
588
|
+
|
589
|
+
static link_pointer split_groups(node_pointer begin, node_pointer end)
|
590
|
+
{
|
591
|
+
node_pointer prev = begin->group_prev_;
|
592
|
+
if (prev->next_ != begin) prev = node_pointer();
|
593
|
+
|
594
|
+
if (end) {
|
595
|
+
node_pointer first = end;
|
596
|
+
while (first != begin && first->group_prev_->next_ == first) {
|
597
|
+
first = first->group_prev_;
|
598
|
+
}
|
599
|
+
|
600
|
+
boost::swap(first->group_prev_, end->group_prev_);
|
601
|
+
if (first == begin) return prev;
|
602
|
+
}
|
603
|
+
|
604
|
+
if (prev) {
|
605
|
+
node_pointer first = prev;
|
606
|
+
while (first->group_prev_->next_ == first) {
|
607
|
+
first = first->group_prev_;
|
608
|
+
}
|
609
|
+
boost::swap(first->group_prev_, begin->group_prev_);
|
610
|
+
}
|
611
|
+
|
612
|
+
return prev;
|
613
|
+
}
|
614
|
+
|
615
|
+
////////////////////////////////////////////////////////////////////////
|
616
|
+
// fill_buckets
|
617
|
+
|
618
|
+
template <class NodeCreator>
|
619
|
+
static void fill_buckets(iterator n, table& dst,
|
620
|
+
NodeCreator& creator)
|
621
|
+
{
|
622
|
+
link_pointer prev = dst.get_previous_start();
|
623
|
+
|
624
|
+
while (n.node_) {
|
625
|
+
std::size_t key_hash = n.node_->hash_;
|
626
|
+
iterator group_end(n.node_->group_prev_->next_);
|
627
|
+
|
628
|
+
node_pointer first_node = creator.create(*n);
|
629
|
+
node_pointer end = first_node;
|
630
|
+
first_node->hash_ = key_hash;
|
631
|
+
prev->next_ = first_node;
|
632
|
+
++dst.size_;
|
633
|
+
|
634
|
+
for (++n; n != group_end; ++n)
|
635
|
+
{
|
636
|
+
end = creator.create(*n);
|
637
|
+
end->hash_ = key_hash;
|
638
|
+
add_after_node(end, first_node);
|
639
|
+
++dst.size_;
|
640
|
+
}
|
641
|
+
|
642
|
+
prev = place_in_bucket(dst, prev, end);
|
643
|
+
}
|
644
|
+
}
|
645
|
+
|
646
|
+
// strong otherwise exception safety
|
647
|
+
void rehash_impl(std::size_t num_buckets)
|
648
|
+
{
|
649
|
+
BOOST_ASSERT(this->buckets_);
|
650
|
+
|
651
|
+
this->create_buckets(num_buckets);
|
652
|
+
link_pointer prev = this->get_previous_start();
|
653
|
+
while (prev->next_)
|
654
|
+
prev = place_in_bucket(*this, prev,
|
655
|
+
static_cast<node_pointer>(prev->next_)->group_prev_);
|
656
|
+
}
|
657
|
+
|
658
|
+
// Iterate through the nodes placing them in the correct buckets.
|
659
|
+
// pre: prev->next_ is not null.
|
660
|
+
static link_pointer place_in_bucket(table& dst,
|
661
|
+
link_pointer prev, node_pointer end)
|
662
|
+
{
|
663
|
+
bucket_pointer b = dst.get_bucket(dst.hash_to_bucket(end->hash_));
|
664
|
+
|
665
|
+
if (!b->next_) {
|
666
|
+
b->next_ = prev;
|
667
|
+
return end;
|
668
|
+
}
|
669
|
+
else {
|
670
|
+
link_pointer next = end->next_;
|
671
|
+
end->next_ = b->next_->next_;
|
672
|
+
b->next_->next_ = prev->next_;
|
673
|
+
prev->next_ = next;
|
674
|
+
return prev;
|
675
|
+
}
|
676
|
+
}
|
677
|
+
};
|
678
|
+
}}}
|
679
|
+
|
680
|
+
#endif
|