I've only tried building it on OS X and Linux so far. As far as I know, basically everything but the build process is compatible with Windows. I'll look into it when I get a chance.
This would get toasted by Nginx right now. I'm on step 2 of "make it work, make it right, make it fast." There's a lot of low hanging fruit, like string concatenation, small mallocs, etc.
I started out working with OpenResty, and it still makes the most sense for a project that leans heavily on the functionality of Nginx.
In luajit-libuv, when Lua code makes an async request to libuv, it passes async.resume as the callback. Then it calls async.yield(), which stores the current coroutine in a global lookup table by unique ID, puts the ID in the request's data field, and yields the coroutine. When libuv completes the request, it calls async.resume, which gets the ID out of the request's data field, looks up the coroutine, and resumes it. [1]
So it's actually pretty simple, and still probably more complicated than it needs to be. libuv does all the scheduling.
I've been studying Ray, going over luv_fiber.c and luv_thread.c trying to understand them enough to give you a comparison, but to be honest I don't get it. It wraps coroutines, does something related to scheduling... I dunno.
In addition to what benjaminva said, luv uses callbacks (like Node.js), whereas this uses coroutines. So for example with luv you might do something like:
fs.readFile(filename, function(err, data)
-- remember to check err
end)
With this binding the code would look like:
local data = fs.readfile(filename)
-- err was raised if one occurred
With coroutines, you can use exceptions and for/while loops and they continue to work as you would expect.