Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

various rack fixes

  • Loading branch information...
commit 72109b72d272c87e889b47f2b4d7111e80bf4e72 1 parent f6c01d1
roberto@debian32 authored
View
2  buildconf/modular.ini
@@ -1,5 +1,5 @@
[uwsgi]
inherit = default
plugins = python, ping, rack, psgi, cache, http, fastrouter
-plugin_dir = .
+plugin_dir = plugins
embedded_plugins = null
View
31 fibers.ru
@@ -2,11 +2,36 @@ require 'fiber'
class SuspendingBody
def each
- for i in 1..100
+ for i in 1..3
yield "number: #{i}\n"
- UWSGI.suspend
- #Fiber.yield
+ UWSGI.async_sleep(1)
+ puts "sleep..."
+ Fiber.yield
end
+
+ fd = UWSGI.async_connect("81.174.68.52:80")
+ UWSGI.wait_fd_write(fd, 3)
+ Fiber.yield
+ io = IO.new(fd)
+ puts "connected"
+ io.syswrite("GET /uwsgi/export/1081%3A362d695b2f25/plugins/fiber/fiber.c HTTP/1.0\r\n")
+ io.syswrite("Host: projects.unbit.it\r\n")
+ io.syswrite("\r\n")
+
+ UWSGI.wait_fd_read(fd, 3)
+ Fiber.yield
+
+ puts "data available"
+
+ begin
+ while body = io.sysread(fd)
+ yield body
+ Fiber.yield
+ end
+ rescue
+ end
+
+ io.close
end
end
View
54 plugins/rack/rack_plugin.c
@@ -277,7 +277,55 @@ VALUE require_rails(VALUE arg) {
VALUE init_rack_app(VALUE);
-VALUE uwsgi_ruby_suspend(VALUE *arg) {
+VALUE uwsgi_ruby_wait_fd_read(VALUE *class, VALUE arg1, VALUE arg2) {
+
+ struct wsgi_request *wsgi_req = current_wsgi_req();
+
+ int fd = NUM2INT(arg1);
+ int timeout = NUM2INT(arg2);
+
+ if (fd >= 0) {
+ async_add_fd_read(wsgi_req, fd, timeout);
+ }
+
+ return Qtrue;
+}
+
+VALUE uwsgi_ruby_wait_fd_write(VALUE *class, VALUE arg1, VALUE arg2) {
+
+ struct wsgi_request *wsgi_req = current_wsgi_req();
+
+ int fd = NUM2INT(arg1);
+ int timeout = NUM2INT(arg2);
+
+ if (fd >= 0) {
+ async_add_fd_write(wsgi_req, fd, timeout);
+ }
+
+ return Qtrue;
+}
+
+VALUE uwsgi_ruby_async_connect(VALUE *class, VALUE arg) {
+
+ int fd = uwsgi_connect(RSTRING_PTR(arg), 0, 1);
+
+ return INT2FIX(fd);
+}
+
+
+VALUE uwsgi_ruby_async_sleep(VALUE *class, VALUE arg) {
+
+ struct wsgi_request *wsgi_req = current_wsgi_req();
+ int timeout = NUM2INT(arg);
+
+ if (timeout >= 0) {
+ async_add_timeout(wsgi_req, timeout);
+ }
+
+ return Qtrue;
+}
+
+VALUE uwsgi_ruby_suspend(VALUE *class) {
struct wsgi_request *wsgi_req = current_wsgi_req();
@@ -319,6 +367,10 @@ int uwsgi_rack_init(){
VALUE rb_uwsgi_embedded = rb_define_module("UWSGI");
rb_define_module_function(rb_uwsgi_embedded, "suspend", uwsgi_ruby_suspend, 0);
+ rb_define_module_function(rb_uwsgi_embedded, "async_sleep", uwsgi_ruby_async_sleep, 1);
+ rb_define_module_function(rb_uwsgi_embedded, "wait_fd_read", uwsgi_ruby_wait_fd_read, 2);
+ rb_define_module_function(rb_uwsgi_embedded, "wait_fd_write", uwsgi_ruby_wait_fd_write, 2);
+ rb_define_module_function(rb_uwsgi_embedded, "async_connect", uwsgi_ruby_async_connect, 1);
if (ur.rack) {
ur.dispatcher = rb_protect(init_rack_app, rb_str_new2(ur.rack), &error);
View
6 plugins/ruby19/uwsgiplugin.py
@@ -2,8 +2,10 @@
NAME='ruby19'
-#RUBYPATH = '/opt/ruby19/bin/ruby'
-RUBYPATH = '/Users/roberto/RUBY/bin/ruby'
+try:
+ RUBYPATH = os.environ['UWSGICONFIG_RUBYPATH']
+except:
+ RUBYPATH = 'ruby'
GCC_LIST = ['../rack/rack_plugin']
CFLAGS = os.popen(RUBYPATH + " -e \"require 'rbconfig';print Config::CONFIG['CFLAGS']\"").read().rstrip().split()
Please sign in to comment.
Something went wrong with that request. Please try again.