Node.jsの動く仕組み
IIJ 大津繁樹
2011年12月16日
#include <stdio.h>
#include "uv.h"
static void cb(uv_write_t* req, int status) {
printf("Hello from Callback.\n");
uv_unref(uv_default_loop());
}
int main() {
uv_tty_t tty; // tty stream handle
uv_write_t req; // write request
int ret = uv_tty_init(uv_default_loop(), &tty, 1, 0);
uv_buf_t bufs[] = { uv_buf_init("Hello UV!\n",10) };
ret = uv_write(&req, (uv_stream_t*)&tty, bufs, 1, cb);
uv_run(uv_default_loop());
return 0;
}
function Module() {
this.exports = {};
...
}
Module.require = function(id) {
var module = new Module(id);
(function (exports, require, module) {
モジュール内コード
exports = ...
})(module.exports, Module.require, module);
return module.exports;
}
// こっから本体
var require = Module.require;
var hoge = require("モジュール名");
exports.foo = "foo";
var hoge = require("./hoge.js");
console.log(hoge.foo);
> node run.js > foo
void Work(uv_work_t* req) { ... }
void Done(uv_work_t* req) {
HandleScope scope;
Local<Value> argv[1] = {Local<Value>::New(String::New("Work Done"))};
callback->Call(Context::GetCurrent()->Global(), 1, argv);
callback.Dispose();
}
Handle<Value> putQueue(const Arguments& args) {
HandleScope scope;
callback = Persistent<Function>::New(Local<Function>::Cast(args[0]));
int status = uv_queue_work(uv_default_loop(),&request,Work, Done);
return Undefined();
}
void RegisterModule(Handle<Object> exports) {
exports->Set(String::NewSymbol("putQueue"),
FunctionTemplate::New(putQueue)->GetFunction());}
NODE_MODULE(thread_test, RegisterModule);
> node-waf configure build Setting srcdir to : /home/ohtsu/tmp/thread_test ... 'build' finished successfully (0.038s)
var thread_test = require('./thread_test.node');
thread_test.putQueue(function(msg) {
console.log(msg);
});
> node run.js >'Work Done'
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(80);
(0/20)