passenger 2.2.7 → 2.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/NEWS +40 -0
- data/Rakefile +1 -1
- data/bin/passenger-install-apache2-module +1 -0
- data/bin/passenger-install-nginx-module +2 -0
- data/doc/Architectural overview.html +173 -138
- data/doc/Security of user switching support.html +147 -109
- data/doc/Users guide Apache.html +4 -43
- data/doc/Users guide Nginx.html +4 -43
- data/doc/cxxapi/Bucket_8h-source.html +1 -1
- data/doc/cxxapi/Configuration_8h-source.html +1 -1
- data/doc/cxxapi/DirectoryMapper_8h-source.html +1 -1
- data/doc/cxxapi/Hooks_8h-source.html +1 -1
- data/doc/cxxapi/annotated.html +1 -1
- data/doc/cxxapi/classHooks-members.html +1 -1
- data/doc/cxxapi/classHooks.html +1 -1
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +1 -1
- data/doc/cxxapi/classes.html +1 -1
- data/doc/cxxapi/definitions_8h-source.html +1 -1
- data/doc/cxxapi/files.html +1 -1
- data/doc/cxxapi/functions.html +1 -1
- data/doc/cxxapi/functions_func.html +1 -1
- data/doc/cxxapi/graph_legend.html +1 -1
- data/doc/cxxapi/group__Configuration.html +1 -1
- data/doc/cxxapi/group__Core.html +1 -1
- data/doc/cxxapi/group__Hooks.html +1 -1
- data/doc/cxxapi/group__Support.html +1 -1
- data/doc/cxxapi/main.html +1 -1
- data/doc/cxxapi/modules.html +1 -1
- data/doc/rdoc/classes/GC.html +4 -4
- data/doc/rdoc/classes/PhusionPassenger.html +2 -1
- data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +8 -8
- data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +26 -26
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +98 -98
- data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +61 -61
- data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +4 -4
- data/doc/rdoc/classes/PhusionPassenger/Application.html +14 -14
- data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +12 -12
- data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +4 -4
- data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +12 -12
- data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +5 -5
- data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +42 -42
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +33 -33
- data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +59 -59
- data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +3 -3
- data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +7 -7
- data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +23 -23
- data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +4 -4
- data/doc/rdoc/classes/PhusionPassenger/Utils.html +2 -0
- data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +16 -16
- data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +4 -4
- data/doc/rdoc/classes/PlatformInfo.html +1 -1
- data/doc/rdoc/classes/Signal.html +23 -15
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/DEVELOPERS_TXT.html +1 -1
- data/doc/rdoc/files/README.html +1 -1
- data/doc/rdoc/files/ext/phusion_passenger/native_support_c.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/application_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +2 -2
- data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +2 -2
- data/doc/rdoc/files/lib/phusion_passenger/railz/application_spawner_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +1 -1
- data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +9 -9
- data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +1 -1
- data/doc/rdoc/files/misc/rake/extensions_rb.html +1 -1
- data/doc/rdoc/fr_class_index.html +2 -0
- data/doc/rdoc/fr_file_index.html +1 -0
- data/doc/rdoc/fr_method_index.html +79 -72
- data/ext/apache2/Hooks.cpp +4 -2
- data/ext/common/StandardApplicationPool.h +4 -2
- data/ext/common/Version.h +1 -1
- data/ext/nginx/Configuration.c +1 -1
- data/ext/oxt/system_calls.cpp +11 -0
- data/ext/oxt/system_calls.hpp +2 -1
- data/ext/oxt/thread.hpp +97 -1
- data/lib/phusion_passenger/constants.rb +1 -1
- data/lib/phusion_passenger/dependencies.rb +32 -0
- data/lib/phusion_passenger/platform_info.rb +1 -1
- data/lib/phusion_passenger/rack/application_spawner.rb +4 -4
- data/lib/phusion_passenger/rack/request_handler.rb +2 -5
- data/lib/phusion_passenger/railz/application_spawner.rb +13 -2
- data/lib/phusion_passenger/utils.rb +12 -4
- data/{vendor/rack-1.0.0-git/lib/rack → lib/phusion_passenger/utils}/rewindable_input.rb +19 -3
- data/test/ApplicationPoolTest.cpp +1 -1
- metadata +13 -59
- data/vendor/README +0 -13
- data/vendor/README_FOR_PACKAGERS +0 -1
- data/vendor/rack-1.0.0-git/COPYING +0 -18
- data/vendor/rack-1.0.0-git/KNOWN-ISSUES +0 -18
- data/vendor/rack-1.0.0-git/README +0 -353
- data/vendor/rack-1.0.0-git/Rakefile +0 -164
- data/vendor/rack-1.0.0-git/lib/rack.rb +0 -90
- data/vendor/rack-1.0.0-git/lib/rack/adapter/camping.rb +0 -22
- data/vendor/rack-1.0.0-git/lib/rack/auth/abstract/handler.rb +0 -37
- data/vendor/rack-1.0.0-git/lib/rack/auth/abstract/request.rb +0 -37
- data/vendor/rack-1.0.0-git/lib/rack/auth/basic.rb +0 -58
- data/vendor/rack-1.0.0-git/lib/rack/auth/digest/md5.rb +0 -124
- data/vendor/rack-1.0.0-git/lib/rack/auth/digest/nonce.rb +0 -51
- data/vendor/rack-1.0.0-git/lib/rack/auth/digest/params.rb +0 -55
- data/vendor/rack-1.0.0-git/lib/rack/auth/digest/request.rb +0 -40
- data/vendor/rack-1.0.0-git/lib/rack/auth/openid.rb +0 -487
- data/vendor/rack-1.0.0-git/lib/rack/builder.rb +0 -63
- data/vendor/rack-1.0.0-git/lib/rack/cascade.rb +0 -41
- data/vendor/rack-1.0.0-git/lib/rack/chunked.rb +0 -49
- data/vendor/rack-1.0.0-git/lib/rack/commonlogger.rb +0 -52
- data/vendor/rack-1.0.0-git/lib/rack/conditionalget.rb +0 -47
- data/vendor/rack-1.0.0-git/lib/rack/content_length.rb +0 -29
- data/vendor/rack-1.0.0-git/lib/rack/content_type.rb +0 -23
- data/vendor/rack-1.0.0-git/lib/rack/deflater.rb +0 -96
- data/vendor/rack-1.0.0-git/lib/rack/directory.rb +0 -153
- data/vendor/rack-1.0.0-git/lib/rack/file.rb +0 -88
- data/vendor/rack-1.0.0-git/lib/rack/handler.rb +0 -69
- data/vendor/rack-1.0.0-git/lib/rack/handler/cgi.rb +0 -61
- data/vendor/rack-1.0.0-git/lib/rack/handler/evented_mongrel.rb +0 -8
- data/vendor/rack-1.0.0-git/lib/rack/handler/fastcgi.rb +0 -88
- data/vendor/rack-1.0.0-git/lib/rack/handler/lsws.rb +0 -55
- data/vendor/rack-1.0.0-git/lib/rack/handler/mongrel.rb +0 -84
- data/vendor/rack-1.0.0-git/lib/rack/handler/scgi.rb +0 -59
- data/vendor/rack-1.0.0-git/lib/rack/handler/swiftiplied_mongrel.rb +0 -8
- data/vendor/rack-1.0.0-git/lib/rack/handler/thin.rb +0 -18
- data/vendor/rack-1.0.0-git/lib/rack/handler/webrick.rb +0 -67
- data/vendor/rack-1.0.0-git/lib/rack/head.rb +0 -19
- data/vendor/rack-1.0.0-git/lib/rack/lint.rb +0 -537
- data/vendor/rack-1.0.0-git/lib/rack/lobster.rb +0 -65
- data/vendor/rack-1.0.0-git/lib/rack/lock.rb +0 -16
- data/vendor/rack-1.0.0-git/lib/rack/methodoverride.rb +0 -27
- data/vendor/rack-1.0.0-git/lib/rack/mime.rb +0 -204
- data/vendor/rack-1.0.0-git/lib/rack/mock.rb +0 -184
- data/vendor/rack-1.0.0-git/lib/rack/recursive.rb +0 -57
- data/vendor/rack-1.0.0-git/lib/rack/reloader.rb +0 -106
- data/vendor/rack-1.0.0-git/lib/rack/request.rb +0 -248
- data/vendor/rack-1.0.0-git/lib/rack/response.rb +0 -183
- data/vendor/rack-1.0.0-git/lib/rack/session/abstract/id.rb +0 -142
- data/vendor/rack-1.0.0-git/lib/rack/session/cookie.rb +0 -91
- data/vendor/rack-1.0.0-git/lib/rack/session/memcache.rb +0 -109
- data/vendor/rack-1.0.0-git/lib/rack/session/pool.rb +0 -100
- data/vendor/rack-1.0.0-git/lib/rack/showexceptions.rb +0 -349
- data/vendor/rack-1.0.0-git/lib/rack/showstatus.rb +0 -106
- data/vendor/rack-1.0.0-git/lib/rack/static.rb +0 -38
- data/vendor/rack-1.0.0-git/lib/rack/urlmap.rb +0 -55
- data/vendor/rack-1.0.0-git/lib/rack/utils.rb +0 -522
data/ext/apache2/Hooks.cpp
CHANGED
|
@@ -175,8 +175,10 @@ private:
|
|
|
175
175
|
env_arr = apr_table_elts(r->subprocess_env);
|
|
176
176
|
env_entries = (apr_table_entry_t *) env_arr->elts;
|
|
177
177
|
for (int i = 0; i < env_arr->nelts; ++i) {
|
|
178
|
-
|
|
179
|
-
|
|
178
|
+
if (env_entries[i].key != NULL && env_entries[i].val != NULL) {
|
|
179
|
+
result->push_back(env_entries[i].key);
|
|
180
|
+
result->push_back(env_entries[i].val);
|
|
181
|
+
}
|
|
180
182
|
}
|
|
181
183
|
return result;
|
|
182
184
|
}
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
|
|
35
35
|
#include <oxt/system_calls.hpp>
|
|
36
36
|
#include <oxt/backtrace.hpp>
|
|
37
|
+
#include <oxt/thread.hpp>
|
|
37
38
|
|
|
38
39
|
#include <string>
|
|
39
40
|
#include <sstream>
|
|
@@ -242,7 +243,7 @@ private:
|
|
|
242
243
|
SpawnManager spawnManager;
|
|
243
244
|
#endif
|
|
244
245
|
SharedDataPtr data;
|
|
245
|
-
|
|
246
|
+
oxt::thread *cleanerThread;
|
|
246
247
|
bool detached;
|
|
247
248
|
bool done;
|
|
248
249
|
unsigned int maxIdleTime;
|
|
@@ -632,8 +633,9 @@ public:
|
|
|
632
633
|
waitingOnGlobalQueue = 0;
|
|
633
634
|
maxPerApp = DEFAULT_MAX_INSTANCES_PER_APP;
|
|
634
635
|
maxIdleTime = DEFAULT_MAX_IDLE_TIME;
|
|
635
|
-
cleanerThread = new
|
|
636
|
+
cleanerThread = new oxt::thread(
|
|
636
637
|
bind(&StandardApplicationPool::cleanerThreadMainLoop, this),
|
|
638
|
+
"ApplicationPool cleaner",
|
|
637
639
|
CLEANER_THREAD_STACK_SIZE
|
|
638
640
|
);
|
|
639
641
|
}
|
data/ext/common/Version.h
CHANGED
data/ext/nginx/Configuration.c
CHANGED
|
@@ -194,7 +194,7 @@ passenger_create_loc_conf(ngx_conf_t *cf)
|
|
|
194
194
|
DEFINE_VAR_TO_PASS("SCGI", "1");
|
|
195
195
|
DEFINE_VAR_TO_PASS("QUERY_STRING", "$query_string");
|
|
196
196
|
DEFINE_VAR_TO_PASS("REQUEST_METHOD", "$request_method");
|
|
197
|
-
DEFINE_VAR_TO_PASS("REQUEST_URI", "$
|
|
197
|
+
DEFINE_VAR_TO_PASS("REQUEST_URI", "$uri$is_args$args");
|
|
198
198
|
DEFINE_VAR_TO_PASS("SERVER_PROTOCOL", "$server_protocol");
|
|
199
199
|
DEFINE_VAR_TO_PASS("SERVER_SOFTWARE", "nginx/$nginx_version");
|
|
200
200
|
DEFINE_VAR_TO_PASS("REMOTE_ADDR", "$remote_addr");
|
data/ext/oxt/system_calls.cpp
CHANGED
|
@@ -42,8 +42,19 @@ interruption_signal_handler(int sig) {
|
|
|
42
42
|
void
|
|
43
43
|
oxt::setup_syscall_interruption_support() {
|
|
44
44
|
struct sigaction action;
|
|
45
|
+
sigset_t signal_set;
|
|
45
46
|
int ret;
|
|
46
47
|
|
|
48
|
+
/* Very important! The signal mask is inherited across fork()
|
|
49
|
+
* and exec() and we don't know what the parent process did to
|
|
50
|
+
* us. At least on OS X, having a signal mask blocking important
|
|
51
|
+
* signals can lead to stuff like waitpid() malfunction.
|
|
52
|
+
*/
|
|
53
|
+
sigemptyset(&signal_set);
|
|
54
|
+
do {
|
|
55
|
+
ret = sigprocmask(SIG_SETMASK, &signal_set, NULL);
|
|
56
|
+
} while (ret == -1 && errno == EINTR);
|
|
57
|
+
|
|
47
58
|
action.sa_handler = interruption_signal_handler;
|
|
48
59
|
action.sa_flags = 0;
|
|
49
60
|
sigemptyset(&action.sa_mask);
|
data/ext/oxt/system_calls.hpp
CHANGED
|
@@ -102,7 +102,8 @@ namespace oxt {
|
|
|
102
102
|
* Setup system call interruption support.
|
|
103
103
|
* This function may only be called once. It installs a signal handler
|
|
104
104
|
* for INTERRUPTION_SIGNAL, so one should not install a different signal
|
|
105
|
-
* handler for that signal after calling this function.
|
|
105
|
+
* handler for that signal after calling this function. It also resets
|
|
106
|
+
* the process signal mask.
|
|
106
107
|
*
|
|
107
108
|
* @warning
|
|
108
109
|
* After oxt::setup_syscall_interruption_support() is called, sending a signal
|
data/ext/oxt/thread.hpp
CHANGED
|
@@ -34,6 +34,9 @@
|
|
|
34
34
|
#ifdef OXT_BACKTRACE_IS_ENABLED
|
|
35
35
|
#include <sstream>
|
|
36
36
|
#endif
|
|
37
|
+
#include <string>
|
|
38
|
+
#include <list>
|
|
39
|
+
#include <unistd.h>
|
|
37
40
|
#include <limits.h> // for PTHREAD_STACK_MIN
|
|
38
41
|
|
|
39
42
|
namespace oxt {
|
|
@@ -132,17 +135,45 @@ public:
|
|
|
132
135
|
set_thread_main_function(boost::bind(thread_main, func, data));
|
|
133
136
|
|
|
134
137
|
unsigned long min_stack_size;
|
|
138
|
+
bool stack_min_size_defined;
|
|
139
|
+
bool round_stack_size;
|
|
140
|
+
|
|
135
141
|
#ifdef PTHREAD_STACK_MIN
|
|
136
142
|
// PTHREAD_STACK_MIN may not be a constant macro so we need
|
|
137
143
|
// to evaluate it dynamically.
|
|
138
144
|
min_stack_size = PTHREAD_STACK_MIN;
|
|
145
|
+
stack_min_size_defined = true;
|
|
139
146
|
#else
|
|
140
147
|
// Assume minimum stack size is 128 KB.
|
|
141
148
|
min_stack_size = 128 * 1024;
|
|
149
|
+
stack_min_size_defined = false;
|
|
142
150
|
#endif
|
|
143
|
-
if (stack_size < min_stack_size) {
|
|
151
|
+
if (stack_size != 0 && stack_size < min_stack_size) {
|
|
144
152
|
stack_size = min_stack_size;
|
|
153
|
+
round_stack_size = !stack_min_size_defined;
|
|
154
|
+
} else {
|
|
155
|
+
round_stack_size = true;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (round_stack_size) {
|
|
159
|
+
// Round stack size up to page boundary.
|
|
160
|
+
long page_size;
|
|
161
|
+
#if defined(_SC_PAGESIZE)
|
|
162
|
+
page_size = sysconf(_SC_PAGESIZE);
|
|
163
|
+
#elif defined(_SC_PAGE_SIZE)
|
|
164
|
+
page_size = sysconf(_SC_PAGE_SIZE);
|
|
165
|
+
#elif defined(PAGESIZE)
|
|
166
|
+
page_size = sysconf(PAGESIZE);
|
|
167
|
+
#elif defined(PAGE_SIZE)
|
|
168
|
+
page_size = sysconf(PAGE_SIZE);
|
|
169
|
+
#else
|
|
170
|
+
page_size = getpagesize();
|
|
171
|
+
#endif
|
|
172
|
+
if (stack_size % page_size != 0) {
|
|
173
|
+
stack_size = stack_size - (stack_size % page_size) + page_size;
|
|
174
|
+
}
|
|
145
175
|
}
|
|
176
|
+
|
|
146
177
|
start_thread(stack_size);
|
|
147
178
|
}
|
|
148
179
|
|
|
@@ -231,6 +262,71 @@ public:
|
|
|
231
262
|
done = timed_join(boost::posix_time::millisec(10));
|
|
232
263
|
}
|
|
233
264
|
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Keep interrupting the thread until it's done, then join it.
|
|
268
|
+
* This method will keep trying for at most <em>timeout</em> milliseconds.
|
|
269
|
+
*
|
|
270
|
+
* @param timeout The maximum number of milliseconds that this method
|
|
271
|
+
* should keep trying.
|
|
272
|
+
* @return True if the thread was successfully joined, false if the
|
|
273
|
+
* timeout has been reached.
|
|
274
|
+
* @throws boost::thread_interrupted The calling thread has been
|
|
275
|
+
* interrupted before we could join this thread.
|
|
276
|
+
*/
|
|
277
|
+
bool interrupt_and_join(unsigned int timeout) {
|
|
278
|
+
bool joined = false, timed_out = false;
|
|
279
|
+
boost::posix_time::ptime deadline =
|
|
280
|
+
boost::posix_time::microsec_clock::local_time() +
|
|
281
|
+
boost::posix_time::millisec(timeout);
|
|
282
|
+
while (!joined && !timed_out) {
|
|
283
|
+
interrupt();
|
|
284
|
+
joined = timed_join(boost::posix_time::millisec(10));
|
|
285
|
+
timed_out = !joined && boost::posix_time::microsec_clock::local_time() > deadline;
|
|
286
|
+
}
|
|
287
|
+
return joined;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Interrupt and join multiple threads in a way that's more efficient than calling
|
|
292
|
+
* interrupt_and_join() on each thread individually. It iterates over all threads,
|
|
293
|
+
* interrupts each one without joining it, then waits until at least one thread
|
|
294
|
+
* is joinable. This is repeated until all threads are joined.
|
|
295
|
+
*
|
|
296
|
+
* @param threads An array of threads to join.
|
|
297
|
+
* @param size The number of elements in <em>threads</em>.
|
|
298
|
+
* @throws boost::thread_interrupted The calling thread has been
|
|
299
|
+
* interrupted before all threads have been joined. Some threads
|
|
300
|
+
* may have been successfully joined while others haven't.
|
|
301
|
+
*/
|
|
302
|
+
static void interrupt_and_join_multiple(oxt::thread **threads, unsigned int size) {
|
|
303
|
+
std::list<oxt::thread *> remaining_threads;
|
|
304
|
+
std::list<oxt::thread *>::iterator it, current;
|
|
305
|
+
oxt::thread *thread;
|
|
306
|
+
unsigned int i;
|
|
307
|
+
|
|
308
|
+
for (i = 0; i < size; i++) {
|
|
309
|
+
remaining_threads.push_back(threads[i]);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
while (!remaining_threads.empty()) {
|
|
313
|
+
for (it = remaining_threads.begin(); it != remaining_threads.end(); it++) {
|
|
314
|
+
thread = *it;
|
|
315
|
+
thread->interrupt();
|
|
316
|
+
}
|
|
317
|
+
for (it = remaining_threads.begin(); it != remaining_threads.end(); it++) {
|
|
318
|
+
thread = *it;
|
|
319
|
+
if (thread->timed_join(boost::posix_time::millisec(0))) {
|
|
320
|
+
current = it;
|
|
321
|
+
it--;
|
|
322
|
+
remaining_threads.erase(current);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (!remaining_threads.empty()) {
|
|
326
|
+
syscalls::usleep(10000);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
234
330
|
};
|
|
235
331
|
|
|
236
332
|
} // namespace oxt
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
module PhusionPassenger
|
|
25
25
|
# Phusion Passenger version number.
|
|
26
26
|
# Don't forget to edit ext/common/Version.h too.
|
|
27
|
-
VERSION_STRING = '2.2.
|
|
27
|
+
VERSION_STRING = '2.2.8'
|
|
28
28
|
|
|
29
29
|
DEFAULT_FRAMEWORK_SPAWNER_MAX_IDLE_TIME = 30 * 60
|
|
30
30
|
DEFAULT_APP_SPAWNER_MAX_IDLE_TIME = 10 * 60
|
|
@@ -357,6 +357,38 @@ module Dependencies # :nodoc: all
|
|
|
357
357
|
dep.install_instructions = "Please install RubyGems first, then run <b>#{PlatformInfo::GEM || "gem"} install rack</b>"
|
|
358
358
|
end
|
|
359
359
|
|
|
360
|
+
OpenSSL_Dev = Dependency.new do |dep|
|
|
361
|
+
dep.name = "OpenSSL development headers"
|
|
362
|
+
dep.define_checker do |result|
|
|
363
|
+
source_file = '/tmp/passenger-openssl-check.c'
|
|
364
|
+
object_file = '/tmp/passenger-openssl-check.o'
|
|
365
|
+
begin
|
|
366
|
+
File.open(source_file, 'w') do |f|
|
|
367
|
+
f.write("#include <openssl/ssl.h>")
|
|
368
|
+
end
|
|
369
|
+
Dir.chdir(File.dirname(source_file)) do
|
|
370
|
+
if system("(gcc #{ENV['CFLAGS']} -c '#{source_file}') >/dev/null 2>/dev/null")
|
|
371
|
+
result.found
|
|
372
|
+
else
|
|
373
|
+
result.not_found
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
ensure
|
|
377
|
+
File.unlink(source_file) rescue nil
|
|
378
|
+
File.unlink(object_file) rescue nil
|
|
379
|
+
end
|
|
380
|
+
end
|
|
381
|
+
if RUBY_PLATFORM =~ /linux/
|
|
382
|
+
tags = PlatformInfo.linux_distro_tags
|
|
383
|
+
if tags.include?(:debian)
|
|
384
|
+
dep.install_command = "apt-get install libssl-dev"
|
|
385
|
+
elsif tags.include?(:redhat)
|
|
386
|
+
dep.install_command = "yum install openssl-devel"
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
dep.website = "http://www.openssl.org/"
|
|
390
|
+
end
|
|
391
|
+
|
|
360
392
|
Zlib_Dev = Dependency.new do |dep|
|
|
361
393
|
dep.name = "Zlib development headers"
|
|
362
394
|
dep.define_checker do |result|
|
|
@@ -346,7 +346,7 @@ public
|
|
|
346
346
|
flags << '-DBOOST_HAS_STDINT_H -D_GLIBCPP__PTHREADS'
|
|
347
347
|
elsif RUBY_PLATFORM =~ /aix/
|
|
348
348
|
flags << '-DOXT_DISABLE_BACKTRACES'
|
|
349
|
-
elsif RUBY_PLATFORM =~ /(sparc-linux|arm-linux)/
|
|
349
|
+
elsif RUBY_PLATFORM =~ /(sparc-linux|arm-linux|sh4-linux)/
|
|
350
350
|
# http://code.google.com/p/phusion-passenger/issues/detail?id=200
|
|
351
351
|
# http://groups.google.com/group/phusion-passenger/t/6b904a962ee28e5c
|
|
352
352
|
flags << '-DBOOST_SP_USE_PTHREADS'
|
|
@@ -21,10 +21,6 @@
|
|
|
21
21
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
22
22
|
# THE SOFTWARE.
|
|
23
23
|
|
|
24
|
-
rack_dir = File.expand_path(File.dirname(__FILE__) + "/../../../vendor/rack-1.0.0-git/lib")
|
|
25
|
-
$LOAD_PATH.unshift(rack_dir) if !$LOAD_PATH.include?(rack_dir)
|
|
26
|
-
require 'rack'
|
|
27
|
-
|
|
28
24
|
require 'socket'
|
|
29
25
|
require 'phusion_passenger/application'
|
|
30
26
|
require 'phusion_passenger/events'
|
|
@@ -137,6 +133,10 @@ private
|
|
|
137
133
|
end
|
|
138
134
|
|
|
139
135
|
def load_rack_app
|
|
136
|
+
# Load Rack inside the spawned child process so that the spawn manager
|
|
137
|
+
# itself doesn't preload Rack. This is necessary because some broken
|
|
138
|
+
# Rails apps explicitly specify a Rack version as dependency.
|
|
139
|
+
require 'rack'
|
|
140
140
|
rackup_code = ::File.read("config.ru")
|
|
141
141
|
eval("Rack::Builder.new {( #{rackup_code}\n )}.to_app", TOPLEVEL_BINDING, "config.ru")
|
|
142
142
|
end
|
|
@@ -22,11 +22,8 @@
|
|
|
22
22
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
23
23
|
# THE SOFTWARE.
|
|
24
24
|
|
|
25
|
-
rack_dir = File.expand_path(File.dirname(__FILE__) + "/../../../vendor/rack-1.0.0-git/lib")
|
|
26
|
-
$LOAD_PATH.unshift(rack_dir) if !$LOAD_PATH.include?(rack_dir)
|
|
27
|
-
require 'rack/rewindable_input'
|
|
28
|
-
|
|
29
25
|
require 'phusion_passenger/abstract_request_handler'
|
|
26
|
+
require 'phusion_passenger/utils/rewindable_input'
|
|
30
27
|
|
|
31
28
|
module PhusionPassenger
|
|
32
29
|
module Rack
|
|
@@ -64,7 +61,7 @@ class RequestHandler < AbstractRequestHandler
|
|
|
64
61
|
protected
|
|
65
62
|
# Overrided method.
|
|
66
63
|
def process_request(env, input, output)
|
|
67
|
-
rewindable_input = ::
|
|
64
|
+
rewindable_input = Utils::RewindableInput.new(input)
|
|
68
65
|
begin
|
|
69
66
|
env[RACK_VERSION] = RACK_VERSION_VALUE
|
|
70
67
|
env[RACK_INPUT] = rewindable_input
|
|
@@ -307,10 +307,21 @@ private
|
|
|
307
307
|
if !defined?(Dispatcher)
|
|
308
308
|
require 'dispatcher'
|
|
309
309
|
end
|
|
310
|
+
# Rails 2.2+ uses application_controller.rb while older versions use application.rb.
|
|
310
311
|
begin
|
|
311
312
|
require_dependency 'application_controller'
|
|
312
|
-
rescue LoadError
|
|
313
|
-
|
|
313
|
+
rescue LoadError => e
|
|
314
|
+
begin
|
|
315
|
+
require_dependency 'application'
|
|
316
|
+
rescue LoadError
|
|
317
|
+
# Considering that most apps these das are written in Rails
|
|
318
|
+
# 2.2+, if application.rb cannot be loaded either then it
|
|
319
|
+
# probably just means that application_controller.rb threw
|
|
320
|
+
# a LoadError. So we raise the original error here; if the
|
|
321
|
+
# app is based on Rails < 2.2 then the error will make less
|
|
322
|
+
# sense but we can only choose one or the other.
|
|
323
|
+
raise e
|
|
324
|
+
end
|
|
314
325
|
end
|
|
315
326
|
|
|
316
327
|
# - No point in preloading the application sources if the garbage collector
|
|
@@ -559,7 +559,6 @@ module Signal
|
|
|
559
559
|
result = Signal.list
|
|
560
560
|
result.delete("ALRM")
|
|
561
561
|
result.delete("VTALRM")
|
|
562
|
-
return result
|
|
563
562
|
when "jruby"
|
|
564
563
|
result = Signal.list
|
|
565
564
|
result.delete("QUIT")
|
|
@@ -567,12 +566,21 @@ module Signal
|
|
|
567
566
|
result.delete("FPE")
|
|
568
567
|
result.delete("KILL")
|
|
569
568
|
result.delete("SEGV")
|
|
570
|
-
result.delete("STOP")
|
|
571
569
|
result.delete("USR1")
|
|
572
|
-
return result
|
|
573
570
|
else
|
|
574
|
-
|
|
571
|
+
result = Signal.list
|
|
575
572
|
end
|
|
573
|
+
|
|
574
|
+
# Don't touch SIGCHLD no matter what! On OS X waitpid() will
|
|
575
|
+
# malfunction if SIGCHLD doesn't have a correct handler.
|
|
576
|
+
result.delete("CLD")
|
|
577
|
+
result.delete("CHLD")
|
|
578
|
+
|
|
579
|
+
# Other stuff that we don't want to trap no matter which
|
|
580
|
+
# Ruby engine.
|
|
581
|
+
result.delete("STOP")
|
|
582
|
+
|
|
583
|
+
return result
|
|
576
584
|
end
|
|
577
585
|
end
|
|
578
586
|
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
# Modified version of Rack::RewindableInput with Ruby 1.9 fix.
|
|
2
|
+
|
|
1
3
|
require 'tempfile'
|
|
2
4
|
|
|
3
|
-
module
|
|
5
|
+
module PhusionPassenger
|
|
6
|
+
module Utils
|
|
7
|
+
|
|
4
8
|
# Class which can make any IO object rewindable, including non-rewindable ones. It does
|
|
5
9
|
# this by buffering the data into a tempfile, which is rewindable.
|
|
6
10
|
#
|
|
@@ -74,7 +78,7 @@ module Rack
|
|
|
74
78
|
@rewindable_io.chmod(0000)
|
|
75
79
|
@rewindable_io.set_encoding(Encoding::BINARY) if @rewindable_io.respond_to?(:set_encoding)
|
|
76
80
|
@rewindable_io.binmode
|
|
77
|
-
if filesystem_has_posix_semantics?
|
|
81
|
+
if filesystem_has_posix_semantics? && !tempfile_unlink_contains_bug?
|
|
78
82
|
@rewindable_io.unlink
|
|
79
83
|
@unlinked = true
|
|
80
84
|
end
|
|
@@ -96,5 +100,17 @@ module Rack
|
|
|
96
100
|
def filesystem_has_posix_semantics?
|
|
97
101
|
RUBY_PLATFORM !~ /(mswin|mingw|cygwin|java)/
|
|
98
102
|
end
|
|
103
|
+
|
|
104
|
+
def tempfile_unlink_contains_bug?
|
|
105
|
+
# The tempfile library as included in Ruby 1.9.1-p152 and later
|
|
106
|
+
# contains a bug: unlinking an open Tempfile object also closes
|
|
107
|
+
# it, which breaks our expected POSIX semantics. This problem
|
|
108
|
+
# has been fixed in Ruby 1.9.2, but the Ruby team chose not to
|
|
109
|
+
# include the bug fix in later versions of the 1.9.1 series.
|
|
110
|
+
ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
|
|
111
|
+
ruby_engine == "ruby" && RUBY_VERSION == "1.9.1" && RUBY_PATCHLEVEL >= 152
|
|
112
|
+
end
|
|
99
113
|
end
|
|
100
|
-
|
|
114
|
+
|
|
115
|
+
end # module Utils
|
|
116
|
+
end # module PhusionPassenger
|
|
@@ -182,7 +182,7 @@
|
|
|
182
182
|
Application::SessionPtr session3;
|
|
183
183
|
bool done;
|
|
184
184
|
|
|
185
|
-
shared_ptr<thread> thr = ptr(new thread(PoolWaitTestThread(pool2, session3, done)));
|
|
185
|
+
shared_ptr<boost::thread> thr = ptr(new boost::thread(PoolWaitTestThread(pool2, session3, done)));
|
|
186
186
|
usleep(500000);
|
|
187
187
|
ensure("ApplicationPool is still waiting", !done);
|
|
188
188
|
ensure_equals(pool->getActive(), 2u);
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: passenger
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.2.
|
|
4
|
+
version: 2.2.8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Phusion - http://www.phusion.nl/
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2009-
|
|
12
|
+
date: 2009-12-15 00:00:00 -08:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
@@ -32,6 +32,16 @@ dependencies:
|
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
33
|
version: 1.0.1
|
|
34
34
|
version:
|
|
35
|
+
- !ruby/object:Gem::Dependency
|
|
36
|
+
name: rack
|
|
37
|
+
type: :runtime
|
|
38
|
+
version_requirement:
|
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
40
|
+
requirements:
|
|
41
|
+
- - ">="
|
|
42
|
+
- !ruby/object:Gem::Version
|
|
43
|
+
version: "0"
|
|
44
|
+
version:
|
|
35
45
|
description: Passenger is an Apache module for Ruby on Rails support.
|
|
36
46
|
email: info@phusion.nl
|
|
37
47
|
executables:
|
|
@@ -78,6 +88,7 @@ files:
|
|
|
78
88
|
- lib/phusion_passenger/railz/request_handler.rb
|
|
79
89
|
- lib/phusion_passenger/simple_benchmarking.rb
|
|
80
90
|
- lib/phusion_passenger/spawn_manager.rb
|
|
91
|
+
- lib/phusion_passenger/utils/rewindable_input.rb
|
|
81
92
|
- lib/phusion_passenger/utils.rb
|
|
82
93
|
- lib/phusion_passenger/wsgi/application_spawner.rb
|
|
83
94
|
- lib/phusion_passenger/wsgi/request_handler.py
|
|
@@ -1092,63 +1103,6 @@ files:
|
|
|
1092
1103
|
- misc/rake/gempackagetask.rb
|
|
1093
1104
|
- misc/rake/packagetask.rb
|
|
1094
1105
|
- misc/rake/rdoctask.rb
|
|
1095
|
-
- vendor/rack-1.0.0-git/COPYING
|
|
1096
|
-
- vendor/rack-1.0.0-git/KNOWN-ISSUES
|
|
1097
|
-
- vendor/rack-1.0.0-git/lib/rack/adapter/camping.rb
|
|
1098
|
-
- vendor/rack-1.0.0-git/lib/rack/auth/abstract/handler.rb
|
|
1099
|
-
- vendor/rack-1.0.0-git/lib/rack/auth/abstract/request.rb
|
|
1100
|
-
- vendor/rack-1.0.0-git/lib/rack/auth/basic.rb
|
|
1101
|
-
- vendor/rack-1.0.0-git/lib/rack/auth/digest/md5.rb
|
|
1102
|
-
- vendor/rack-1.0.0-git/lib/rack/auth/digest/nonce.rb
|
|
1103
|
-
- vendor/rack-1.0.0-git/lib/rack/auth/digest/params.rb
|
|
1104
|
-
- vendor/rack-1.0.0-git/lib/rack/auth/digest/request.rb
|
|
1105
|
-
- vendor/rack-1.0.0-git/lib/rack/auth/openid.rb
|
|
1106
|
-
- vendor/rack-1.0.0-git/lib/rack/builder.rb
|
|
1107
|
-
- vendor/rack-1.0.0-git/lib/rack/cascade.rb
|
|
1108
|
-
- vendor/rack-1.0.0-git/lib/rack/chunked.rb
|
|
1109
|
-
- vendor/rack-1.0.0-git/lib/rack/commonlogger.rb
|
|
1110
|
-
- vendor/rack-1.0.0-git/lib/rack/conditionalget.rb
|
|
1111
|
-
- vendor/rack-1.0.0-git/lib/rack/content_length.rb
|
|
1112
|
-
- vendor/rack-1.0.0-git/lib/rack/content_type.rb
|
|
1113
|
-
- vendor/rack-1.0.0-git/lib/rack/deflater.rb
|
|
1114
|
-
- vendor/rack-1.0.0-git/lib/rack/directory.rb
|
|
1115
|
-
- vendor/rack-1.0.0-git/lib/rack/file.rb
|
|
1116
|
-
- vendor/rack-1.0.0-git/lib/rack/handler/cgi.rb
|
|
1117
|
-
- vendor/rack-1.0.0-git/lib/rack/handler/evented_mongrel.rb
|
|
1118
|
-
- vendor/rack-1.0.0-git/lib/rack/handler/fastcgi.rb
|
|
1119
|
-
- vendor/rack-1.0.0-git/lib/rack/handler/lsws.rb
|
|
1120
|
-
- vendor/rack-1.0.0-git/lib/rack/handler/mongrel.rb
|
|
1121
|
-
- vendor/rack-1.0.0-git/lib/rack/handler/scgi.rb
|
|
1122
|
-
- vendor/rack-1.0.0-git/lib/rack/handler/swiftiplied_mongrel.rb
|
|
1123
|
-
- vendor/rack-1.0.0-git/lib/rack/handler/thin.rb
|
|
1124
|
-
- vendor/rack-1.0.0-git/lib/rack/handler/webrick.rb
|
|
1125
|
-
- vendor/rack-1.0.0-git/lib/rack/handler.rb
|
|
1126
|
-
- vendor/rack-1.0.0-git/lib/rack/head.rb
|
|
1127
|
-
- vendor/rack-1.0.0-git/lib/rack/lint.rb
|
|
1128
|
-
- vendor/rack-1.0.0-git/lib/rack/lobster.rb
|
|
1129
|
-
- vendor/rack-1.0.0-git/lib/rack/lock.rb
|
|
1130
|
-
- vendor/rack-1.0.0-git/lib/rack/methodoverride.rb
|
|
1131
|
-
- vendor/rack-1.0.0-git/lib/rack/mime.rb
|
|
1132
|
-
- vendor/rack-1.0.0-git/lib/rack/mock.rb
|
|
1133
|
-
- vendor/rack-1.0.0-git/lib/rack/recursive.rb
|
|
1134
|
-
- vendor/rack-1.0.0-git/lib/rack/reloader.rb
|
|
1135
|
-
- vendor/rack-1.0.0-git/lib/rack/request.rb
|
|
1136
|
-
- vendor/rack-1.0.0-git/lib/rack/response.rb
|
|
1137
|
-
- vendor/rack-1.0.0-git/lib/rack/rewindable_input.rb
|
|
1138
|
-
- vendor/rack-1.0.0-git/lib/rack/session/abstract/id.rb
|
|
1139
|
-
- vendor/rack-1.0.0-git/lib/rack/session/cookie.rb
|
|
1140
|
-
- vendor/rack-1.0.0-git/lib/rack/session/memcache.rb
|
|
1141
|
-
- vendor/rack-1.0.0-git/lib/rack/session/pool.rb
|
|
1142
|
-
- vendor/rack-1.0.0-git/lib/rack/showexceptions.rb
|
|
1143
|
-
- vendor/rack-1.0.0-git/lib/rack/showstatus.rb
|
|
1144
|
-
- vendor/rack-1.0.0-git/lib/rack/static.rb
|
|
1145
|
-
- vendor/rack-1.0.0-git/lib/rack/urlmap.rb
|
|
1146
|
-
- vendor/rack-1.0.0-git/lib/rack/utils.rb
|
|
1147
|
-
- vendor/rack-1.0.0-git/lib/rack.rb
|
|
1148
|
-
- vendor/rack-1.0.0-git/Rakefile
|
|
1149
|
-
- vendor/rack-1.0.0-git/README
|
|
1150
|
-
- vendor/README
|
|
1151
|
-
- vendor/README_FOR_PACKAGERS
|
|
1152
1106
|
- test/ApplicationPoolServer_ApplicationPoolTest.cpp
|
|
1153
1107
|
- test/ApplicationPoolServerTest.cpp
|
|
1154
1108
|
- test/ApplicationPoolTest.cpp
|