passenger 5.0.0.beta3 → 5.0.0.rc1

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.

Files changed (218) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +11 -5
  5. data/CHANGELOG +38 -0
  6. data/CONTRIBUTING.md +1 -4
  7. data/Gemfile +0 -1
  8. data/Gemfile.lock +0 -2
  9. data/Rakefile +33 -33
  10. data/bin/passenger +1 -1
  11. data/bin/passenger-config +1 -1
  12. data/bin/passenger-install-apache2-module +800 -800
  13. data/bin/passenger-install-nginx-module +592 -592
  14. data/bin/passenger-memory-stats +127 -127
  15. data/bin/passenger-status +216 -216
  16. data/build/agents.rb +127 -127
  17. data/build/apache2.rb +87 -87
  18. data/build/basics.rb +60 -60
  19. data/build/common_library.rb +165 -165
  20. data/build/cplusplus_support.rb +51 -51
  21. data/build/cxx_tests.rb +268 -268
  22. data/build/debian.rb +143 -143
  23. data/build/documentation.rb +58 -58
  24. data/build/integration_tests.rb +81 -81
  25. data/build/misc.rb +132 -132
  26. data/build/nginx.rb +20 -20
  27. data/build/node_tests.rb +7 -7
  28. data/build/oxt_tests.rb +14 -14
  29. data/build/packaging.rb +570 -570
  30. data/build/preprocessor.rb +260 -260
  31. data/build/rake_extensions.rb +71 -71
  32. data/build/ruby_extension.rb +29 -29
  33. data/build/ruby_tests.rb +6 -6
  34. data/build/test_basics.rb +37 -37
  35. data/debian.template/control.template +3 -5
  36. data/dev/copy_boost_headers +134 -134
  37. data/dev/install_scripts_bootstrap_code.rb +25 -25
  38. data/dev/list_tests +20 -20
  39. data/dev/ruby_server.rb +223 -223
  40. data/dev/runner +18 -18
  41. data/doc/ServerOptimizationGuide.txt.md +55 -2
  42. data/doc/Users guide Nginx.txt +0 -26
  43. data/doc/Users guide Standalone.txt +5 -1
  44. data/doc/users_guide_snippets/tips.txt +9 -0
  45. data/ext/common/ApplicationPool2/Group.h +23 -11
  46. data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
  47. data/ext/common/ApplicationPool2/Pool.h +22 -17
  48. data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
  49. data/ext/common/ApplicationPool2/Spawner.h +1 -1
  50. data/ext/common/Constants.h +1 -1
  51. data/ext/common/agents/Base.cpp +35 -20
  52. data/ext/common/agents/HelperAgent/Main.cpp +8 -1
  53. data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
  54. data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
  55. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
  56. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
  57. data/ext/common/agents/Main.cpp +1 -1
  58. data/ext/common/agents/Watchdog/Main.cpp +54 -19
  59. data/ext/nginx/Configuration.c +7 -0
  60. data/ext/nginx/ContentHandler.c +9 -1
  61. data/helper-scripts/backtrace-sanitizer.rb +106 -87
  62. data/helper-scripts/crash-watch.rb +32 -0
  63. data/helper-scripts/download_binaries/extconf.rb +38 -38
  64. data/helper-scripts/meteor-loader.rb +107 -107
  65. data/helper-scripts/prespawn +101 -101
  66. data/helper-scripts/rack-loader.rb +96 -96
  67. data/helper-scripts/rack-preloader.rb +137 -137
  68. data/lib/phusion_passenger.rb +292 -292
  69. data/lib/phusion_passenger/abstract_installer.rb +438 -438
  70. data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
  71. data/lib/phusion_passenger/admin_tools.rb +20 -20
  72. data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
  73. data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
  74. data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
  75. data/lib/phusion_passenger/apache2/config_options.rb +182 -182
  76. data/lib/phusion_passenger/common_library.rb +479 -485
  77. data/lib/phusion_passenger/config/about_command.rb +161 -161
  78. data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
  79. data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
  80. data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
  81. data/lib/phusion_passenger/config/command.rb +25 -25
  82. data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
  83. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
  84. data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
  85. data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
  86. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
  87. data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
  88. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
  89. data/lib/phusion_passenger/config/installation_utils.rb +204 -204
  90. data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
  91. data/lib/phusion_passenger/config/main.rb +152 -152
  92. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
  93. data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
  94. data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
  95. data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
  96. data/lib/phusion_passenger/config/utils.rb +95 -95
  97. data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
  98. data/lib/phusion_passenger/console_text_template.rb +25 -25
  99. data/lib/phusion_passenger/constants.rb +90 -90
  100. data/lib/phusion_passenger/debug_logging.rb +106 -106
  101. data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
  102. data/lib/phusion_passenger/message_channel.rb +312 -312
  103. data/lib/phusion_passenger/message_client.rb +176 -176
  104. data/lib/phusion_passenger/native_support.rb +369 -369
  105. data/lib/phusion_passenger/nginx/config_options.rb +297 -297
  106. data/lib/phusion_passenger/packaging.rb +131 -131
  107. data/lib/phusion_passenger/platform_info.rb +360 -360
  108. data/lib/phusion_passenger/platform_info/apache.rb +767 -767
  109. data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
  110. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
  111. data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
  112. data/lib/phusion_passenger/platform_info/curl.rb +32 -32
  113. data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
  114. data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
  115. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
  116. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  117. data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
  118. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
  119. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
  120. data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
  121. data/lib/phusion_passenger/platform_info/linux.rb +55 -55
  122. data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
  123. data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
  124. data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
  125. data/lib/phusion_passenger/plugin.rb +66 -66
  126. data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
  127. data/lib/phusion_passenger/public_api.rb +191 -191
  128. data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
  129. data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
  130. data/lib/phusion_passenger/request_handler.rb +567 -577
  131. data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
  132. data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
  133. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
  134. data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
  135. data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
  136. data/lib/phusion_passenger/standalone/command.rb +44 -40
  137. data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
  138. data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
  139. data/lib/phusion_passenger/standalone/main.rb +73 -73
  140. data/lib/phusion_passenger/standalone/start_command.rb +697 -685
  141. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
  142. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
  143. data/lib/phusion_passenger/standalone/status_command.rb +64 -64
  144. data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
  145. data/lib/phusion_passenger/standalone/version_command.rb +9 -9
  146. data/lib/phusion_passenger/union_station/connection.rb +32 -32
  147. data/lib/phusion_passenger/union_station/core.rb +251 -251
  148. data/lib/phusion_passenger/union_station/transaction.rb +126 -126
  149. data/lib/phusion_passenger/utils.rb +199 -167
  150. data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
  151. data/lib/phusion_passenger/utils/download.rb +196 -196
  152. data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
  153. data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
  154. data/lib/phusion_passenger/utils/lock.rb +31 -31
  155. data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
  156. data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
  157. data/lib/phusion_passenger/utils/shellwords.rb +20 -20
  158. data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
  159. data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
  160. data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
  161. data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
  162. data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
  163. data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
  164. data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
  165. data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
  166. data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
  167. data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
  168. data/passenger.gemspec +0 -1
  169. data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
  170. data/resources/templates/standalone/config.erb +19 -15
  171. data/test/integration_tests/apache2_tests.rb +566 -566
  172. data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
  173. data/test/integration_tests/native_packaging_spec.rb +296 -296
  174. data/test/integration_tests/nginx_tests.rb +393 -393
  175. data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
  176. data/test/integration_tests/source_packaging_test.rb +138 -138
  177. data/test/integration_tests/spec_helper.rb +5 -5
  178. data/test/integration_tests/standalone_tests.rb +367 -367
  179. data/test/ruby/debug_logging_spec.rb +133 -133
  180. data/test/ruby/message_channel_spec.rb +186 -186
  181. data/test/ruby/rack/loader_spec.rb +28 -28
  182. data/test/ruby/rack/preloader_spec.rb +34 -34
  183. data/test/ruby/rails3.0/loader_spec.rb +12 -12
  184. data/test/ruby/rails3.0/preloader_spec.rb +18 -18
  185. data/test/ruby/rails3.1/loader_spec.rb +12 -12
  186. data/test/ruby/rails3.1/preloader_spec.rb +18 -18
  187. data/test/ruby/rails3.2/loader_spec.rb +12 -12
  188. data/test/ruby/rails3.2/preloader_spec.rb +18 -18
  189. data/test/ruby/rails4.0/loader_spec.rb +12 -12
  190. data/test/ruby/rails4.0/preloader_spec.rb +18 -18
  191. data/test/ruby/rails4.1/loader_spec.rb +12 -12
  192. data/test/ruby/rails4.1/preloader_spec.rb +18 -18
  193. data/test/ruby/request_handler_spec.rb +730 -730
  194. data/test/ruby/shared/loader_sharedspec.rb +224 -224
  195. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
  196. data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
  197. data/test/ruby/spec_helper.rb +65 -65
  198. data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
  199. data/test/ruby/union_station_spec.rb +276 -276
  200. data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
  201. data/test/ruby/utils/hosts_file_parser.rb +248 -248
  202. data/test/ruby/utils/tee_input_spec.rb +215 -215
  203. data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
  204. data/test/ruby/utils_spec.rb +21 -21
  205. data/test/stub/rack/config.ru +87 -87
  206. data/test/stub/rack/library.rb +8 -8
  207. data/test/stub/rack/start.rb +30 -30
  208. data/test/support/apache2_controller.rb +191 -191
  209. data/test/support/nginx_controller.rb +90 -99
  210. data/test/support/placebo-preloader.rb +57 -57
  211. data/test/support/test_helper.rb +435 -435
  212. metadata +11 -21
  213. metadata.gz.asc +7 -7
  214. data/lib/phusion_passenger/standalone/command2.rb +0 -292
  215. data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
  216. data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
  217. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
  218. data/resources/templates/standalone/run_installer_as_root.txt.erb +0 -8
@@ -23,113 +23,113 @@
23
23
  # THE SOFTWARE.
24
24
 
25
25
  begin
26
- require 'rubygems'
26
+ require 'rubygems'
27
27
  rescue LoadError
28
28
  end
29
29
  require 'socket'
30
30
  require 'thread'
31
31
  if (!defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby") && RUBY_VERSION < "1.8.7"
32
- begin
33
- require 'fastthread'
34
- rescue LoadError
35
- abort "You are using a very old Ruby version. You must install " +
36
- "the 'fastthread' gem to fix some bugs in the Ruby threading system: " +
37
- "gem install fastthread"
38
- end
32
+ begin
33
+ require 'fastthread'
34
+ rescue LoadError
35
+ abort "You are using a very old Ruby version. You must install " +
36
+ "the 'fastthread' gem to fix some bugs in the Ruby threading system: " +
37
+ "gem install fastthread"
38
+ end
39
39
  end
40
40
 
41
41
  class Exception
42
- def backtrace_string(current_location = nil)
43
- if current_location.nil?
44
- location = nil
45
- else
46
- location = "in #{current_location} "
47
- end
48
- current_thread = Thread.current
49
- if !(thread_id = current_thread[:id])
50
- current_thread.to_s =~ /:(0x[0-9a-f]+)/i
51
- thread_id = $1 || '?'
52
- end
53
- if thread_name = current_thread[:name]
54
- thread_name = "(#{thread_name})"
55
- end
56
- return "*** Exception #{self.class} #{location}" <<
57
- "(#{self}) (process #{$$}, thread #{thread_id}#{thread_name}):\n" <<
58
- "\tfrom " << backtrace.join("\n\tfrom ")
59
- end
42
+ def backtrace_string(current_location = nil)
43
+ if current_location.nil?
44
+ location = nil
45
+ else
46
+ location = "in #{current_location} "
47
+ end
48
+ current_thread = Thread.current
49
+ if !(thread_id = current_thread[:id])
50
+ current_thread.to_s =~ /:(0x[0-9a-f]+)/i
51
+ thread_id = $1 || '?'
52
+ end
53
+ if thread_name = current_thread[:name]
54
+ thread_name = "(#{thread_name})"
55
+ end
56
+ return "*** Exception #{self.class} #{location}" <<
57
+ "(#{self}) (process #{$$}, thread #{thread_id}#{thread_name}):\n" <<
58
+ "\tfrom " << backtrace.join("\n\tfrom ")
59
+ end
60
60
  end
61
61
 
62
62
  class Dir
63
- # Dir.pwd resolves symlinks. This version tries not to, by shelling
64
- # out to the pwd tool.
65
- def self.pwd_no_resolve
66
- begin
67
- result = `pwd`.strip
68
- rescue Errno::ENOENT
69
- result = `/bin/pwd`.strip
70
- end
71
- if result.empty?
72
- return Dir.pwd
73
- else
74
- return result
75
- end
76
- end
63
+ # Dir.pwd resolves symlinks. This version tries not to, by shelling
64
+ # out to the pwd tool.
65
+ def self.pwd_no_resolve
66
+ begin
67
+ result = `pwd`.strip
68
+ rescue Errno::ENOENT
69
+ result = `/bin/pwd`.strip
70
+ end
71
+ if result.empty?
72
+ return Dir.pwd
73
+ else
74
+ return result
75
+ end
76
+ end
77
77
  end
78
78
 
79
79
  class File
80
- # Dir.pwd resolves symlinks. So in turn, File.expand_path/File.absolute_path
81
- # do that too. This method fixes that by using Dir.pwd_no_resolve.
82
- if File.respond_to?(:absolute_path)
83
- def self.absolute_path_no_resolve(path)
84
- return File.absolute_path(path, Dir.pwd_no_resolve)
85
- end
86
- else
87
- def self.absolute_path_no_resolve(path)
88
- return File.expand_path(path, Dir.pwd_no_resolve)
89
- end
90
- end
80
+ # Dir.pwd resolves symlinks. So in turn, File.expand_path/File.absolute_path
81
+ # do that too. This method fixes that by using Dir.pwd_no_resolve.
82
+ if File.respond_to?(:absolute_path)
83
+ def self.absolute_path_no_resolve(path)
84
+ return File.absolute_path(path, Dir.pwd_no_resolve)
85
+ end
86
+ else
87
+ def self.absolute_path_no_resolve(path)
88
+ return File.expand_path(path, Dir.pwd_no_resolve)
89
+ end
90
+ end
91
91
  end
92
92
 
93
93
  module Signal
94
- # Like Signal.list, but only returns signals that we can actually trap.
95
- def self.list_trappable
96
- ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
97
- case ruby_engine
98
- when "jruby"
99
- result = Signal.list.dup
100
- result.delete("QUIT")
101
- result.delete("ILL")
102
- result.delete("FPE")
103
- result.delete("SEGV")
104
- result.delete("USR1")
105
- result.delete("IOT")
106
- result.delete("EXIT")
107
- else
108
- result = Signal.list.dup
109
- result.delete("ALRM")
110
- result.delete("VTALRM")
111
- end
94
+ # Like Signal.list, but only returns signals that we can actually trap.
95
+ def self.list_trappable
96
+ ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
97
+ case ruby_engine
98
+ when "jruby"
99
+ result = Signal.list.dup
100
+ result.delete("QUIT")
101
+ result.delete("ILL")
102
+ result.delete("FPE")
103
+ result.delete("SEGV")
104
+ result.delete("USR1")
105
+ result.delete("IOT")
106
+ result.delete("EXIT")
107
+ else
108
+ result = Signal.list.dup
109
+ result.delete("ALRM")
110
+ result.delete("VTALRM")
111
+ end
112
112
 
113
- # Don't touch SIGCHLD no matter what! On OS X waitpid() will
114
- # malfunction if SIGCHLD doesn't have a correct handler.
115
- result.delete("CLD")
116
- result.delete("CHLD")
113
+ # Don't touch SIGCHLD no matter what! On OS X waitpid() will
114
+ # malfunction if SIGCHLD doesn't have a correct handler.
115
+ result.delete("CLD")
116
+ result.delete("CHLD")
117
117
 
118
- # Other stuff that we don't want to trap no matter which
119
- # Ruby engine.
120
- result.delete("STOP")
121
- result.delete("KILL")
118
+ # Other stuff that we don't want to trap no matter which
119
+ # Ruby engine.
120
+ result.delete("STOP")
121
+ result.delete("KILL")
122
122
 
123
- return result
124
- end
123
+ return result
124
+ end
125
125
  end
126
126
 
127
127
  module GC
128
- if !respond_to?(:copy_on_write_friendly?)
129
- # Checks whether the current Ruby interpreter's garbage
130
- # collector is copy-on-write friendly.
131
- def self.copy_on_write_friendly?
132
- return false
133
- end
134
- end
128
+ if !respond_to?(:copy_on_write_friendly?)
129
+ # Checks whether the current Ruby interpreter's garbage
130
+ # collector is copy-on-write friendly.
131
+ def self.copy_on_write_friendly?
132
+ return false
133
+ end
134
+ end
135
135
  end
@@ -25,84 +25,84 @@
25
25
  PhusionPassenger.require_passenger_lib 'native_support'
26
26
 
27
27
  class IO
28
- if defined?(PhusionPassenger::NativeSupport)
29
- # Writes all of the strings in the +components+ array into the given file
30
- # descriptor using the +writev()+ system call. Unlike IO#write, this method
31
- # does not require one to concatenate all those strings into a single buffer
32
- # in order to send the data in a single system call. Thus, #writev is a great
33
- # way to perform zero-copy I/O.
34
- #
35
- # Unlike the raw writev() system call, this method ensures that all given
36
- # data is written before returning, by performing multiple writev() calls
37
- # and whatever else is necessary.
38
- #
39
- # io.writev(["hello ", "world", "\n"])
40
- def writev(components)
41
- return PhusionPassenger::NativeSupport.writev(fileno, components)
42
- end
28
+ if defined?(PhusionPassenger::NativeSupport)
29
+ # Writes all of the strings in the +components+ array into the given file
30
+ # descriptor using the +writev()+ system call. Unlike IO#write, this method
31
+ # does not require one to concatenate all those strings into a single buffer
32
+ # in order to send the data in a single system call. Thus, #writev is a great
33
+ # way to perform zero-copy I/O.
34
+ #
35
+ # Unlike the raw writev() system call, this method ensures that all given
36
+ # data is written before returning, by performing multiple writev() calls
37
+ # and whatever else is necessary.
38
+ #
39
+ # io.writev(["hello ", "world", "\n"])
40
+ def writev(components)
41
+ return PhusionPassenger::NativeSupport.writev(fileno, components)
42
+ end
43
43
 
44
- # Like #writev, but accepts two arrays. The data is written in the given order.
45
- #
46
- # io.writev2(["hello ", "world", "\n"], ["another ", "message\n"])
47
- def writev2(components, components2)
48
- return PhusionPassenger::NativeSupport.writev2(fileno,
49
- components, components2)
50
- end
44
+ # Like #writev, but accepts two arrays. The data is written in the given order.
45
+ #
46
+ # io.writev2(["hello ", "world", "\n"], ["another ", "message\n"])
47
+ def writev2(components, components2)
48
+ return PhusionPassenger::NativeSupport.writev2(fileno,
49
+ components, components2)
50
+ end
51
51
 
52
- # Like #writev, but accepts three arrays. The data is written in the given order.
53
- #
54
- # io.writev3(["hello ", "world", "\n"],
55
- # ["another ", "message\n"],
56
- # ["yet ", "another ", "one", "\n"])
57
- def writev3(components, components2, components3)
58
- return PhusionPassenger::NativeSupport.writev3(fileno,
59
- components, components2, components3)
60
- end
61
- else
62
- def writev(components)
63
- return write(components.join(''))
64
- end
52
+ # Like #writev, but accepts three arrays. The data is written in the given order.
53
+ #
54
+ # io.writev3(["hello ", "world", "\n"],
55
+ # ["another ", "message\n"],
56
+ # ["yet ", "another ", "one", "\n"])
57
+ def writev3(components, components2, components3)
58
+ return PhusionPassenger::NativeSupport.writev3(fileno,
59
+ components, components2, components3)
60
+ end
61
+ else
62
+ def writev(components)
63
+ return write(components.join(''))
64
+ end
65
65
 
66
- def writev2(components, components2)
67
- data = ''
68
- components.each do |component|
69
- data << component
70
- end
71
- components2.each do |component|
72
- data << component
73
- end
74
- return write(data)
75
- end
66
+ def writev2(components, components2)
67
+ data = ''
68
+ components.each do |component|
69
+ data << component
70
+ end
71
+ components2.each do |component|
72
+ data << component
73
+ end
74
+ return write(data)
75
+ end
76
76
 
77
- def writev3(components, components2, components3)
78
- data = ''
79
- components.each do |component|
80
- data << component
81
- end
82
- components2.each do |component|
83
- data << component
84
- end
85
- components3.each do |component|
86
- data << component
87
- end
88
- return write(data)
89
- end
90
- end
77
+ def writev3(components, components2, components3)
78
+ data = ''
79
+ components.each do |component|
80
+ data << component
81
+ end
82
+ components2.each do |component|
83
+ data << component
84
+ end
85
+ components3.each do |component|
86
+ data << component
87
+ end
88
+ return write(data)
89
+ end
90
+ end
91
91
 
92
- if IO.method_defined?(:close_on_exec=)
93
- def close_on_exec!
94
- self.close_on_exec = true
95
- end
96
- else
97
- require 'fcntl'
92
+ if IO.method_defined?(:close_on_exec=)
93
+ def close_on_exec!
94
+ self.close_on_exec = true
95
+ end
96
+ else
97
+ require 'fcntl'
98
98
 
99
- if defined?(Fcntl::F_SETFD)
100
- def close_on_exec!
101
- fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
102
- end
103
- else
104
- def close_on_exec!
105
- end
106
- end
107
- end
99
+ if defined?(Fcntl::F_SETFD)
100
+ def close_on_exec!
101
+ fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
102
+ end
103
+ else
104
+ def close_on_exec!
105
+ end
106
+ end
107
+ end
108
108
  end
@@ -22,31 +22,31 @@
22
22
  # THE SOFTWARE.
23
23
 
24
24
  class Object # :nodoc:
25
- @@benchmark_results = {}
25
+ @@benchmark_results = {}
26
26
 
27
- def b!(name)
28
- time1 = Time.now
29
- begin
30
- yield
31
- ensure
32
- time2 = Time.now
33
- @@benchmark_results[name] = 0 unless @@benchmark_results.has_key?(name)
34
- @@benchmark_results[name] += time2 - time1
35
- end
36
- end
27
+ def b!(name)
28
+ time1 = Time.now
29
+ begin
30
+ yield
31
+ ensure
32
+ time2 = Time.now
33
+ @@benchmark_results[name] = 0 unless @@benchmark_results.has_key?(name)
34
+ @@benchmark_results[name] += time2 - time1
35
+ end
36
+ end
37
37
 
38
- def benchmark_report(main = nil)
39
- total = 0
40
- if main.nil?
41
- @@benchmark_results.each_value do |time|
42
- total += time
43
- end
44
- else
45
- total = @@benchmark_results[main]
46
- end
47
- @@benchmark_results.each_pair do |name, time|
48
- printf "%-12s: %.4f (%.2f%%)\n", name, time, time / total * 100
49
- end
50
- printf "-- Total: %.4f\n", total
51
- end
38
+ def benchmark_report(main = nil)
39
+ total = 0
40
+ if main.nil?
41
+ @@benchmark_results.each_value do |time|
42
+ total += time
43
+ end
44
+ else
45
+ total = @@benchmark_results[main]
46
+ end
47
+ @@benchmark_results.each_pair do |name, time|
48
+ printf "%-12s: %.4f (%.2f%%)\n", name, time, time / total * 100
49
+ end
50
+ printf "-- Total: %.4f\n", total
51
+ end
52
52
  end
@@ -1,5 +1,5 @@
1
1
  # Phusion Passenger - https://www.phusionpassenger.com/
2
- # Copyright (c) 2010-2014 Phusion
2
+ # Copyright (c) 2010-2015 Phusion
3
3
  #
4
4
  # "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
5
5
  #
@@ -26,153 +26,156 @@ PhusionPassenger.require_passenger_lib 'standalone/config_utils'
26
26
  PhusionPassenger.require_passenger_lib 'utils/file_system_watcher'
27
27
 
28
28
  module PhusionPassenger
29
- module Standalone
30
-
31
- class AppFinder
32
- STARTUP_FILES = [
33
- "config.ru",
34
- "passenger_wsgi.py",
35
- "app.js",
36
- ".meteor"
37
- ]
38
- WATCH_ENTRIES = [
39
- "config", "Passengerfile.json", "passenger-standalone.json"
40
- ]
41
-
42
- attr_accessor :dirs
43
- attr_reader :apps
44
- attr_reader :execution_root
45
-
46
- def self.looks_like_app_directory?(dir)
47
- return STARTUP_FILES.any? do |file|
48
- File.exist?("#{dir}/#{file}")
49
- end
50
- end
51
-
52
- def initialize(dirs, options = {})
53
- @dirs = dirs
54
- @options = options.dup
55
- determine_mode_and_execution_root
56
- end
57
-
58
- def scan
59
- apps = []
60
- watchlist = []
61
-
62
- if single_mode?
63
- app_root = find_app_root
64
- apps << {
65
- :server_names => ["_"],
66
- :root => app_root
67
- }
68
- watchlist << app_root
69
- WATCH_ENTRIES.each do |entry|
70
- if File.exist?("#{app_root}/#{entry}")
71
- watchlist << "#{app_root}/#{entry}"
72
- end
73
- end
74
-
75
- apps.map! do |app|
76
- @options.merge(app)
77
- end
78
- end
79
-
80
- @apps = apps
81
- @watchlist = watchlist
82
- return apps
83
- end
84
-
85
- def monitor(termination_pipe)
86
- raise "You must call #scan first" if !@apps
87
-
88
- watcher = PhusionPassenger::Utils::FileSystemWatcher.new(@watchlist, termination_pipe)
89
- if wait_on_io(termination_pipe, 3)
90
- return
91
- end
92
-
93
- while true
94
- changed = watcher.wait_for_change
95
- watcher.close
96
- if changed
97
- old_apps = @apps
98
- # The change could be caused by a write to some passenger.conf file.
99
- # Wait for a short period so that the write has a chance to finish.
100
- if wait_on_io(termination_pipe, 0.25)
101
- return
102
- end
103
-
104
- new_apps = scan
105
- watcher = PhusionPassenger::Utils::FileSystemWatcher.new(@watchlist, termination_pipe)
106
- if old_apps != new_apps
107
- yield(new_apps)
108
- end
109
-
110
- # Don't process change events again for a short while,
111
- # but do detect changes while waiting.
112
- if wait_on_io(termination_pipe, 3)
113
- return
114
- end
115
- else
116
- return
117
- end
118
- end
119
- ensure
120
- watcher.close if watcher
121
- end
122
-
123
- def single_mode?
124
- return @mode == :single
125
- end
126
-
127
- def multi_mode?
128
- return !single_mode?
129
- end
130
-
131
- ##################
132
-
133
- private
134
- class ConfigLoadError < StandardError
135
- end
136
-
137
- def find_app_root
138
- if @dirs.empty?
139
- return File.absolute_path_no_resolve(".")
140
- else
141
- return File.absolute_path_no_resolve(@dirs[0])
142
- end
143
- end
144
-
145
- def looks_like_app_directory?(dir)
146
- return AppFinder.looks_like_app_directory?(dir)
147
- end
148
-
149
- def filename_to_server_names(filename)
150
- basename = File.basename(filename)
151
- names = [basename]
152
- if basename !~ /^www\.$/i
153
- names << "www.#{basename}"
154
- end
155
- return names
156
- end
157
-
158
- # Wait until the given IO becomes readable, or until the timeout has
159
- # been reached. Returns true if the IO became readable, false if the
160
- # timeout has been reached.
161
- def wait_on_io(io, timeout)
162
- return !!select([io], nil, nil, timeout)
163
- end
164
-
165
- def determine_mode_and_execution_root
166
- @mode = :single
167
- if @dirs.empty?
168
- @execution_root = File.absolute_path_no_resolve(".")
169
- else
170
- @execution_root = File.absolute_path_no_resolve(@dirs[0])
171
- end
172
- end
173
-
174
- ##################
175
- end
176
-
177
- end # module Standalone
29
+ module Standalone
30
+
31
+ class AppFinder
32
+ STARTUP_FILES = [
33
+ "config.ru",
34
+ "passenger_wsgi.py",
35
+ "app.js",
36
+ ".meteor"
37
+ ]
38
+ WATCH_ENTRIES = [
39
+ "config", "Passengerfile.json", "passenger-standalone.json"
40
+ ]
41
+
42
+ attr_accessor :dirs
43
+ attr_reader :apps
44
+ attr_reader :execution_root
45
+
46
+ def self.looks_like_app_directory?(dir, options = {})
47
+ options = options.dup
48
+ ConfigUtils.load_local_config_file!(dir, options)
49
+ return options[:app_type] ||
50
+ STARTUP_FILES.any? do |file|
51
+ File.exist?("#{dir}/#{file}")
52
+ end
53
+ end
54
+
55
+ def initialize(dirs, options = {})
56
+ @dirs = dirs
57
+ @options = options.dup
58
+ determine_mode_and_execution_root(options)
59
+ end
60
+
61
+ def scan
62
+ apps = []
63
+ watchlist = []
64
+
65
+ if single_mode?
66
+ app_root = find_app_root
67
+ apps << {
68
+ :server_names => ["_"],
69
+ :root => app_root
70
+ }
71
+ watchlist << app_root
72
+ WATCH_ENTRIES.each do |entry|
73
+ if File.exist?("#{app_root}/#{entry}")
74
+ watchlist << "#{app_root}/#{entry}"
75
+ end
76
+ end
77
+
78
+ apps.map! do |app|
79
+ @options.merge(app)
80
+ end
81
+ end
82
+
83
+ @apps = apps
84
+ @watchlist = watchlist
85
+ return apps
86
+ end
87
+
88
+ def monitor(termination_pipe)
89
+ raise "You must call #scan first" if !@apps
90
+
91
+ watcher = PhusionPassenger::Utils::FileSystemWatcher.new(@watchlist, termination_pipe)
92
+ if wait_on_io(termination_pipe, 3)
93
+ return
94
+ end
95
+
96
+ while true
97
+ changed = watcher.wait_for_change
98
+ watcher.close
99
+ if changed
100
+ old_apps = @apps
101
+ # The change could be caused by a write to some Passengerfile.json file.
102
+ # Wait for a short period so that the write has a chance to finish.
103
+ if wait_on_io(termination_pipe, 0.25)
104
+ return
105
+ end
106
+
107
+ new_apps = scan
108
+ watcher = PhusionPassenger::Utils::FileSystemWatcher.new(@watchlist, termination_pipe)
109
+ if old_apps != new_apps
110
+ yield(new_apps)
111
+ end
112
+
113
+ # Don't process change events again for a short while,
114
+ # but do detect changes while waiting.
115
+ if wait_on_io(termination_pipe, 3)
116
+ return
117
+ end
118
+ else
119
+ return
120
+ end
121
+ end
122
+ ensure
123
+ watcher.close if watcher
124
+ end
125
+
126
+ def single_mode?
127
+ return @mode == :single
128
+ end
129
+
130
+ def multi_mode?
131
+ return !single_mode?
132
+ end
133
+
134
+ ##################
135
+
136
+ private
137
+ class ConfigLoadError < StandardError
138
+ end
139
+
140
+ def find_app_root
141
+ if @dirs.empty?
142
+ return File.absolute_path_no_resolve(".")
143
+ else
144
+ return File.absolute_path_no_resolve(@dirs[0])
145
+ end
146
+ end
147
+
148
+ def looks_like_app_directory?(dir, options = {})
149
+ return AppFinder.looks_like_app_directory?(dir, options)
150
+ end
151
+
152
+ def filename_to_server_names(filename)
153
+ basename = File.basename(filename)
154
+ names = [basename]
155
+ if basename !~ /^www\.$/i
156
+ names << "www.#{basename}"
157
+ end
158
+ return names
159
+ end
160
+
161
+ # Wait until the given IO becomes readable, or until the timeout has
162
+ # been reached. Returns true if the IO became readable, false if the
163
+ # timeout has been reached.
164
+ def wait_on_io(io, timeout)
165
+ return !!select([io], nil, nil, timeout)
166
+ end
167
+
168
+ def determine_mode_and_execution_root(options)
169
+ @mode = :single
170
+ if @dirs.empty?
171
+ @execution_root = File.absolute_path_no_resolve(".")
172
+ else
173
+ @execution_root = File.absolute_path_no_resolve(@dirs[0])
174
+ end
175
+ end
176
+
177
+ ##################
178
+ end
179
+
180
+ end # module Standalone
178
181
  end # module PhusionPassenger