passenger 4.0.42 → 4.0.43

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 (67) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/CHANGELOG +13 -0
  5. data/CONTRIBUTING.md +2 -19
  6. data/build/agents.rb +4 -1
  7. data/build/cxx_tests.rb +7 -2
  8. data/build/debian.rb +1 -1
  9. data/debian.template/control.template +0 -2
  10. data/doc/CodingTipsAndPitfalls.md +56 -0
  11. data/doc/Users guide Apache.idmap.txt +16 -14
  12. data/doc/Users guide Nginx.idmap.txt +8 -6
  13. data/doc/Users guide Standalone.idmap.txt +3 -1
  14. data/doc/Users guide Standalone.txt +1 -1
  15. data/doc/users_guide_snippets/environment_variables.txt +1 -0
  16. data/doc/users_guide_snippets/installation.txt +5 -5
  17. data/doc/users_guide_snippets/support_information.txt +42 -9
  18. data/doc/users_guide_snippets/troubleshooting/default.txt +42 -0
  19. data/ext/common/ApplicationPool2/Common.h +1 -0
  20. data/ext/common/ApplicationPool2/DirectSpawner.h +2 -7
  21. data/ext/common/ApplicationPool2/DummySpawner.h +1 -1
  22. data/ext/common/ApplicationPool2/Group.h +4 -2
  23. data/ext/common/ApplicationPool2/Options.h +9 -7
  24. data/ext/common/ApplicationPool2/Pool.h +83 -40
  25. data/ext/common/ApplicationPool2/Process.h +2 -6
  26. data/ext/common/ApplicationPool2/README.md +0 -40
  27. data/ext/common/ApplicationPool2/SmartSpawner.h +2 -9
  28. data/ext/common/ApplicationPool2/Spawner.h +1 -4
  29. data/ext/common/ApplicationPool2/SpawnerFactory.h +6 -9
  30. data/ext/common/ApplicationPool2/SuperGroup.h +3 -3
  31. data/ext/common/Constants.h +1 -1
  32. data/ext/common/UnionStation/Connection.h +227 -0
  33. data/ext/common/UnionStation/Core.h +497 -0
  34. data/ext/common/UnionStation/ScopeLog.h +172 -0
  35. data/ext/common/UnionStation/Transaction.h +276 -0
  36. data/ext/common/Utils.cpp +83 -8
  37. data/ext/common/Utils.h +25 -4
  38. data/ext/common/Utils/AnsiColorConstants.h +1 -0
  39. data/ext/common/Utils/ProcessMetricsCollector.h +6 -170
  40. data/ext/common/Utils/SpeedMeter.h +258 -0
  41. data/ext/common/Utils/StrIntUtils.cpp +6 -0
  42. data/ext/common/Utils/StringScanning.h +277 -0
  43. data/ext/common/Utils/SystemMetricsCollector.h +1460 -0
  44. data/ext/common/agents/Base.cpp +8 -8
  45. data/ext/common/agents/HelperAgent/Main.cpp +12 -6
  46. data/ext/common/agents/HelperAgent/RequestHandler.h +15 -16
  47. data/ext/common/agents/HelperAgent/SystemMetricsTool.cpp +199 -0
  48. data/ext/common/agents/LoggingAgent/LoggingServer.h +2 -1
  49. data/ext/common/agents/SpawnPreparer.cpp +20 -32
  50. data/lib/phusion_passenger.rb +1 -1
  51. data/lib/phusion_passenger/config/list_instances_command.rb +118 -0
  52. data/lib/phusion_passenger/config/main.rb +22 -4
  53. data/lib/phusion_passenger/config/system_metrics_command.rb +37 -0
  54. data/lib/phusion_passenger/config/utils.rb +1 -1
  55. data/lib/phusion_passenger/loader_shared_helpers.rb +8 -5
  56. data/lib/phusion_passenger/platform_info/compiler.rb +1 -1
  57. data/resources/templates/error_layout.html.template +3 -3
  58. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +3 -5
  59. data/test/cxx/ApplicationPool2/PoolTest.cpp +1 -3
  60. data/test/cxx/ApplicationPool2/ProcessTest.cpp +4 -4
  61. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +5 -7
  62. data/test/cxx/RequestHandlerTest.cpp +9 -3
  63. data/test/cxx/UnionStationTest.cpp +61 -64
  64. metadata +13 -4
  65. metadata.gz.asc +7 -7
  66. data/ext/common/UnionStation.h +0 -968
  67. data/helper-scripts/system-memory-stats.py +0 -207
@@ -30,7 +30,7 @@ module PhusionPassenger
30
30
 
31
31
  PACKAGE_NAME = 'passenger'
32
32
  # Run 'rake ext/common/Constants.h' after changing this number.
33
- VERSION_STRING = '4.0.42'
33
+ VERSION_STRING = '4.0.43'
34
34
 
35
35
  PREFERRED_NGINX_VERSION = '1.6.0'
36
36
  NGINX_SHA256_CHECKSUM = '943ad757a1c3e8b3df2d5c4ddacc508861922e36fa10ea6f8e3a348fc9abfc1a'
@@ -0,0 +1,118 @@
1
+ # Phusion Passenger - https://www.phusionpassenger.com/
2
+ # Copyright (c) 2014 Phusion
3
+ #
4
+ # "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in
14
+ # all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ # THE SOFTWARE.
23
+
24
+ require 'optparse'
25
+ PhusionPassenger.require_passenger_lib 'constants'
26
+ PhusionPassenger.require_passenger_lib 'admin_tools/server_instance'
27
+ PhusionPassenger.require_passenger_lib 'config/command'
28
+ PhusionPassenger.require_passenger_lib 'config/utils'
29
+ PhusionPassenger.require_passenger_lib 'utils/json'
30
+
31
+ module PhusionPassenger
32
+ module Config
33
+
34
+ class ListInstancesCommand < Command
35
+ include PhusionPassenger::Config::Utils
36
+
37
+ def run
38
+ parse_options
39
+ server_instances = AdminTools::ServerInstance.list
40
+ if @options[:json]
41
+ print_json(server_instances)
42
+ elsif server_instances.empty?
43
+ print_no_instances_running
44
+ else
45
+ print_instances(server_instances)
46
+ end
47
+ end
48
+
49
+ private
50
+ def self.create_option_parser(options)
51
+ OptionParser.new do |opts|
52
+ nl = "\n" + ' ' * 37
53
+ opts.banner = "Usage: passenger-config list-instances [OPTIONS] <PID>\n"
54
+ opts.separator ""
55
+ opts.separator " List all running #{PROGRAM_NAME} instances."
56
+ opts.separator ""
57
+
58
+ opts.on("--json", "Print output in JSON format") do
59
+ options[:json] = true
60
+ end
61
+ opts.on("-q", "--quiet", "Don't print anything if there are no #{PROGRAM_NAME} instances running") do
62
+ options[:quiet] = true
63
+ end
64
+ opts.on("-h", "--help", "Show this help") do
65
+ options[:help] = true
66
+ end
67
+ end
68
+ end
69
+
70
+ def help
71
+ puts @parser
72
+ end
73
+
74
+ def parse_options
75
+ super
76
+ if !@argv.empty?
77
+ help
78
+ abort
79
+ end
80
+ end
81
+
82
+ def print_no_instances_running
83
+ if !@options[:quiet]
84
+ puts "There are no #{PROGRAM_NAME} instances running."
85
+ end
86
+ end
87
+
88
+ def print_json(server_instances)
89
+ result = []
90
+ server_instances.each do |instance|
91
+ begin
92
+ description = instance.web_server_description
93
+ rescue Errno::EACCES, Errno::ENOENT
94
+ description = nil
95
+ end
96
+ result << {
97
+ :pid => instance.pid,
98
+ :description => description
99
+ }
100
+ end
101
+ puts PhusionPassenger::Utils::JSON.generate(result)
102
+ end
103
+
104
+ def print_instances(server_instances)
105
+ printf "%-8s %s\n", "PID", "Description"
106
+ server_instances.each do |instance|
107
+ begin
108
+ description = instance.web_server_description
109
+ rescue Errno::EACCES, Errno::ENOENT
110
+ description = nil
111
+ end
112
+ printf "%-8s %s\n", instance.pid, description
113
+ end
114
+ end
115
+ end
116
+
117
+ end # module Config
118
+ end # module PhusionPassenger
@@ -30,8 +30,10 @@ module Config
30
30
  KNOWN_COMMANDS = [
31
31
  ["detach-process", "DetachProcessCommand"],
32
32
  ["restart-app", "RestartAppCommand"],
33
+ ["list-instances", "ListInstancesCommand"],
33
34
  ["build-native-support", "BuildNativeSupportCommand"],
34
35
  ["validate-install", "ValidateInstallCommand"],
36
+ ["system-metrics", "SystemMetricsCommand"],
35
37
  ["about", "AboutCommand"]
36
38
  ]
37
39
 
@@ -56,6 +58,8 @@ module Config
56
58
  command_class, new_argv = lookup_command_class_by_argv(argv)
57
59
  if help_requested?(argv)
58
60
  help
61
+ elsif help_all_requested?(argv)
62
+ help(true)
59
63
  elsif command_class
60
64
  command = command_class.new(new_argv)
61
65
  command.run
@@ -65,7 +69,7 @@ module Config
65
69
  end
66
70
  end
67
71
 
68
- def self.help
72
+ def self.help(all = false)
69
73
  puts "Usage: passenger-config <COMMAND> [options]"
70
74
  puts "Tool for controlling or configurating a #{PROGRAM_NAME} instance or installation."
71
75
  puts
@@ -74,14 +78,24 @@ module Config
74
78
  puts " restart-app Restart an application"
75
79
  puts
76
80
  puts "Informational commands:"
77
- puts " validate-install Validate this Phusion Passenger installation"
78
- puts " about Show information about Phusion Passenger"
81
+ puts " validate-install Validate this #{PROGRAM_NAME} installation"
82
+ puts " list-instances List running #{PROGRAM_NAME} instances"
83
+ puts " about Show information about #{PROGRAM_NAME}"
79
84
  puts
80
85
  puts "Miscellaneous commands:"
81
86
  puts " build-native-support Ensure that the native_support library for the current"
82
87
  puts " Ruby interpeter is built"
88
+ if all
89
+ puts " system-metrics Display system metrics"
90
+ end
83
91
  puts
84
- puts "Type 'passenger-config <COMMAND> --help' for more information."
92
+ puts "Run 'passenger-config <COMMAND> --help' for more information about each"
93
+ puts "command."
94
+ if !all
95
+ puts
96
+ puts "There are also some advanced commands not shown in this help message. Run"
97
+ puts "'passenger-config --help-all' to learn more about them."
98
+ end
85
99
  end
86
100
 
87
101
  private
@@ -89,6 +103,10 @@ private
89
103
  return argv.size == 1 && (argv[0] == "--help" || argv[0] == "-h" || argv[0] == "help")
90
104
  end
91
105
 
106
+ def self.help_all_requested?(argv)
107
+ return argv.size == 1 && (argv[0] == "--help-all" || argv[0] == "help-all")
108
+ end
109
+
92
110
  def self.lookup_command_class_by_argv(argv)
93
111
  return nil if argv.empty?
94
112
 
@@ -0,0 +1,37 @@
1
+ # Phusion Passenger - https://www.phusionpassenger.com/
2
+ # Copyright (c) 2014 Phusion
3
+ #
4
+ # "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to deal
8
+ # in the Software without restriction, including without limitation the rights
9
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ # copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in
14
+ # all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ # THE SOFTWARE.
23
+
24
+ PhusionPassenger.require_passenger_lib 'config/command'
25
+
26
+ module PhusionPassenger
27
+ module Config
28
+
29
+ class SystemMetricsCommand < Command
30
+ def run
31
+ exec("#{PhusionPassenger.agents_dir}/PassengerHelperAgent",
32
+ "system-metrics", *@argv)
33
+ end
34
+ end
35
+
36
+ end # module Config
37
+ end # module PhusionPassenger
@@ -50,7 +50,7 @@ module Utils
50
50
  else
51
51
  server_instances = AdminTools::ServerInstance.list
52
52
  if server_instances.empty?
53
- abort "*** ERROR: Phusion Passenger doesn't seem to be running."
53
+ abort "*** ERROR: #{PROGRAM_NAME} doesn't seem to be running."
54
54
  elsif server_instances.size == 1
55
55
  @server_instance = server_instances.first
56
56
  else
@@ -40,7 +40,7 @@ module LoaderSharedHelpers
40
40
  dump_ruby_environment
41
41
  check_rvm_using_wrapper_script(options)
42
42
  return sanitize_spawn_options(options)
43
- 7 end
43
+ end
44
44
 
45
45
  def check_rvm_using_wrapper_script(options)
46
46
  ruby = options["ruby"]
@@ -92,7 +92,7 @@ module LoaderSharedHelpers
92
92
  def dump_all_information
93
93
  dump_ruby_environment
94
94
  dump_envvars
95
- dump_system_memory_stats
95
+ dump_system_metrics
96
96
  end
97
97
 
98
98
  def dump_ruby_environment
@@ -155,10 +155,13 @@ module LoaderSharedHelpers
155
155
  # Don't care.
156
156
  end
157
157
 
158
- def dump_system_memory_stats
158
+ def dump_system_metrics
159
159
  if dir = ENV['PASSENGER_DEBUG_DIR']
160
- File.open("#{dir}/sysmemory", "wb") do |f|
161
- f.write(`"#{PhusionPassenger.helper_scripts_dir}/system-memory-stats.py"`)
160
+ contents = `"#{PhusionPassenger.bin_dir}/passenger-config" system-metrics`
161
+ if $? && $?.exitstatus == 0
162
+ File.open("#{dir}/system_metrics", "wb") do |f|
163
+ f.write(contents)
164
+ end
162
165
  end
163
166
  end
164
167
  rescue SystemCallError
@@ -268,7 +268,7 @@ public
268
268
  "-c '#{filename}' -o '#{filename}.o'",
269
269
  flags)
270
270
  result = run_compiler(description, command, filename, source, true)
271
- return result[:result] && result[:output] !~ /unknown warning option/i
271
+ return result && result[:result] && result[:output] !~ /unknown warning option/i
272
272
  end
273
273
  end
274
274
 
@@ -48,9 +48,9 @@
48
48
  <dd><pre>{{ENVVARS|default=Unknown}}</pre></dd>
49
49
  <dt>Ulimits</dt>
50
50
  <dd><pre>{{ULIMIT|default=Unknown}}</pre></dd>
51
- {{if SYSMEMORY}}
52
- <dt>System memory usage</dt>
53
- <dd><pre>{{SYSMEMORY|default=Unknown}}</pre></dd>
51
+ {{if SYSTEM_METRICS}}
52
+ <dt>System metrics</dt>
53
+ <dd><pre>{{SYSTEM_METRICS|default=Unknown}}</pre></dd>
54
54
  {{/if}}
55
55
  {{if RUBY_INFO}}
56
56
  <dt>General Ruby interpreter information</dt>
@@ -10,7 +10,6 @@ namespace tut {
10
10
  struct ApplicationPool2_DirectSpawnerTest {
11
11
  ServerInstanceDirPtr serverInstanceDir;
12
12
  ServerInstanceDir::GenerationPtr generation;
13
- BackgroundEventLoop bg;
14
13
  ProcessPtr process;
15
14
  PipeWatcher::DataCallback gatherOutput;
16
15
  string gatheredOutput;
@@ -18,7 +17,6 @@ namespace tut {
18
17
 
19
18
  ApplicationPool2_DirectSpawnerTest() {
20
19
  createServerInstanceDirAndGeneration(serverInstanceDir, generation);
21
- bg.start();
22
20
  PipeWatcher::onData = PipeWatcher::DataCallback();
23
21
  gatherOutput = boost::bind(&ApplicationPool2_DirectSpawnerTest::_gatherOutput, this, _1, _2);
24
22
  setLogLevel(LVL_ERROR); // TODO: change to LVL_WARN
@@ -33,7 +31,7 @@ namespace tut {
33
31
  }
34
32
 
35
33
  boost::shared_ptr<DirectSpawner> createSpawner(const Options &options) {
36
- return boost::make_shared<DirectSpawner>(bg.safe,
34
+ return boost::make_shared<DirectSpawner>(
37
35
  *resourceLocator, generation);
38
36
  }
39
37
 
@@ -64,7 +62,7 @@ namespace tut {
64
62
  options.startupFile = ".";
65
63
  options.startTimeout = 300;
66
64
 
67
- DirectSpawner spawner(bg.safe, *resourceLocator, generation);
65
+ DirectSpawner spawner(*resourceLocator, generation);
68
66
 
69
67
  try {
70
68
  process = spawner.spawn(options);
@@ -86,7 +84,7 @@ namespace tut {
86
84
  options.startCommand = "perl\t" "-e\t" "print STDERR \"hello world\\n\"";
87
85
  options.startupFile = ".";
88
86
 
89
- DirectSpawner spawner(bg.safe, *resourceLocator, generation);
87
+ DirectSpawner spawner(*resourceLocator, generation);
90
88
 
91
89
  try {
92
90
  process = spawner.spawn(options);
@@ -17,7 +17,6 @@ namespace tut {
17
17
  struct ApplicationPool2_PoolTest {
18
18
  ServerInstanceDirPtr serverInstanceDir;
19
19
  ServerInstanceDir::GenerationPtr generation;
20
- BackgroundEventLoop bg;
21
20
  SpawnerConfigPtr spawnerConfig;
22
21
  SpawnerFactoryPtr spawnerFactory;
23
22
  PoolPtr pool;
@@ -35,11 +34,10 @@ namespace tut {
35
34
  createServerInstanceDirAndGeneration(serverInstanceDir, generation);
36
35
  retainSessions = false;
37
36
  spawnerConfig = boost::make_shared<SpawnerConfig>();
38
- spawnerFactory = boost::make_shared<SpawnerFactory>(bg.safe, *resourceLocator,
37
+ spawnerFactory = boost::make_shared<SpawnerFactory>(*resourceLocator,
39
38
  generation, spawnerConfig);
40
39
  pool = boost::make_shared<Pool>(spawnerFactory);
41
40
  pool->initialize();
42
- bg.start();
43
41
  callback = boost::bind(&ApplicationPool2_PoolTest::_callback, this, _1, _2);
44
42
  setLogLevel(LVL_ERROR); // TODO: change to LVL_WARN
45
43
  setPrintAppOutputAsDebuggingMessages(true);
@@ -48,7 +48,7 @@ namespace tut {
48
48
 
49
49
  TEST_METHOD(1) {
50
50
  // Test initial state.
51
- ProcessPtr process = boost::make_shared<Process>(bg.safe,
51
+ ProcessPtr process = boost::make_shared<Process>(
52
52
  123, "", "", adminSocket[0],
53
53
  errorPipe[0], sockets, 0, 0);
54
54
  process->dummy = true;
@@ -59,7 +59,7 @@ namespace tut {
59
59
 
60
60
  TEST_METHOD(2) {
61
61
  // Test opening and closing sessions.
62
- ProcessPtr process = boost::make_shared<Process>(bg.safe,
62
+ ProcessPtr process = boost::make_shared<Process>(
63
63
  123, "", "", adminSocket[0],
64
64
  errorPipe[0], sockets, 0, 0);
65
65
  process->dummy = true;
@@ -76,7 +76,7 @@ namespace tut {
76
76
  TEST_METHOD(3) {
77
77
  // newSession() checks out the socket with the smallest busyness number
78
78
  // and sessionClosed() restores the session busyness statistics.
79
- ProcessPtr process = boost::make_shared<Process>(bg.safe,
79
+ ProcessPtr process = boost::make_shared<Process>(
80
80
  123, "", "", adminSocket[0],
81
81
  errorPipe[0], sockets, 0, 0);
82
82
  process->dummy = true;
@@ -121,7 +121,7 @@ namespace tut {
121
121
 
122
122
  TEST_METHOD(4) {
123
123
  // If all sockets are at their full capacity then newSession() will fail.
124
- ProcessPtr process = boost::make_shared<Process>(bg.safe,
124
+ ProcessPtr process = boost::make_shared<Process>(
125
125
  123, "", "", adminSocket[0],
126
126
  errorPipe[0], sockets, 0, 0);
127
127
  process->dummy = true;
@@ -15,7 +15,6 @@ namespace tut {
15
15
  struct ApplicationPool2_SmartSpawnerTest {
16
16
  ServerInstanceDirPtr serverInstanceDir;
17
17
  ServerInstanceDir::GenerationPtr generation;
18
- BackgroundEventLoop bg;
19
18
  ProcessPtr process;
20
19
  PipeWatcher::DataCallback gatherOutput;
21
20
  string gatheredOutput;
@@ -23,7 +22,6 @@ namespace tut {
23
22
 
24
23
  ApplicationPool2_SmartSpawnerTest() {
25
24
  createServerInstanceDirAndGeneration(serverInstanceDir, generation);
26
- bg.start();
27
25
  PipeWatcher::onData = PipeWatcher::DataCallback();
28
26
  gatherOutput = boost::bind(&ApplicationPool2_SmartSpawnerTest::_gatherOutput, this, _1, _2);
29
27
  setLogLevel(LVL_ERROR); // TODO: should be LVL_WARN
@@ -48,7 +46,7 @@ namespace tut {
48
46
  command.push_back("exit-immediately");
49
47
  }
50
48
 
51
- return boost::make_shared<SmartSpawner>(bg.safe,
49
+ return boost::make_shared<SmartSpawner>(
52
50
  *resourceLocator,
53
51
  generation,
54
52
  command,
@@ -125,7 +123,7 @@ namespace tut {
125
123
  preloaderCommand.push_back("bash");
126
124
  preloaderCommand.push_back("-c");
127
125
  preloaderCommand.push_back("echo hello world >&2; sleep 60");
128
- SmartSpawner spawner(bg.safe,
126
+ SmartSpawner spawner(
129
127
  *resourceLocator,
130
128
  generation,
131
129
  preloaderCommand,
@@ -155,7 +153,7 @@ namespace tut {
155
153
  preloaderCommand.push_back("bash");
156
154
  preloaderCommand.push_back("-c");
157
155
  preloaderCommand.push_back("echo hello world >&2");
158
- SmartSpawner spawner(bg.safe,
156
+ SmartSpawner spawner(
159
157
  *resourceLocator,
160
158
  generation,
161
159
  preloaderCommand,
@@ -185,7 +183,7 @@ namespace tut {
185
183
  preloaderCommand.push_back("bash");
186
184
  preloaderCommand.push_back("-c");
187
185
  preloaderCommand.push_back("echo hello world >&2");
188
- SmartSpawner spawner(bg.safe,
186
+ SmartSpawner spawner(
189
187
  *resourceLocator,
190
188
  generation,
191
189
  preloaderCommand,
@@ -212,7 +210,7 @@ namespace tut {
212
210
  vector<string> preloaderCommand;
213
211
  preloaderCommand.push_back("ruby");
214
212
  preloaderCommand.push_back(resourceLocator->getHelperScriptsDir() + "/rack-preloader.rb");
215
- SmartSpawner spawner(bg.safe,
213
+ SmartSpawner spawner(
216
214
  *resourceLocator,
217
215
  generation,
218
216
  preloaderCommand,