passenger 2.0.6 → 2.1.2

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 (497) hide show
  1. data/DEVELOPERS.TXT +10 -4
  2. data/LICENSE +1 -1
  3. data/NEWS +0 -0
  4. data/Rakefile +183 -117
  5. data/benchmark/dispatcher.rb +5 -9
  6. data/bin/passenger-install-apache2-module +52 -18
  7. data/bin/passenger-memory-stats +67 -13
  8. data/bin/passenger-spawn-server +8 -4
  9. data/bin/passenger-status +21 -46
  10. data/bin/passenger-stress-test +5 -5
  11. data/debian/postinst +1 -1
  12. data/doc/ApplicationPool algorithm.txt +180 -128
  13. data/doc/Architectural overview.html +1 -778
  14. data/doc/Security of user switching support.html +1 -643
  15. data/doc/Users guide Apache.html +3127 -0
  16. data/doc/Users guide Nginx.html +1458 -0
  17. data/doc/Users guide.html +1404 -467
  18. data/doc/Users guide.txt +843 -105
  19. data/doc/cxxapi/ApplicationPoolServer_8h-source.html +751 -641
  20. data/doc/cxxapi/ApplicationPool_8h-source.html +168 -171
  21. data/doc/cxxapi/Application_8h-source.html +494 -394
  22. data/doc/cxxapi/Bucket_8h-source.html +21 -15
  23. data/doc/cxxapi/CachedFileStat_8h-source.html +191 -0
  24. data/doc/cxxapi/Configuration_8h-source.html +311 -149
  25. data/doc/cxxapi/DirectoryMapper_8h-source.html +309 -0
  26. data/doc/cxxapi/DummySpawnManager_8h-source.html +3 -4
  27. data/doc/cxxapi/Exceptions_8h-source.html +182 -165
  28. data/doc/cxxapi/FileChecker_8h-source.html +130 -0
  29. data/doc/cxxapi/Hooks_8h-source.html +2 -3
  30. data/doc/cxxapi/Logging_8h-source.html +92 -89
  31. data/doc/cxxapi/MessageChannel_8h-source.html +585 -477
  32. data/doc/cxxapi/PoolOptions_8h-source.html +305 -0
  33. data/doc/cxxapi/SpawnManager_8h-source.html +515 -540
  34. data/doc/cxxapi/StandardApplicationPool_8h-source.html +779 -679
  35. data/doc/cxxapi/SystemTime_8h-source.html +104 -0
  36. data/doc/cxxapi/Utils_8h-source.html +331 -227
  37. data/doc/cxxapi/annotated.html +6 -7
  38. data/doc/cxxapi/classClient-members.html +1 -2
  39. data/doc/cxxapi/classClient.html +1 -2
  40. data/doc/cxxapi/classHooks-members.html +5 -2
  41. data/doc/cxxapi/classHooks.html +112 -2
  42. data/doc/cxxapi/classPassenger_1_1Application-members.html +2 -3
  43. data/doc/cxxapi/classPassenger_1_1Application.html +8 -9
  44. data/doc/cxxapi/classPassenger_1_1ApplicationPool-members.html +4 -4
  45. data/doc/cxxapi/classPassenger_1_1ApplicationPool.html +42 -81
  46. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer-members.html +1 -2
  47. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer.html +3 -4
  48. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.png +0 -0
  49. data/doc/cxxapi/classPassenger_1_1Application_1_1Session-members.html +3 -2
  50. data/doc/cxxapi/classPassenger_1_1Application_1_1Session.html +74 -3
  51. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +1 -2
  52. data/doc/cxxapi/classPassenger_1_1BusyException.html +2 -3
  53. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +1 -2
  54. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +2 -3
  55. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +38 -0
  56. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +256 -0
  57. data/doc/cxxapi/classPassenger_1_1DummySpawnManager-members.html +1 -2
  58. data/doc/cxxapi/classPassenger_1_1DummySpawnManager.html +2 -3
  59. data/doc/cxxapi/{classPassenger_1_1Thread-members.html → classPassenger_1_1FileChecker-members.html} +4 -5
  60. data/doc/cxxapi/classPassenger_1_1FileChecker.html +121 -0
  61. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +1 -2
  62. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +2 -3
  63. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
  64. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +2 -3
  65. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +2 -3
  66. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
  67. data/doc/cxxapi/classPassenger_1_1IOException-members.html +1 -2
  68. data/doc/cxxapi/classPassenger_1_1IOException.html +2 -3
  69. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
  70. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +5 -2
  71. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +155 -5
  72. data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption-members.html → classPassenger_1_1RuntimeException-members.html} +2 -3
  73. data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption.html → classPassenger_1_1RuntimeException.html} +10 -8
  74. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -2
  75. data/doc/cxxapi/classPassenger_1_1SpawnException.html +2 -3
  76. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +2 -3
  77. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +15 -56
  78. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool-members.html +5 -4
  79. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool.html +20 -81
  80. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.png +0 -0
  81. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +2 -3
  82. data/doc/cxxapi/classPassenger_1_1SystemException.html +9 -10
  83. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
  84. data/doc/cxxapi/{classboost_1_1this__thread_1_1disable__syscall__interruption-members.html → classPassenger_1_1SystemTime-members.html} +5 -3
  85. data/doc/cxxapi/classPassenger_1_1SystemTime.html +86 -0
  86. data/doc/cxxapi/classPassenger_1_1TempFile-members.html +2 -3
  87. data/doc/cxxapi/classPassenger_1_1TempFile.html +17 -9
  88. data/doc/cxxapi/definitions_8h-source.html +1 -2
  89. data/doc/cxxapi/files.html +6 -3
  90. data/doc/cxxapi/functions.html +98 -35
  91. data/doc/cxxapi/functions_func.html +60 -32
  92. data/doc/cxxapi/functions_type.html +1 -2
  93. data/doc/cxxapi/functions_vars.html +27 -2
  94. data/doc/cxxapi/graph_legend.html +1 -2
  95. data/doc/cxxapi/graph_legend.png +0 -0
  96. data/doc/cxxapi/group__Configuration.html +3 -4
  97. data/doc/cxxapi/group__Configuration.png +0 -0
  98. data/doc/cxxapi/group__Core.html +3 -4
  99. data/doc/cxxapi/group__Core.png +0 -0
  100. data/doc/cxxapi/group__Exceptions.html +4 -2
  101. data/doc/cxxapi/group__Hooks.html +1 -6
  102. data/doc/cxxapi/group__Hooks.png +0 -0
  103. data/doc/cxxapi/group__Support.html +259 -36
  104. data/doc/cxxapi/hierarchy.html +6 -7
  105. data/doc/cxxapi/inherit__graph__0.map +1 -1
  106. data/doc/cxxapi/inherit__graph__0.md5 +1 -1
  107. data/doc/cxxapi/inherit__graph__0.png +0 -0
  108. data/doc/cxxapi/inherit__graph__1.map +1 -1
  109. data/doc/cxxapi/inherit__graph__1.md5 +1 -1
  110. data/doc/cxxapi/inherit__graph__1.png +0 -0
  111. data/doc/cxxapi/inherit__graph__10.map +1 -1
  112. data/doc/cxxapi/inherit__graph__10.md5 +1 -1
  113. data/doc/cxxapi/inherit__graph__10.png +0 -0
  114. data/doc/cxxapi/inherit__graph__11.map +1 -1
  115. data/doc/cxxapi/inherit__graph__11.md5 +1 -1
  116. data/doc/cxxapi/inherit__graph__11.png +0 -0
  117. data/doc/cxxapi/inherit__graph__12.map +2 -1
  118. data/doc/cxxapi/inherit__graph__12.md5 +1 -1
  119. data/doc/cxxapi/inherit__graph__12.png +0 -0
  120. data/doc/cxxapi/inherit__graph__13.map +1 -1
  121. data/doc/cxxapi/inherit__graph__13.md5 +1 -1
  122. data/doc/cxxapi/inherit__graph__13.png +0 -0
  123. data/doc/cxxapi/inherit__graph__14.map +1 -2
  124. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  125. data/doc/cxxapi/inherit__graph__14.png +0 -0
  126. data/doc/cxxapi/inherit__graph__15.map +1 -1
  127. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  128. data/doc/cxxapi/inherit__graph__15.png +0 -0
  129. data/doc/cxxapi/inherit__graph__16.map +1 -1
  130. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  131. data/doc/cxxapi/inherit__graph__16.png +0 -0
  132. data/doc/cxxapi/inherit__graph__17.png +0 -0
  133. data/doc/cxxapi/inherit__graph__18.png +0 -0
  134. data/doc/cxxapi/inherit__graph__19.png +0 -0
  135. data/doc/cxxapi/inherit__graph__2.map +1 -1
  136. data/doc/cxxapi/inherit__graph__2.md5 +1 -1
  137. data/doc/cxxapi/inherit__graph__2.png +0 -0
  138. data/doc/cxxapi/inherit__graph__20.map +1 -1
  139. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  140. data/doc/cxxapi/inherit__graph__20.png +0 -0
  141. data/doc/cxxapi/inherit__graph__21.map +1 -1
  142. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  143. data/doc/cxxapi/inherit__graph__21.png +0 -0
  144. data/doc/cxxapi/inherit__graph__3.map +1 -1
  145. data/doc/cxxapi/inherit__graph__3.md5 +1 -1
  146. data/doc/cxxapi/inherit__graph__3.png +0 -0
  147. data/doc/cxxapi/inherit__graph__4.map +1 -1
  148. data/doc/cxxapi/inherit__graph__4.md5 +1 -1
  149. data/doc/cxxapi/inherit__graph__4.png +0 -0
  150. data/doc/cxxapi/inherit__graph__5.map +2 -1
  151. data/doc/cxxapi/inherit__graph__5.md5 +1 -1
  152. data/doc/cxxapi/inherit__graph__5.png +0 -0
  153. data/doc/cxxapi/inherit__graph__6.map +1 -1
  154. data/doc/cxxapi/inherit__graph__6.md5 +1 -1
  155. data/doc/cxxapi/inherit__graph__6.png +0 -0
  156. data/doc/cxxapi/inherit__graph__7.map +1 -1
  157. data/doc/cxxapi/inherit__graph__7.md5 +1 -1
  158. data/doc/cxxapi/inherit__graph__7.png +0 -0
  159. data/doc/cxxapi/inherit__graph__8.map +1 -1
  160. data/doc/cxxapi/inherit__graph__8.md5 +1 -1
  161. data/doc/cxxapi/inherit__graph__8.png +0 -0
  162. data/doc/cxxapi/inherit__graph__9.map +1 -2
  163. data/doc/cxxapi/inherit__graph__9.md5 +1 -1
  164. data/doc/cxxapi/inherit__graph__9.png +0 -0
  165. data/doc/cxxapi/inherits.html +30 -31
  166. data/doc/cxxapi/main.html +1 -2
  167. data/doc/cxxapi/modules.html +1 -2
  168. data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +1 -2
  169. data/doc/cxxapi/structPassenger_1_1AnythingToString.html +2 -3
  170. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +1 -2
  171. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +2 -3
  172. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +49 -0
  173. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +404 -0
  174. data/doc/cxxapi/tree.html +18 -20
  175. data/doc/images/conservative_spawning.png +0 -0
  176. data/doc/images/conservative_spawning.svg +248 -0
  177. data/doc/images/smart-lv2.png +0 -0
  178. data/doc/images/smart-lv2.svg +320 -0
  179. data/doc/rdoc/classes/ConditionVariable.html +68 -34
  180. data/doc/rdoc/classes/Exception.html +16 -16
  181. data/doc/rdoc/classes/GC.html +9 -9
  182. data/doc/rdoc/classes/IO.html +36 -17
  183. data/doc/rdoc/classes/PhusionPassenger.html +183 -0
  184. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +511 -0
  185. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer.html +285 -242
  186. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerAlreadyStarted.html +3 -3
  187. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerError.html +3 -3
  188. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerNotStarted.html +3 -3
  189. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/UnknownMessage.html +3 -3
  190. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +598 -0
  191. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +140 -0
  192. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess.html +247 -0
  193. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess/Instance.html +138 -0
  194. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AppInitError.html +36 -19
  195. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/Application.html +81 -96
  196. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/ConsoleTextTemplate.html +18 -18
  197. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/FrameworkInitError.html +20 -18
  198. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/HTMLTemplate.html +18 -18
  199. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/InitializationError.html +9 -9
  200. data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +92 -0
  201. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/MessageChannel.html +93 -92
  202. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/NativeSupport.html +55 -25
  203. data/doc/rdoc/classes/PhusionPassenger/Rack.html +91 -0
  204. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +185 -0
  205. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +182 -0
  206. data/doc/rdoc/classes/PhusionPassenger/Railz.html +95 -0
  207. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +424 -0
  208. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner/Error.html +98 -0
  209. data/doc/rdoc/classes/PhusionPassenger/Railz/CGIFixed.html +200 -0
  210. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +444 -0
  211. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner/Error.html +98 -0
  212. data/doc/rdoc/classes/PhusionPassenger/Railz/RequestHandler.html +154 -0
  213. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +408 -0
  214. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/UnknownError.html +13 -13
  215. data/doc/rdoc/classes/PhusionPassenger/Utils.html +687 -0
  216. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/VersionNotFound.html +8 -8
  217. data/doc/rdoc/classes/PhusionPassenger/WSGI.html +89 -0
  218. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +188 -0
  219. data/doc/rdoc/classes/PlatformInfo.html +663 -159
  220. data/doc/rdoc/classes/RakeExtensions.html +4 -4
  221. data/doc/rdoc/classes/Signal.html +134 -0
  222. data/doc/rdoc/created.rid +1 -1
  223. data/doc/rdoc/files/DEVELOPERS_TXT.html +15 -10
  224. data/doc/rdoc/files/README.html +5 -7
  225. data/doc/rdoc/files/ext/{passenger → phusion_passenger}/native_support_c.html +2 -2
  226. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_request_handler_rb.html +7 -9
  227. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +120 -0
  228. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_server_rb.html +7 -10
  229. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +99 -0
  230. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +92 -0
  231. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/application_rb.html +6 -8
  232. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/console_text_template_rb.html +5 -7
  233. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/constants_rb.html +4 -5
  234. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/dependencies_rb.html +6 -8
  235. data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +116 -0
  236. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/exceptions_rb.html +5 -7
  237. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/html_template_rb.html +5 -7
  238. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/message_channel_rb.html +5 -7
  239. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/platform_info_rb.html +6 -7
  240. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +123 -0
  241. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +117 -0
  242. data/doc/rdoc/files/lib/{passenger/utils_rb.html → phusion_passenger/railz/application_spawner_rb.html} +24 -17
  243. data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +126 -0
  244. data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +139 -0
  245. data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +118 -0
  246. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/simple_benchmarking_rb.html +5 -7
  247. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/spawn_manager_rb.html +40 -24
  248. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +169 -0
  249. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +120 -0
  250. data/doc/rdoc/files/lib/rake/extensions_rb.html +3 -4
  251. data/doc/rdoc/fr_class_index.html +37 -19
  252. data/doc/rdoc/fr_file_index.html +25 -14
  253. data/doc/rdoc/fr_method_index.html +145 -74
  254. data/ext/apache2/Application.h +145 -44
  255. data/ext/apache2/ApplicationPool.h +27 -29
  256. data/ext/apache2/ApplicationPoolServer.h +183 -72
  257. data/ext/apache2/ApplicationPoolServerExecutable.cpp +249 -42
  258. data/ext/apache2/Bucket.cpp +61 -9
  259. data/ext/apache2/Bucket.h +15 -8
  260. data/ext/apache2/CachedFileStat.cpp +114 -0
  261. data/ext/apache2/CachedFileStat.h +169 -0
  262. data/ext/apache2/Configuration.cpp +213 -22
  263. data/ext/apache2/Configuration.h +176 -13
  264. data/ext/apache2/DirectoryMapper.h +287 -0
  265. data/ext/apache2/Exceptions.h +30 -12
  266. data/ext/apache2/FileChecker.h +108 -0
  267. data/ext/apache2/Hooks.cpp +709 -493
  268. data/ext/apache2/LICENSE-CNRI.TXT +15 -0
  269. data/ext/apache2/Logging.h +26 -22
  270. data/ext/apache2/MessageChannel.h +124 -15
  271. data/ext/apache2/PoolOptions.h +283 -0
  272. data/ext/apache2/SpawnManager.h +75 -99
  273. data/ext/apache2/StandardApplicationPool.h +296 -195
  274. data/ext/apache2/SystemTime.cpp +28 -0
  275. data/ext/apache2/SystemTime.h +82 -0
  276. data/ext/apache2/Utils.cpp +172 -18
  277. data/ext/apache2/Utils.h +124 -19
  278. data/ext/boost/cstdint.hpp +4 -2
  279. data/ext/boost/current_function.hpp +67 -0
  280. data/ext/boost/detail/sp_counted_base.hpp +4 -4
  281. data/ext/boost/thread/exceptions.hpp +2 -1
  282. data/ext/boost/thread/pthread/thread.hpp +11 -3
  283. data/ext/boost/thread/pthread/thread_data.hpp +2 -1
  284. data/ext/oxt/backtrace.cpp +172 -0
  285. data/ext/oxt/backtrace.hpp +135 -0
  286. data/ext/oxt/detail/backtrace_disabled.hpp +39 -0
  287. data/ext/oxt/detail/backtrace_enabled.hpp +155 -0
  288. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +82 -0
  289. data/ext/oxt/detail/spin_lock_portable.hpp +38 -0
  290. data/ext/oxt/detail/spin_lock_pthreads.hpp +97 -0
  291. data/ext/oxt/detail/tracable_exception_disabled.hpp +46 -0
  292. data/ext/oxt/detail/tracable_exception_enabled.hpp +48 -0
  293. data/ext/oxt/macros.hpp +58 -0
  294. data/ext/oxt/spin_lock.hpp +55 -0
  295. data/ext/{apache2/System.cpp → oxt/system_calls.cpp} +87 -52
  296. data/ext/oxt/system_calls.hpp +234 -0
  297. data/ext/oxt/thread.cpp +32 -0
  298. data/ext/oxt/thread.hpp +223 -0
  299. data/ext/oxt/tracable_exception.cpp +87 -0
  300. data/ext/oxt/tracable_exception.hpp +35 -0
  301. data/{lib/passenger/constants.rb → ext/phusion_passenger/extconf.rb} +14 -9
  302. data/ext/{passenger → phusion_passenger}/native_support.c +33 -6
  303. data/lib/{passenger → phusion_passenger}/abstract_request_handler.rb +209 -93
  304. data/lib/{passenger → phusion_passenger}/abstract_server.rb +23 -8
  305. data/lib/phusion_passenger/abstract_server_collection.rb +301 -0
  306. data/lib/phusion_passenger/admin_tools.rb +25 -0
  307. data/lib/phusion_passenger/admin_tools/control_process.rb +107 -0
  308. data/lib/{passenger → phusion_passenger}/application.rb +13 -16
  309. data/lib/{passenger → phusion_passenger}/console_text_template.rb +2 -2
  310. data/{ext/passenger/extconf.rb → lib/phusion_passenger/constants.rb} +5 -5
  311. data/lib/{passenger → phusion_passenger}/dependencies.rb +38 -32
  312. data/lib/phusion_passenger/events.rb +45 -0
  313. data/lib/{passenger → phusion_passenger}/exceptions.rb +12 -5
  314. data/lib/{passenger → phusion_passenger}/html_template.rb +2 -2
  315. data/lib/{passenger → phusion_passenger}/message_channel.rb +3 -2
  316. data/lib/phusion_passenger/platform_info.rb +500 -0
  317. data/lib/{passenger → phusion_passenger}/rack/application_spawner.rb +29 -22
  318. data/lib/{passenger → phusion_passenger}/rack/request_handler.rb +14 -9
  319. data/lib/{passenger → phusion_passenger}/railz/application_spawner.rb +94 -74
  320. data/lib/{passenger → phusion_passenger}/railz/cgi_fixed.rb +2 -2
  321. data/lib/{passenger → phusion_passenger}/railz/framework_spawner.rb +86 -98
  322. data/lib/{passenger → phusion_passenger}/railz/request_handler.rb +6 -6
  323. data/lib/{passenger → phusion_passenger}/simple_benchmarking.rb +0 -0
  324. data/lib/{passenger → phusion_passenger}/spawn_manager.rb +136 -128
  325. data/lib/{passenger → phusion_passenger}/templates/apache2_config_snippets.txt.erb +0 -0
  326. data/lib/{passenger → phusion_passenger}/templates/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
  327. data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +38 -0
  328. data/lib/{passenger → phusion_passenger}/templates/app_init_error.html.erb +0 -0
  329. data/lib/{passenger → phusion_passenger}/templates/database_error.html.erb +0 -0
  330. data/lib/{passenger → phusion_passenger}/templates/deployment_example.txt.erb +1 -1
  331. data/lib/{passenger → phusion_passenger}/templates/error_layout.css +0 -0
  332. data/lib/{passenger → phusion_passenger}/templates/error_layout.html.erb +0 -0
  333. data/lib/{passenger → phusion_passenger}/templates/framework_init_error.html.erb +0 -0
  334. data/lib/{passenger → phusion_passenger}/templates/general_error.html.erb +0 -0
  335. data/lib/{passenger → phusion_passenger}/templates/invalid_app_root.html.erb +1 -1
  336. data/lib/{passenger → phusion_passenger}/templates/load_error.html.erb +0 -0
  337. data/lib/{passenger → phusion_passenger}/templates/no_write_permission_to_passenger_root.txt.erb +0 -0
  338. data/lib/{passenger → phusion_passenger}/templates/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
  339. data/lib/{passenger → phusion_passenger}/templates/run_installer_as_root.txt.erb +0 -0
  340. data/lib/{passenger → phusion_passenger}/templates/version_not_found.html.erb +0 -0
  341. data/lib/{passenger → phusion_passenger}/templates/welcome.txt.erb +0 -0
  342. data/lib/{passenger → phusion_passenger}/utils.rb +210 -44
  343. data/lib/{passenger → phusion_passenger}/wsgi/application_spawner.rb +18 -15
  344. data/lib/{passenger → phusion_passenger}/wsgi/request_handler.py +7 -1
  345. data/man/passenger-memory-stats.8 +1 -1
  346. data/misc/render_error_pages.rb +1 -1
  347. data/test/ApplicationPoolServerTest.cpp +0 -28
  348. data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +4 -0
  349. data/test/ApplicationPoolTest.cpp +307 -69
  350. data/test/CachedFileStatTest.cpp +262 -0
  351. data/test/FileCheckerTest.cpp +79 -0
  352. data/test/MessageChannelTest.cpp +3 -3
  353. data/test/PoolOptionsTest.cpp +37 -0
  354. data/test/SpawnManagerTest.cpp +4 -4
  355. data/test/StandardApplicationPoolTest.cpp +4 -0
  356. data/test/SystemTimeTest.cpp +37 -0
  357. data/test/UtilsTest.cpp +137 -0
  358. data/test/integration_tests.rb +270 -23
  359. data/test/oxt/backtrace_test.cpp +128 -0
  360. data/test/oxt/oxt_test_main.cpp +25 -0
  361. data/test/oxt/syscall_interruption_test.cpp +50 -0
  362. data/test/ruby/abstract_request_handler_spec.rb +83 -0
  363. data/test/ruby/abstract_server_collection_spec.rb +246 -0
  364. data/test/ruby/application_spec.rb +3 -3
  365. data/test/ruby/message_channel_spec.rb +2 -2
  366. data/test/ruby/rack/application_spawner_spec.rb +3 -5
  367. data/test/ruby/rails/application_spawner_spec.rb +54 -15
  368. data/test/ruby/rails/framework_spawner_spec.rb +6 -8
  369. data/test/ruby/rails/minimal_spawner_spec.rb +29 -0
  370. data/test/ruby/rails/spawner_error_handling_spec.rb +1 -1
  371. data/test/ruby/rails/spawner_privilege_lowering_spec.rb +3 -3
  372. data/test/ruby/spawn_manager_spec.rb +23 -12
  373. data/test/ruby/utils_spec.rb +36 -2
  374. data/test/ruby/wsgi/application_spawner_spec.rb +47 -0
  375. data/test/stub/apache2/httpd.conf.erb +3 -5
  376. data/test/stub/message_channel.rb +2 -2
  377. data/test/stub/message_channel_2.rb +2 -2
  378. data/test/stub/message_channel_3.rb +3 -3
  379. data/test/stub/minimal-railsapp/README +0 -0
  380. data/test/stub/minimal-railsapp/config/application.rb +0 -0
  381. data/test/stub/minimal-railsapp/config/environment.rb +0 -0
  382. data/test/stub/minimal-railsapp/vendor/rails/actionmailer/lib/action_mailer.rb +0 -0
  383. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_controller.rb +0 -0
  384. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_pack.rb +0 -0
  385. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_view.rb +0 -0
  386. data/test/stub/minimal-railsapp/vendor/rails/activerecord/lib/active_record.rb +0 -0
  387. data/test/stub/minimal-railsapp/vendor/rails/activeresource/lib/active_resource.rb +0 -0
  388. data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support.rb +0 -0
  389. data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +0 -0
  390. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/dispatcher.rb +0 -0
  391. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/initializer.rb +0 -0
  392. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/ruby_version_check.rb +0 -0
  393. data/test/stub/rails_apps/foobar/app/controllers/foo_controller.rb +8 -0
  394. data/test/stub/rails_apps/foobar/config/environments/development.rb +1 -2
  395. data/test/stub/rails_apps/mycook/app/controllers/welcome_controller.rb +21 -1
  396. data/test/stub/rails_apps/mycook/sites/some.site/public/uploads.html +26 -0
  397. data/test/stub/rails_apps/mycook/sites/some.site/public/welcome/cached.html +26 -0
  398. data/test/stub/railsapp/app/controllers/application.rb +0 -0
  399. data/test/stub/railsapp/app/controllers/bar_controller_1.rb +0 -0
  400. data/test/stub/railsapp/app/controllers/bar_controller_2.rb +1 -1
  401. data/test/stub/railsapp/app/controllers/foo_controller.rb +4 -0
  402. data/test/stub/railsapp/app/helpers/application_helper.rb +0 -0
  403. data/test/stub/railsapp/config/boot.rb +0 -0
  404. data/test/stub/railsapp/config/database.yml +0 -0
  405. data/test/stub/railsapp/config/environment.rb +0 -0
  406. data/test/stub/railsapp/config/environments/development.rb +0 -0
  407. data/test/stub/railsapp/config/environments/production.rb +0 -0
  408. data/test/stub/railsapp/config/initializers/inflections.rb +0 -0
  409. data/test/stub/railsapp/config/initializers/mime_types.rb +0 -0
  410. data/test/stub/railsapp/config/routes.rb +0 -0
  411. data/test/stub/railsapp/public/useless.txt +0 -0
  412. data/test/stub/spawn_server.rb +3 -4
  413. data/test/stub/wsgi/passenger_wsgi.pyc +0 -0
  414. data/test/support/apache2_controller.rb +57 -7
  415. data/test/support/tut.h +15 -0
  416. data/vendor/README +12 -0
  417. data/vendor/README_FOR_PACKAGERS +1 -0
  418. data/vendor/rack-0.9.1/AUTHORS +8 -0
  419. data/vendor/rack-0.9.1/COPYING +18 -0
  420. data/vendor/rack-0.9.1/ChangeLog +1423 -0
  421. data/vendor/rack-0.9.1/KNOWN-ISSUES +18 -0
  422. data/vendor/rack-0.9.1/README +306 -0
  423. data/vendor/rack-0.9.1/Rakefile +188 -0
  424. data/vendor/rack-0.9.1/SPEC +129 -0
  425. data/vendor/rack-0.9.1/lib/rack.rb +86 -0
  426. data/vendor/rack-0.9.1/lib/rack/adapter/camping.rb +22 -0
  427. data/vendor/rack-0.9.1/lib/rack/auth/abstract/handler.rb +28 -0
  428. data/vendor/rack-0.9.1/lib/rack/auth/abstract/request.rb +37 -0
  429. data/vendor/rack-0.9.1/lib/rack/auth/basic.rb +58 -0
  430. data/vendor/rack-0.9.1/lib/rack/auth/digest/md5.rb +124 -0
  431. data/vendor/rack-0.9.1/lib/rack/auth/digest/nonce.rb +51 -0
  432. data/vendor/rack-0.9.1/lib/rack/auth/digest/params.rb +55 -0
  433. data/vendor/rack-0.9.1/lib/rack/auth/digest/request.rb +40 -0
  434. data/vendor/rack-0.9.1/lib/rack/auth/openid.rb +438 -0
  435. data/vendor/rack-0.9.1/lib/rack/builder.rb +67 -0
  436. data/vendor/rack-0.9.1/lib/rack/cascade.rb +36 -0
  437. data/vendor/rack-0.9.1/lib/rack/commonlogger.rb +61 -0
  438. data/vendor/rack-0.9.1/lib/rack/conditionalget.rb +43 -0
  439. data/vendor/rack-0.9.1/lib/rack/content_length.rb +25 -0
  440. data/vendor/rack-0.9.1/lib/rack/deflater.rb +87 -0
  441. data/vendor/rack-0.9.1/lib/rack/directory.rb +150 -0
  442. data/vendor/rack-0.9.1/lib/rack/file.rb +85 -0
  443. data/vendor/rack-0.9.1/lib/rack/handler.rb +48 -0
  444. data/vendor/rack-0.9.1/lib/rack/handler/cgi.rb +57 -0
  445. data/vendor/rack-0.9.1/lib/rack/handler/evented_mongrel.rb +8 -0
  446. data/vendor/rack-0.9.1/lib/rack/handler/fastcgi.rb +86 -0
  447. data/vendor/rack-0.9.1/lib/rack/handler/lsws.rb +52 -0
  448. data/vendor/rack-0.9.1/lib/rack/handler/mongrel.rb +82 -0
  449. data/vendor/rack-0.9.1/lib/rack/handler/scgi.rb +57 -0
  450. data/vendor/rack-0.9.1/lib/rack/handler/swiftiplied_mongrel.rb +8 -0
  451. data/vendor/rack-0.9.1/lib/rack/handler/thin.rb +15 -0
  452. data/vendor/rack-0.9.1/lib/rack/handler/webrick.rb +61 -0
  453. data/vendor/rack-0.9.1/lib/rack/head.rb +19 -0
  454. data/vendor/rack-0.9.1/lib/rack/lint.rb +465 -0
  455. data/vendor/rack-0.9.1/lib/rack/lobster.rb +65 -0
  456. data/vendor/rack-0.9.1/lib/rack/methodoverride.rb +27 -0
  457. data/vendor/rack-0.9.1/lib/rack/mime.rb +204 -0
  458. data/vendor/rack-0.9.1/lib/rack/mock.rb +160 -0
  459. data/vendor/rack-0.9.1/lib/rack/recursive.rb +57 -0
  460. data/vendor/rack-0.9.1/lib/rack/reloader.rb +64 -0
  461. data/vendor/rack-0.9.1/lib/rack/request.rb +218 -0
  462. data/vendor/rack-0.9.1/lib/rack/response.rb +171 -0
  463. data/vendor/rack-0.9.1/lib/rack/session/abstract/id.rb +153 -0
  464. data/vendor/rack-0.9.1/lib/rack/session/cookie.rb +89 -0
  465. data/vendor/rack-0.9.1/lib/rack/session/memcache.rb +97 -0
  466. data/vendor/rack-0.9.1/lib/rack/session/pool.rb +73 -0
  467. data/vendor/rack-0.9.1/lib/rack/showexceptions.rb +348 -0
  468. data/vendor/rack-0.9.1/lib/rack/showstatus.rb +106 -0
  469. data/vendor/rack-0.9.1/lib/rack/static.rb +38 -0
  470. data/vendor/rack-0.9.1/lib/rack/urlmap.rb +48 -0
  471. data/vendor/rack-0.9.1/lib/rack/utils.rb +347 -0
  472. metadata +1197 -1055
  473. data/doc/cxxapi/System_8h-source.html +0 -251
  474. data/doc/cxxapi/classDirectoryMapper-members.html +0 -38
  475. data/doc/cxxapi/classDirectoryMapper.html +0 -203
  476. data/doc/cxxapi/classPassenger_1_1Thread.html +0 -100
  477. data/doc/cxxapi/classboost_1_1this__thread_1_1disable__syscall__interruption.html +0 -46
  478. data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption-members.html +0 -33
  479. data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption.html +0 -44
  480. data/doc/cxxapi/namespacePassenger.html +0 -208
  481. data/doc/cxxapi/namespacePassenger_1_1InterruptableCalls.html +0 -43
  482. data/doc/cxxapi/namespacemembers.html +0 -70
  483. data/doc/cxxapi/namespacemembers_func.html +0 -66
  484. data/doc/cxxapi/namespacemembers_type.html +0 -46
  485. data/doc/cxxapi/namespaces.html +0 -35
  486. data/doc/rdoc/classes/Passenger.html +0 -136
  487. data/doc/rdoc/classes/Passenger/AbstractRequestHandler.html +0 -402
  488. data/doc/rdoc/classes/Passenger/SpawnManager.html +0 -379
  489. data/doc/rdoc/classes/Passenger/Utils.html +0 -578
  490. data/ext/apache2/System.h +0 -228
  491. data/lib/passenger/platform_info.rb +0 -302
  492. data/lib/passenger/templates/app_exited_during_initialization.html.erb +0 -19
  493. data/test/stub/apache2/httpd.conf +0 -75
  494. data/test/stub/rails_apps/foobar/config/environments/test.rb +0 -22
  495. data/test/stub/rails_apps/mycook/config/environments/test.rb +0 -22
  496. data/test/stub/railsapp/config/environments/test.rb +0 -22
  497. data/test/stub/railsapp2/config/environments/test.rb +0 -22
@@ -0,0 +1,48 @@
1
+ /*
2
+ * OXT - OS eXtensions for boosT
3
+ * Provides important functionality necessary for writing robust server software.
4
+ *
5
+ * Copyright (c) 2008 Phusion
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ */
25
+ #include <string>
26
+ #include <exception>
27
+ #include <list>
28
+
29
+ namespace oxt {
30
+
31
+ struct trace_point;
32
+
33
+ /**
34
+ * Exception class with backtrace support. See backtrace.hpp for details.
35
+ */
36
+ class tracable_exception: public std::exception {
37
+ private:
38
+ std::list<trace_point *> backtrace_copy;
39
+ public:
40
+ tracable_exception();
41
+ tracable_exception(const tracable_exception &other);
42
+ virtual ~tracable_exception() throw();
43
+ virtual std::string backtrace() const throw();
44
+ virtual const char *what() const throw();
45
+ };
46
+
47
+ } // namespace oxt
48
+
@@ -0,0 +1,58 @@
1
+ /*
2
+ * OXT - OS eXtensions for boosT
3
+ * Provides important functionality necessary for writing robust server software.
4
+ *
5
+ * Copyright (c) 2008 Phusion
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ */
25
+ #ifndef _OXT_MACROS_HPP_
26
+ #define _OXT_MACROS_HPP_
27
+
28
+ /**
29
+ * Specialized macros.
30
+ *
31
+ * These macros provide more specialized features which are not needed
32
+ * so often by application programmers.
33
+ */
34
+
35
+ #if (defined(__GNUC__) && (__GNUC__ > 2) && !defined(OXT_DEBUG)) || defined(IN_DOXYGEN)
36
+ /**
37
+ * Indicate that the given expression is likely to be true.
38
+ * This allows the CPU to better perform branch prediction.
39
+ *
40
+ * Defining OXT_DEBUG will cause this macro to become an
41
+ * empty stub.
42
+ */
43
+ #define OXT_LIKELY(expr) __builtin_expect((expr), 1)
44
+
45
+ /**
46
+ * Indicate that the given expression is likely to be false.
47
+ * This allows the CPU to better perform branch prediction.
48
+ *
49
+ * Defining OXT_DEBUG will cause this macro to become an
50
+ * empty stub.
51
+ */
52
+ #define OXT_UNLIKELY(expr) __builtin_expect((expr), 0)
53
+ #else
54
+ #define OXT_LIKELY(expr) expr
55
+ #define OXT_UNLIKELY(expr) expr
56
+ #endif
57
+
58
+ #endif /* _OXT_MACROS_HPP_ */
@@ -0,0 +1,55 @@
1
+ /*
2
+ * OXT - OS eXtensions for boosT
3
+ * Provides important functionality necessary for writing robust server software.
4
+ *
5
+ * Copyright (c) 2008 Phusion
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ */
25
+ #ifndef _OXT_SPIN_LOCK_HPP_
26
+ #define _OXT_SPIN_LOCK_HPP_
27
+
28
+ // At the time of writing (July 22, 2008), these operating systems don't
29
+ // support pthread spin locks:
30
+ // - OpenBSD 4.3
31
+ // - Solaris 9
32
+ // - MacOS X
33
+ #if defined(__OpenBSD__) || defined(__SOLARIS9__) || defined(__APPLE__)
34
+ #define OXT_NO_PTHREAD_SPINLOCKS
35
+ #endif
36
+
37
+ #ifndef GCC_VERSION
38
+ #define GCC_VERSION (__GNUC__ * 10000 \
39
+ + __GNUC_MINOR__ * 100 \
40
+ + __GNUC_PATCH_LEVEL__)
41
+ #endif
42
+
43
+ #if (GCC_VERSION > 40100 && defined(__i386__)) || defined(IN_DOXYGEN)
44
+ // GCC 4.0 doesn't support __sync instructions while GCC 4.2
45
+ // does. I'm not sure whether support for it started in 4.1 or
46
+ // 4.2, so the above version check may have to be changed later.
47
+ #include "detail/spin_lock_gcc_x86.hpp"
48
+ #elif !defined(WIN32) && !defined(OXT_NO_PTHREAD_SPINLOCKS)
49
+ #include "detail/spin_lock_pthreads.hpp"
50
+ #else
51
+ #include "detail/spin_lock_portable.hpp"
52
+ #endif
53
+
54
+ #endif /* _OXT_SPIN_LOCK_HPP_ */
55
+
@@ -1,58 +1,50 @@
1
1
  /*
2
- * Phusion Passenger - http://www.modrails.com/
3
- * Copyright (C) 2008 Phusion
2
+ * OXT - OS eXtensions for boosT
3
+ * Provides important functionality necessary for writing robust server software.
4
4
  *
5
- * Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.
5
+ * Copyright (c) 2008 Phusion
6
6
  *
7
- * This program is free software; you can redistribute it and/or modify
8
- * it under the terms of the GNU General Public License as published by
9
- * the Free Software Foundation; version 2 of the License.
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
10
13
  *
11
- * This program is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- * GNU General Public License for more details.
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
15
16
  *
16
- * You should have received a copy of the GNU General Public License along
17
- * with this program; if not, write to the Free Software Foundation, Inc.,
18
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
19
24
  */
20
- #include "System.h"
21
-
22
- /*************************************
23
- * boost::this_thread
24
- *************************************/
25
+ #include "system_calls.hpp"
26
+ #include <boost/thread.hpp>
27
+ #include <cerrno>
25
28
 
26
29
  using namespace boost;
27
-
28
- thread_specific_ptr<bool> this_thread::_syscalls_interruptable;
29
-
30
-
31
- bool
32
- this_thread::syscalls_interruptable() {
33
- return _syscalls_interruptable.get() == NULL || *_syscalls_interruptable;
34
- }
30
+ using namespace oxt;
35
31
 
36
32
 
37
33
  /*************************************
38
- * Passenger
34
+ * oxt
39
35
  *************************************/
40
36
 
41
- using namespace Passenger;
42
-
43
- static bool interrupted = false;
44
-
45
37
  static void
46
- interruptionSignalHandler(int sig) {
47
- interrupted = true;
38
+ interruption_signal_handler(int sig) {
39
+ // Do nothing.
48
40
  }
49
41
 
50
42
  void
51
- Passenger::setupSyscallInterruptionSupport() {
43
+ oxt::setup_syscall_interruption_support() {
52
44
  struct sigaction action;
53
45
  int ret;
54
46
 
55
- action.sa_handler = interruptionSignalHandler;
47
+ action.sa_handler = interruption_signal_handler;
56
48
  action.sa_flags = 0;
57
49
  sigemptyset(&action.sa_mask);
58
50
  do {
@@ -65,7 +57,7 @@ Passenger::setupSyscallInterruptionSupport() {
65
57
 
66
58
 
67
59
  /*************************************
68
- * Passenger::InterruptableCalls
60
+ * Passenger::syscalls
69
61
  *************************************/
70
62
 
71
63
  #define CHECK_INTERRUPTION(error_expression, code) \
@@ -83,7 +75,7 @@ Passenger::setupSyscallInterruptionSupport() {
83
75
  } while (false)
84
76
 
85
77
  ssize_t
86
- InterruptableCalls::read(int fd, void *buf, size_t count) {
78
+ syscalls::read(int fd, void *buf, size_t count) {
87
79
  ssize_t ret;
88
80
  CHECK_INTERRUPTION(
89
81
  ret == -1,
@@ -93,7 +85,7 @@ InterruptableCalls::read(int fd, void *buf, size_t count) {
93
85
  }
94
86
 
95
87
  ssize_t
96
- InterruptableCalls::write(int fd, const void *buf, size_t count) {
88
+ syscalls::write(int fd, const void *buf, size_t count) {
97
89
  ssize_t ret;
98
90
  CHECK_INTERRUPTION(
99
91
  ret == -1,
@@ -103,7 +95,7 @@ InterruptableCalls::write(int fd, const void *buf, size_t count) {
103
95
  }
104
96
 
105
97
  int
106
- InterruptableCalls::close(int fd) {
98
+ syscalls::close(int fd) {
107
99
  int ret;
108
100
  CHECK_INTERRUPTION(
109
101
  ret == -1,
@@ -113,7 +105,27 @@ InterruptableCalls::close(int fd) {
113
105
  }
114
106
 
115
107
  int
116
- InterruptableCalls::socketpair(int d, int type, int protocol, int sv[2]) {
108
+ syscalls::connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen) {
109
+ int ret;
110
+ CHECK_INTERRUPTION(
111
+ ret == -1,
112
+ ret = ::connect(sockfd, serv_addr, addrlen);
113
+ );
114
+ return ret;
115
+ }
116
+
117
+ int
118
+ syscalls::socket(int domain, int type, int protocol) {
119
+ int ret;
120
+ CHECK_INTERRUPTION(
121
+ ret == -1,
122
+ ret = ::socket(domain, type, protocol)
123
+ );
124
+ return ret;
125
+ }
126
+
127
+ int
128
+ syscalls::socketpair(int d, int type, int protocol, int sv[2]) {
117
129
  int ret;
118
130
  CHECK_INTERRUPTION(
119
131
  ret == -1,
@@ -123,7 +135,7 @@ InterruptableCalls::socketpair(int d, int type, int protocol, int sv[2]) {
123
135
  }
124
136
 
125
137
  ssize_t
126
- InterruptableCalls::recvmsg(int s, struct msghdr *msg, int flags) {
138
+ syscalls::recvmsg(int s, struct msghdr *msg, int flags) {
127
139
  ssize_t ret;
128
140
  CHECK_INTERRUPTION(
129
141
  ret == -1,
@@ -133,7 +145,7 @@ InterruptableCalls::recvmsg(int s, struct msghdr *msg, int flags) {
133
145
  }
134
146
 
135
147
  ssize_t
136
- InterruptableCalls::sendmsg(int s, const struct msghdr *msg, int flags) {
148
+ syscalls::sendmsg(int s, const struct msghdr *msg, int flags) {
137
149
  ssize_t ret;
138
150
  CHECK_INTERRUPTION(
139
151
  ret == -1,
@@ -143,7 +155,17 @@ InterruptableCalls::sendmsg(int s, const struct msghdr *msg, int flags) {
143
155
  }
144
156
 
145
157
  int
146
- InterruptableCalls::shutdown(int s, int how) {
158
+ syscalls::setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) {
159
+ int ret;
160
+ CHECK_INTERRUPTION(
161
+ ret == -1,
162
+ ret = ::setsockopt(s, level, optname, optval, optlen)
163
+ );
164
+ return ret;
165
+ }
166
+
167
+ int
168
+ syscalls::shutdown(int s, int how) {
147
169
  int ret;
148
170
  CHECK_INTERRUPTION(
149
171
  ret == -1,
@@ -153,7 +175,7 @@ InterruptableCalls::shutdown(int s, int how) {
153
175
  }
154
176
 
155
177
  FILE *
156
- InterruptableCalls::fopen(const char *path, const char *mode) {
178
+ syscalls::fopen(const char *path, const char *mode) {
157
179
  FILE *ret;
158
180
  CHECK_INTERRUPTION(
159
181
  ret == NULL,
@@ -163,7 +185,7 @@ InterruptableCalls::fopen(const char *path, const char *mode) {
163
185
  }
164
186
 
165
187
  int
166
- InterruptableCalls::fclose(FILE *fp) {
188
+ syscalls::fclose(FILE *fp) {
167
189
  int ret;
168
190
  CHECK_INTERRUPTION(
169
191
  ret == EOF,
@@ -173,7 +195,7 @@ InterruptableCalls::fclose(FILE *fp) {
173
195
  }
174
196
 
175
197
  time_t
176
- InterruptableCalls::time(time_t *t) {
198
+ syscalls::time(time_t *t) {
177
199
  time_t ret;
178
200
  CHECK_INTERRUPTION(
179
201
  ret == (time_t) -1,
@@ -183,15 +205,15 @@ InterruptableCalls::time(time_t *t) {
183
205
  }
184
206
 
185
207
  int
186
- InterruptableCalls::usleep(useconds_t usec) {
208
+ syscalls::usleep(useconds_t usec) {
187
209
  struct timespec spec;
188
210
  spec.tv_sec = usec / 1000000;
189
211
  spec.tv_nsec = usec % 1000000;
190
- return InterruptableCalls::nanosleep(&spec, NULL);
212
+ return syscalls::nanosleep(&spec, NULL);
191
213
  }
192
214
 
193
215
  int
194
- InterruptableCalls::nanosleep(const struct timespec *req, struct timespec *rem) {
216
+ syscalls::nanosleep(const struct timespec *req, struct timespec *rem) {
195
217
  struct timespec req2 = *req;
196
218
  struct timespec rem2;
197
219
  int ret, e;
@@ -211,7 +233,7 @@ InterruptableCalls::nanosleep(const struct timespec *req, struct timespec *rem)
211
233
  }
212
234
 
213
235
  pid_t
214
- InterruptableCalls::fork() {
236
+ syscalls::fork() {
215
237
  int ret;
216
238
  CHECK_INTERRUPTION(
217
239
  ret == -1,
@@ -221,7 +243,7 @@ InterruptableCalls::fork() {
221
243
  }
222
244
 
223
245
  int
224
- InterruptableCalls::kill(pid_t pid, int sig) {
246
+ syscalls::kill(pid_t pid, int sig) {
225
247
  int ret;
226
248
  CHECK_INTERRUPTION(
227
249
  ret == -1,
@@ -231,7 +253,7 @@ InterruptableCalls::kill(pid_t pid, int sig) {
231
253
  }
232
254
 
233
255
  pid_t
234
- InterruptableCalls::waitpid(pid_t pid, int *status, int options) {
256
+ syscalls::waitpid(pid_t pid, int *status, int options) {
235
257
  pid_t ret;
236
258
  CHECK_INTERRUPTION(
237
259
  ret == -1,
@@ -240,3 +262,16 @@ InterruptableCalls::waitpid(pid_t pid, int *status, int options) {
240
262
  return ret;
241
263
  }
242
264
 
265
+
266
+ /*************************************
267
+ * boost::this_thread
268
+ *************************************/
269
+
270
+ thread_specific_ptr<bool> this_thread::_syscalls_interruptable;
271
+
272
+
273
+ bool
274
+ this_thread::syscalls_interruptable() {
275
+ return _syscalls_interruptable.get() == NULL || *_syscalls_interruptable;
276
+ }
277
+
@@ -0,0 +1,234 @@
1
+ /*
2
+ * OXT - OS eXtensions for boosT
3
+ * Provides important functionality necessary for writing robust server software.
4
+ *
5
+ * Copyright (c) 2008 Phusion
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ */
25
+ #ifndef _OXT_SYSTEM_CALLS_HPP_
26
+ #define _OXT_SYSTEM_CALLS_HPP_
27
+
28
+ #include <boost/thread/tss.hpp>
29
+ #include <sys/types.h>
30
+ #include <sys/wait.h>
31
+ #include <sys/socket.h>
32
+ #include <pthread.h>
33
+ #include <unistd.h>
34
+ #include <signal.h>
35
+ #include <cstdio>
36
+ #include <ctime>
37
+ #include <cassert>
38
+
39
+ /**
40
+ * Support for interruption of blocking system calls and C library calls
41
+ *
42
+ * This file provides a framework for writing multithreading code that can
43
+ * be interrupted, even when blocked on system calls or C library calls.
44
+ *
45
+ * One must first call oxt::setup_syscall_interruption_support().
46
+ * Then one may use the functions in oxt::syscalls as drop-in replacements
47
+ * for system calls or C library functions. These functions throw
48
+ * boost::thread_interrupted upon interruption, instead of returning an EINTR
49
+ * error.
50
+ *
51
+ * System call interruption is disabled by default. As long as system call
52
+ * interruption is disabled, the replacement functions in oxt::syscalls will
53
+ * never throw boost::thread_interrupted, and they will ignore any EINTR errors.
54
+ * You can enable or disable system call interruption in the current scope
55
+ * by creating instances of boost::this_thread::enable_syscall_interruption
56
+ * and similar objects. This is similar to Boost thread interruption.
57
+ *
58
+ * <h2>How to interrupt</h2>
59
+ * Generally, oxt::thread::interrupt() and oxt::thread::interrupt_and_join()
60
+ * should be used for interrupting threads. These methods will interrupt
61
+ * the thread at all Boost interruption points, as well as system calls that
62
+ * are caled through the oxt::syscalls namespace. Do *not* use
63
+ * boost::thread::interrupt, because that will not honor system calls as
64
+ * interruption points.
65
+ *
66
+ * Under the hood, system calls are interrupted by sending a signal to the
67
+ * to a specific thread (note: sending a signal to a process will deliver the
68
+ * signal to the main thread).
69
+ *
70
+ * Any signal will do, but of course, one should only send a signal whose
71
+ * signal handler doesn't do undesirable things (such as aborting the entire
72
+ * program). That's why it's generally recommended that you only use
73
+ * oxt::INTERRUPTION_SIGNAL to interrupt system calls, because
74
+ * oxt::setup_syscall_interruption_support() installs an "nice" signal
75
+ * handler for that signal (though you should of course use
76
+ * oxt::thread::interrupt() instead of sending signals whenever
77
+ * possible).
78
+ *
79
+ * Note that sending a signal once may not interrupt the thread, because
80
+ * the thread may not be calling a system call at the time the signal was
81
+ * received. So one must keep sending signals periodically until the
82
+ * thread has quit.
83
+ *
84
+ * @warning
85
+ * After oxt::setup_syscall_interruption_support() is called, sending a signal
86
+ * will cause system calls to return with an EINTR error. The oxt::syscall
87
+ * functions will automatically take care of this, but if you're calling any
88
+ * system calls without using that namespace, then you should check for and
89
+ * take care of EINTR errors.
90
+ */
91
+
92
+ // This is one of the things that Java is good at and C++ sucks at. Sigh...
93
+
94
+ namespace oxt {
95
+ static const int INTERRUPTION_SIGNAL = SIGINT;
96
+
97
+ /**
98
+ * Setup system call interruption support.
99
+ * This function may only be called once. It installs a signal handler
100
+ * for INTERRUPTION_SIGNAL, so one should not install a different signal
101
+ * handler for that signal after calling this function.
102
+ *
103
+ * @warning
104
+ * After oxt::setup_syscall_interruption_support() is called, sending a signal
105
+ * will cause system calls to return with an EINTR error. The oxt::syscall
106
+ * functions will automatically take care of this, but if you're calling any
107
+ * system calls without using that namespace, then you should check for and
108
+ * take care of EINTR errors.
109
+ */
110
+ void setup_syscall_interruption_support();
111
+
112
+ /**
113
+ * System call and C library call wrappers with interruption support.
114
+ * These functions are interruption points, i.e. they throw
115
+ * boost::thread_interrupted whenever the calling thread is interrupted
116
+ * by oxt::thread::interrupt() or oxt::thread::interrupt_and_join().
117
+ */
118
+ namespace syscalls {
119
+ ssize_t read(int fd, void *buf, size_t count);
120
+ ssize_t write(int fd, const void *buf, size_t count);
121
+ int close(int fd);
122
+
123
+ int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
124
+ int socket(int domain, int type, int protocol);
125
+ int socketpair(int d, int type, int protocol, int sv[2]);
126
+ ssize_t recvmsg(int s, struct msghdr *msg, int flags);
127
+ ssize_t sendmsg(int s, const struct msghdr *msg, int flags);
128
+ int setsockopt(int s, int level, int optname, const void *optval,
129
+ socklen_t optlen);
130
+ int shutdown(int s, int how);
131
+
132
+ FILE *fopen(const char *path, const char *mode);
133
+ int fclose(FILE *fp);
134
+
135
+ time_t time(time_t *t);
136
+ int usleep(useconds_t usec);
137
+ int nanosleep(const struct timespec *req, struct timespec *rem);
138
+
139
+ pid_t fork();
140
+ int kill(pid_t pid, int sig);
141
+ pid_t waitpid(pid_t pid, int *status, int options);
142
+ }
143
+
144
+ } // namespace oxt
145
+
146
+ namespace boost {
147
+ namespace this_thread {
148
+
149
+ /**
150
+ * @intern
151
+ */
152
+ extern thread_specific_ptr<bool> _syscalls_interruptable;
153
+
154
+ /**
155
+ * Check whether system calls should be interruptable in
156
+ * the calling thread.
157
+ */
158
+ bool syscalls_interruptable();
159
+
160
+ class restore_syscall_interruption;
161
+
162
+ /**
163
+ * Create this struct on the stack to temporarily enable system
164
+ * call interruption, until the object goes out of scope.
165
+ */
166
+ class enable_syscall_interruption {
167
+ private:
168
+ bool last_value;
169
+ public:
170
+ enable_syscall_interruption() {
171
+ if (_syscalls_interruptable.get() == NULL) {
172
+ last_value = true;
173
+ _syscalls_interruptable.reset(new bool(true));
174
+ } else {
175
+ last_value = *_syscalls_interruptable;
176
+ *_syscalls_interruptable = true;
177
+ }
178
+ }
179
+
180
+ ~enable_syscall_interruption() {
181
+ *_syscalls_interruptable = last_value;
182
+ }
183
+ };
184
+
185
+ /**
186
+ * Create this struct on the stack to temporarily disable system
187
+ * call interruption, until the object goes out of scope.
188
+ * While system call interruption is disabled, the functions in
189
+ * InterruptableCalls will try until the return code is not EINTR.
190
+ */
191
+ class disable_syscall_interruption {
192
+ private:
193
+ friend class restore_syscall_interruption;
194
+ bool last_value;
195
+ public:
196
+ disable_syscall_interruption() {
197
+ if (_syscalls_interruptable.get() == NULL) {
198
+ last_value = true;
199
+ _syscalls_interruptable.reset(new bool(false));
200
+ } else {
201
+ last_value = *_syscalls_interruptable;
202
+ *_syscalls_interruptable = false;
203
+ }
204
+ }
205
+
206
+ ~disable_syscall_interruption() {
207
+ *_syscalls_interruptable = last_value;
208
+ }
209
+ };
210
+
211
+ /**
212
+ * Creating an object of this class on the stack will restore the
213
+ * system call interruption state to what it was before.
214
+ */
215
+ class restore_syscall_interruption {
216
+ private:
217
+ int last_value;
218
+ public:
219
+ restore_syscall_interruption(const disable_syscall_interruption &intr) {
220
+ assert(_syscalls_interruptable.get() != NULL);
221
+ last_value = *_syscalls_interruptable;
222
+ *_syscalls_interruptable = intr.last_value;
223
+ }
224
+
225
+ ~restore_syscall_interruption() {
226
+ *_syscalls_interruptable = last_value;
227
+ }
228
+ };
229
+
230
+ } // namespace this_thread
231
+ } // namespace boost
232
+
233
+ #endif /* _OXT_SYSTEM_CALLS_HPP_ */
234
+