colouringcode-passenger 0.1 → 0.2
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 +129 -0
- data/Rakefile +2 -2
- data/bin/passenger-install-apache2-module +1 -0
- data/bin/passenger-install-nginx-module +4 -2
- data/ext/apache2/Hooks.cpp +4 -2
- data/ext/common/ApplicationPoolServer.h +1 -1
- data/ext/common/ApplicationPoolServerExecutable.cpp +1 -1
- data/ext/common/MessageChannel.h +48 -4
- data/ext/common/StandardApplicationPool.h +4 -2
- data/ext/common/Version.h +1 -1
- data/ext/nginx/Configuration.c +1 -1
- data/ext/nginx/HttpStatusExtractor.h +1 -0
- data/ext/nginx/ScgiRequestParser.h +1 -0
- data/ext/oxt/system_calls.cpp +11 -0
- data/ext/oxt/system_calls.hpp +2 -1
- data/ext/oxt/thread.hpp +97 -1
- data/ext/phusion_passenger/native_support.c +30 -1
- data/lib/phusion_passenger/constants.rb +1 -1
- data/lib/phusion_passenger/dependencies.rb +32 -0
- data/lib/phusion_passenger/message_channel.rb +45 -3
- data/lib/phusion_passenger/platform_info.rb +1 -1
- data/lib/phusion_passenger/rack/application_spawner.rb +10 -4
- data/lib/phusion_passenger/rack/request_handler.rb +2 -5
- data/lib/phusion_passenger/railz/application_spawner.rb +59 -7
- data/lib/phusion_passenger/utils.rb +70 -16
- data/{vendor/rack-1.0.0-git/lib/rack → lib/phusion_passenger/utils}/rewindable_input.rb +34 -9
- data/test/ApplicationPoolTest.cpp +1 -1
- data/test/MessageChannelTest.cpp +9 -1
- data/test/stub/message_channel.rb +1 -1
- data/test/stub/message_channel_2.rb +1 -1
- data/test/stub/message_channel_3.rb +2 -2
- metadata +43 -155
- data/doc/Architectural overview.html +0 -1
- data/doc/rdoc/classes/ConditionVariable.html +0 -194
- data/doc/rdoc/classes/Exception.html +0 -120
- data/doc/rdoc/classes/GC.html +0 -113
- data/doc/rdoc/classes/IO.html +0 -169
- data/doc/rdoc/classes/PhusionPassenger.html +0 -238
- data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +0 -153
- data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +0 -517
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +0 -719
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +0 -97
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +0 -96
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +0 -97
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +0 -96
- data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +0 -598
- data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +0 -140
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess.html +0 -317
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess/Instance.html +0 -138
- data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +0 -154
- data/doc/rdoc/classes/PhusionPassenger/Application.html +0 -283
- data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +0 -172
- data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +0 -145
- data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +0 -181
- data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +0 -141
- data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +0 -489
- data/doc/rdoc/classes/PhusionPassenger/NativeSupport.html +0 -350
- data/doc/rdoc/classes/PhusionPassenger/Rack.html +0 -91
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +0 -188
- data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +0 -199
- data/doc/rdoc/classes/PhusionPassenger/Railz.html +0 -95
- data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +0 -438
- data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner/Error.html +0 -98
- data/doc/rdoc/classes/PhusionPassenger/Railz/CGIFixed.html +0 -200
- data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +0 -436
- data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner/Error.html +0 -98
- data/doc/rdoc/classes/PhusionPassenger/Railz/RequestHandler.html +0 -155
- data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +0 -402
- data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +0 -125
- data/doc/rdoc/classes/PhusionPassenger/Utils.html +0 -803
- data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +0 -169
- data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +0 -140
- data/doc/rdoc/classes/PhusionPassenger/WSGI.html +0 -89
- data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +0 -188
- data/doc/rdoc/classes/PlatformInfo.html +0 -866
- data/doc/rdoc/classes/RakeExtensions.html +0 -197
- data/doc/rdoc/classes/Signal.html +0 -131
- data/doc/rdoc/created.rid +0 -1
- data/doc/rdoc/files/DEVELOPERS_TXT.html +0 -255
- data/doc/rdoc/files/README.html +0 -175
- data/doc/rdoc/files/ext/phusion_passenger/native_support_c.html +0 -92
- data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +0 -129
- data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +0 -129
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +0 -128
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +0 -130
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/application_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +0 -134
- data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +0 -120
- data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +0 -133
- data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +0 -125
- data/doc/rdoc/files/lib/phusion_passenger/railz/application_spawner_rb.html +0 -140
- data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +0 -145
- data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +0 -125
- data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +0 -159
- data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +0 -174
- data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +0 -129
- data/doc/rdoc/files/misc/rake/extensions_rb.html +0 -130
- data/doc/rdoc/fr_class_index.html +0 -91
- data/doc/rdoc/fr_file_index.html +0 -76
- data/doc/rdoc/fr_method_index.html +0 -205
- data/doc/rdoc/index.html +0 -26
- data/doc/rdoc/rdoc-style.css +0 -187
- 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/NEWS
CHANGED
|
@@ -1,3 +1,132 @@
|
|
|
1
|
+
Release 2.2.12
|
|
2
|
+
--------------
|
|
3
|
+
|
|
4
|
+
* Improved Bundler support.
|
|
5
|
+
Previous versions might not be able to correctly load gems bundled
|
|
6
|
+
by Bundler.
|
|
7
|
+
* Fixed some Ruby 1.9 tempfile.rb compatibility problems.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
Release 2.2.11
|
|
11
|
+
--------------
|
|
12
|
+
|
|
13
|
+
* This release fixes a regression that appeared in 2.2.10 which only
|
|
14
|
+
affects Apache. When under high load, Apache might freeze and stop
|
|
15
|
+
responding to requests. It is caused by a race conditions which is
|
|
16
|
+
why it escaped our last release testing.
|
|
17
|
+
|
|
18
|
+
This problem does not affect Nginx; you only have to upgrade if
|
|
19
|
+
you're using Apache.
|
|
20
|
+
|
|
21
|
+
http://groups.google.com/group/phusion-passenger/t/d5bb2f17c8446ea0
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
Release 2.2.10
|
|
25
|
+
--------------
|
|
26
|
+
|
|
27
|
+
* Fixed some Bundler compatibility problems.
|
|
28
|
+
* Fixed some file descriptor passing problems, which previously
|
|
29
|
+
could lead to mysterious crashes.
|
|
30
|
+
* Fixed some compilation problems on newer GCC versions. Issue #430.
|
|
31
|
+
* Support #size method in rack.input.
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
Release 2.2.9
|
|
35
|
+
-------------
|
|
36
|
+
|
|
37
|
+
* Fixed compatibility with Rails 3.
|
|
38
|
+
Actually, previous Phusion Passenger releases were already compatible
|
|
39
|
+
with Rails 3, depending on the spawn method that would be invoked. Here's
|
|
40
|
+
the story:
|
|
41
|
+
|
|
42
|
+
Since Phusion Passenger 2.2.8, when the file config.ru exists, Phusion
|
|
43
|
+
Passenger will treat the app as a Rack app, not as a Rails app. This is
|
|
44
|
+
in contrast to earlier versions which gave Rails detection more priority
|
|
45
|
+
than Rack detection. Phusion Passenger loads Rack apps and Rails apps in
|
|
46
|
+
different ways. The Rails loader was not compatible with Rails 3, which
|
|
47
|
+
is what we've fixed in this release.
|
|
48
|
+
|
|
49
|
+
That said, a Rails 3 app would have worked out-of-the-box on Phusion
|
|
50
|
+
Passenger 2.2.8 as well because Rails 3 apps include a config.ru file
|
|
51
|
+
by default, causing Phusion Passenger 2.2.8 to use the Rack loader.
|
|
52
|
+
Earlier versions of Phusion Passenger would just completely bail out
|
|
53
|
+
because they'd use the Rails loader.
|
|
54
|
+
|
|
55
|
+
That said, with 2.2.9 there are still some caveats:
|
|
56
|
+
- Smart spawning (the mechanism with which REE's 33% memory reduction
|
|
57
|
+
is implemented) is *not* supported for Rack apps. This means that if
|
|
58
|
+
you want to utilize smart spawning with Rails 3, then you should
|
|
59
|
+
remove your config.ru file.
|
|
60
|
+
- Rails 3 depends on Rack 1.1.0. You must have Rack 1.1.0 installed as
|
|
61
|
+
a gem, even if you've bundled it with the gem bundler. This is because
|
|
62
|
+
Phusion Passenger itself depends on Rack.
|
|
63
|
+
|
|
64
|
+
Both of these caveats are temporary. We have plans to solve both of these
|
|
65
|
+
properly in the future.
|
|
66
|
+
* What's up with the Gem Bundler?
|
|
67
|
+
There has been some reports that Phusion Passenger is not compatible with
|
|
68
|
+
Yehuda Katz's gem bundler (http://github.com/wycats/bundler). This might
|
|
69
|
+
have been true for an earlier version of the gem bundler, but the latest
|
|
70
|
+
version seems to work fine. Please note that you need to insert the
|
|
71
|
+
following snippet in config/preinitializer.rb, as instructed by the gem
|
|
72
|
+
bundler's README:
|
|
73
|
+
|
|
74
|
+
require "#{RAILS_ROOT}/vendor/gems/environment"
|
|
75
|
+
|
|
76
|
+
The Rails::Boot monkey patching code as posted at
|
|
77
|
+
http://yehudakatz.com/2009/11/03/using-the-new-gem-bundler-today/
|
|
78
|
+
does not seem to be required anymore.
|
|
79
|
+
* Fixed support for ActiveRecord subclasses that connect to another database.
|
|
80
|
+
ActiveRecord subclasses that connect to a database other than the default
|
|
81
|
+
one did not have their connection correctly cleared after forking.
|
|
82
|
+
This can result in weird errors along the lines of "Lost connection to
|
|
83
|
+
MySQL server during query". Issue #429.
|
|
84
|
+
* [Nginx] Fixed PCRE URL.
|
|
85
|
+
passenger-install-nginx-module downloads PCRE 7.8 if PCRE is not already
|
|
86
|
+
installed. However PCRE 7.8 has been removed from their FTP server,
|
|
87
|
+
so we've updated the URL to point to the latest version, 8.0.
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
Release 2.2.8
|
|
91
|
+
-------------
|
|
92
|
+
|
|
93
|
+
* [Nginx] Fixed some signal handling problems.
|
|
94
|
+
Restarting Nginx on OS X with SIGHUP can sometimes take a long time or
|
|
95
|
+
even fail completely. This is because of some signal handling problems,
|
|
96
|
+
which have now been fixed.
|
|
97
|
+
* [Nginx] Added OpenSSL as dependency.
|
|
98
|
+
OpenSSL is required in order to install Nginx, but this was not checked
|
|
99
|
+
by passenger-install-nginx-module. As a result,
|
|
100
|
+
passenger-install-nginx-module fails on e.g. out-of-the-box Ubuntu
|
|
101
|
+
installations until the user manually installs OpenSSL. Issue #422.
|
|
102
|
+
* [Nginx] Fixed support for internal redirects and subrequests.
|
|
103
|
+
It is now possible to, for example, point X-Accel-Redirects to Phusion
|
|
104
|
+
Passenger-served URLs. Patch contributed by W. Andrew Loe III: issue #433.
|
|
105
|
+
* [Apache] Fixed a GnuTLS compatibility issue.
|
|
106
|
+
mod_gnutls can cause Phusion Passenger to crash because of an unchecked
|
|
107
|
+
NULL pointer. This problem has now been fixed: issue #391.
|
|
108
|
+
* Fixed thread creation issue on Intel Itanium platforms.
|
|
109
|
+
This fixes issue #427.
|
|
110
|
+
* Fixed compilation problems on Linux running on the Renesas SH4 CPU.
|
|
111
|
+
Patch contributed by iwamatsu: issue #428.
|
|
112
|
+
* The Rack library has been unvendored.
|
|
113
|
+
The original reason for vendoring was to work around broken Rails
|
|
114
|
+
applications that explicitly specify Rack as a gem dependency. We've
|
|
115
|
+
found a better workaround that does not require vendoring Rack.
|
|
116
|
+
This also fixes a compatibility problem with Rails 3, because Rails
|
|
117
|
+
3 depends on a newer Rack version than the one we had vendored.
|
|
118
|
+
Issue #432.
|
|
119
|
+
* Fixed compatibility with Ruby 1.9.1 patchlevel >= 152
|
|
120
|
+
Ruby 1.9.1 patchlevel >= 152 has a bug in its tempfile library. If you've
|
|
121
|
+
seen an error message along the lines of
|
|
122
|
+
|
|
123
|
+
*** Exception IOError in Passenger RequestHandler (closed stream)
|
|
124
|
+
|
|
125
|
+
then this is a Ruby bug at work. This bug has been fixed in Ruby 1.9.2,
|
|
126
|
+
but Ruby 1.9.1 still contains this bug. We've added a workaround so that
|
|
127
|
+
the bug is not triggered with this Ruby version. Issue #432.
|
|
128
|
+
|
|
129
|
+
|
|
1
130
|
Release 2.2.7
|
|
2
131
|
-------------
|
|
3
132
|
|
data/Rakefile
CHANGED
|
@@ -648,7 +648,7 @@ spec = Gem::Specification.new do |s|
|
|
|
648
648
|
s.homepage = "http://www.colouringcode.com/"
|
|
649
649
|
s.summary = "Apache module for Ruby on Rails support, custom template support"
|
|
650
650
|
s.name = "colouringcode-passenger"
|
|
651
|
-
s.version = "0.
|
|
651
|
+
s.version = "0.2"
|
|
652
652
|
s.rubyforge_project = "colouringcode-passenger"
|
|
653
653
|
s.author = "Colouring Code - http://www.colouringcode.com/"
|
|
654
654
|
s.email = "techystuff@colouringcode.com"
|
|
@@ -656,6 +656,7 @@ spec = Gem::Specification.new do |s|
|
|
|
656
656
|
s.require_paths = ["lib", "ext"]
|
|
657
657
|
s.add_dependency 'rake', '>= 0.8.1'
|
|
658
658
|
s.add_dependency 'fastthread', '>= 1.0.1'
|
|
659
|
+
s.add_dependency 'rack'
|
|
659
660
|
s.extensions << 'ext/phusion_passenger/extconf.rb'
|
|
660
661
|
s.files = FileList[
|
|
661
662
|
'Rakefile',
|
|
@@ -702,7 +703,6 @@ spec = Gem::Specification.new do |s|
|
|
|
702
703
|
'benchmark/*.{cpp,rb}',
|
|
703
704
|
'misc/*',
|
|
704
705
|
'misc/*/*',
|
|
705
|
-
'vendor/**/*',
|
|
706
706
|
'test/*.{rb,cpp,example}',
|
|
707
707
|
'test/support/*.{cpp,h,rb}',
|
|
708
708
|
'test/oxt/*.cpp',
|
|
@@ -45,6 +45,8 @@ class Installer < PhusionPassenger::AbstractInstaller
|
|
|
45
45
|
Dependencies::Ruby_OpenSSL,
|
|
46
46
|
Dependencies::RubyGems,
|
|
47
47
|
Dependencies::Rake,
|
|
48
|
+
Dependencies::Rack,
|
|
49
|
+
Dependencies::OpenSSL_Dev,
|
|
48
50
|
Dependencies::Zlib_Dev
|
|
49
51
|
]
|
|
50
52
|
if Dependencies.fastthread_required?
|
|
@@ -147,8 +149,8 @@ private
|
|
|
147
149
|
new_screen
|
|
148
150
|
color_puts "<banner>PCRE (required by Nginx) not installed, downloading it...</banner>"
|
|
149
151
|
|
|
150
|
-
basename = "pcre-
|
|
151
|
-
dirname = "pcre-
|
|
152
|
+
basename = "pcre-8.00.tar.gz"
|
|
153
|
+
dirname = "pcre-8.00"
|
|
152
154
|
url = "ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/#{basename}"
|
|
153
155
|
File.unlink("/tmp/#{basename}") rescue nil
|
|
154
156
|
FileUtils.rm_rf("/tmp/#{dirname}")
|
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
|
}
|
|
@@ -752,7 +752,7 @@ public:
|
|
|
752
752
|
// Write some random data to wake up the server.
|
|
753
753
|
channel.writeRaw("x", 1);
|
|
754
754
|
|
|
755
|
-
clientConnection = channel.readFileDescriptor();
|
|
755
|
+
clientConnection = channel.readFileDescriptor(false);
|
|
756
756
|
return ptr(new Client(clientConnection));
|
|
757
757
|
} catch (const SystemException &e) {
|
|
758
758
|
throw SystemException("Could not connect to the ApplicationPool server", e.code());
|
data/ext/common/MessageChannel.h
CHANGED
|
@@ -319,12 +319,24 @@ public:
|
|
|
319
319
|
* descriptor is a Unix socket.
|
|
320
320
|
*
|
|
321
321
|
* @param fileDescriptor The file descriptor to pass.
|
|
322
|
+
* @param negotiate See Ruby's MessageChannel#send_io method's comments.
|
|
322
323
|
* @throws SystemException Something went wrong during file descriptor passing.
|
|
323
324
|
* @throws boost::thread_interrupted
|
|
324
325
|
* @pre <tt>fileDescriptor >= 0</tt>
|
|
325
326
|
* @see readFileDescriptor()
|
|
326
327
|
*/
|
|
327
|
-
void writeFileDescriptor(int fileDescriptor) {
|
|
328
|
+
void writeFileDescriptor(int fileDescriptor, bool negotiate = true) {
|
|
329
|
+
// See message_channel.rb for more info about negotiation.
|
|
330
|
+
if (negotiate) {
|
|
331
|
+
vector<string> args;
|
|
332
|
+
|
|
333
|
+
if (!read(args)) {
|
|
334
|
+
throw IOException("Unexpected end of stream encountered while pre-negotiating a file descriptor");
|
|
335
|
+
} else if (args.size() != 1 || args[0] != "pass IO") {
|
|
336
|
+
throw IOException("FD passing pre-negotiation message expected.");
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
328
340
|
struct msghdr msg;
|
|
329
341
|
struct iovec vec;
|
|
330
342
|
char dummy[1];
|
|
@@ -368,6 +380,16 @@ public:
|
|
|
368
380
|
if (ret == -1) {
|
|
369
381
|
throw SystemException("Cannot send file descriptor with sendmsg()", errno);
|
|
370
382
|
}
|
|
383
|
+
|
|
384
|
+
if (negotiate) {
|
|
385
|
+
vector<string> args;
|
|
386
|
+
|
|
387
|
+
if (!read(args)) {
|
|
388
|
+
throw IOException("Unexpected end of stream encountered while post-negotiating a file descriptor");
|
|
389
|
+
} else if (args.size() != 1 || args[0] != "got IO") {
|
|
390
|
+
throw IOException("FD passing post-negotiation message expected.");
|
|
391
|
+
}
|
|
392
|
+
}
|
|
371
393
|
}
|
|
372
394
|
|
|
373
395
|
/**
|
|
@@ -492,6 +514,7 @@ public:
|
|
|
492
514
|
* Receive a file descriptor, which had been passed over the underlying
|
|
493
515
|
* file descriptor.
|
|
494
516
|
*
|
|
517
|
+
* @param negotiate See Ruby's MessageChannel#send_io method's comments.
|
|
495
518
|
* @return The passed file descriptor.
|
|
496
519
|
* @throws SystemException If something went wrong during the
|
|
497
520
|
* receiving of a file descriptor. Perhaps the underlying
|
|
@@ -500,7 +523,12 @@ public:
|
|
|
500
523
|
* file descriptor.
|
|
501
524
|
* @throws boost::thread_interrupted
|
|
502
525
|
*/
|
|
503
|
-
int readFileDescriptor() {
|
|
526
|
+
int readFileDescriptor(bool negotiate = true) {
|
|
527
|
+
// See message_channel.rb for more info about negotiation.
|
|
528
|
+
if (negotiate) {
|
|
529
|
+
write("pass IO", NULL);
|
|
530
|
+
}
|
|
531
|
+
|
|
504
532
|
struct msghdr msg;
|
|
505
533
|
struct iovec vec;
|
|
506
534
|
char dummy[1];
|
|
@@ -538,16 +566,32 @@ public:
|
|
|
538
566
|
}
|
|
539
567
|
|
|
540
568
|
control_header = CMSG_FIRSTHDR(&msg);
|
|
569
|
+
if (control_header == NULL) {
|
|
570
|
+
throw IOException("No valid file descriptor received.");
|
|
571
|
+
}
|
|
541
572
|
if (control_header->cmsg_len != EXPECTED_CMSG_LEN
|
|
542
573
|
|| control_header->cmsg_level != SOL_SOCKET
|
|
543
574
|
|| control_header->cmsg_type != SCM_RIGHTS) {
|
|
544
575
|
throw IOException("No valid file descriptor received.");
|
|
545
576
|
}
|
|
577
|
+
|
|
546
578
|
#if defined(__APPLE__) || defined(__SOLARIS__) || defined(__arm__)
|
|
547
|
-
|
|
579
|
+
int fd = control_data.fd;
|
|
548
580
|
#else
|
|
549
|
-
|
|
581
|
+
int fd = *((int *) CMSG_DATA(control_header));
|
|
550
582
|
#endif
|
|
583
|
+
|
|
584
|
+
if (negotiate) {
|
|
585
|
+
try {
|
|
586
|
+
write("got IO", NULL);
|
|
587
|
+
} catch (...) {
|
|
588
|
+
this_thread::disable_syscall_interruption dsi;
|
|
589
|
+
syscalls::close(fd);
|
|
590
|
+
throw;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
return fd;
|
|
551
595
|
}
|
|
552
596
|
|
|
553
597
|
/**
|
|
@@ -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
|