mirror of https://github.com/lukechilds/node.git
Nathan Rajlich
12 years ago
3 changed files with 80 additions and 0 deletions
@ -0,0 +1,65 @@ |
|||||
|
#include <unistd.h> |
||||
|
#include <node.h> |
||||
|
#include <v8.h> |
||||
|
#include <uv.h> |
||||
|
|
||||
|
using namespace v8; |
||||
|
using namespace node; |
||||
|
|
||||
|
struct async_req { |
||||
|
uv_work_t req; |
||||
|
int input; |
||||
|
int output; |
||||
|
Persistent<Function> callback; |
||||
|
}; |
||||
|
|
||||
|
void DoAsync (uv_work_t *r) { |
||||
|
async_req *req = reinterpret_cast<async_req *>(r->data); |
||||
|
sleep(1); // simulate CPU intensive process...
|
||||
|
req->output = req->input * 2; |
||||
|
} |
||||
|
|
||||
|
void AfterAsync (uv_work_t *r) { |
||||
|
HandleScope scope; |
||||
|
async_req *req = reinterpret_cast<async_req *>(r->data); |
||||
|
|
||||
|
Handle<Value> argv[2] = { Null(), Integer::New(req->output) }; |
||||
|
|
||||
|
TryCatch try_catch; |
||||
|
|
||||
|
req->callback->Call(Context::GetCurrent()->Global(), 2, argv); |
||||
|
|
||||
|
// cleanup
|
||||
|
req->callback.Dispose(); |
||||
|
delete req; |
||||
|
|
||||
|
if (try_catch.HasCaught()) { |
||||
|
FatalException(try_catch); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Handle<Value> Method(const Arguments& args) { |
||||
|
HandleScope scope; |
||||
|
|
||||
|
async_req *req = new async_req; |
||||
|
req->req.data = req; |
||||
|
|
||||
|
req->input = args[0]->IntegerValue(); |
||||
|
req->output = 0; |
||||
|
|
||||
|
Local<Function> callback = Local<Function>::Cast(args[1]); |
||||
|
req->callback = Persistent<Function>::New(callback); |
||||
|
|
||||
|
uv_queue_work(uv_default_loop(), |
||||
|
&req->req, |
||||
|
DoAsync, |
||||
|
(uv_after_work_cb)AfterAsync); |
||||
|
|
||||
|
return Undefined(); |
||||
|
} |
||||
|
|
||||
|
void init(Handle<Object> exports, Handle<Object> module) { |
||||
|
NODE_SET_METHOD(module, "exports", Method); |
||||
|
} |
||||
|
|
||||
|
NODE_MODULE(binding, init); |
@ -0,0 +1,8 @@ |
|||||
|
{ |
||||
|
'targets': [ |
||||
|
{ |
||||
|
'target_name': 'binding', |
||||
|
'sources': [ 'binding.cc' ] |
||||
|
} |
||||
|
] |
||||
|
} |
@ -0,0 +1,7 @@ |
|||||
|
var assert = require('assert'); |
||||
|
var binding = require('./build/Release/binding'); |
||||
|
binding(5, function (err, val) { |
||||
|
assert.equal(null, err); |
||||
|
assert.equal(10, val); |
||||
|
console.error('done :)'); |
||||
|
}); |
Loading…
Reference in new issue