| @@ -0,0 +1,28 @@ | ||
| var common = require('../common.js'); | ||
| var bench = common.createBenchmark(main, { | ||
| len: [64, 256, 1024, 4096, 32768], | ||
| dur: [5] | ||
| }); | ||
|
|
||
| var spawn = require('child_process').spawn; | ||
| function main(conf) { | ||
| bench.start(); | ||
|
|
||
| var dur = +conf.dur; | ||
| var len = +conf.len; | ||
|
|
||
| var msg = '"' + Array(len).join('.') + '"'; | ||
| var options = { 'stdio': ['ignore', 'ipc', 'ignore'] }; | ||
| var child = spawn('yes', [msg], options); | ||
|
|
||
| var bytes = 0; | ||
| child.on('message', function(msg) { | ||
| bytes += msg.length; | ||
| }); | ||
|
|
||
| setTimeout(function() { | ||
| child.kill(); | ||
| var gbits = (bytes * 8) / (1024 * 1024 * 1024); | ||
| bench.end(gbits); | ||
| }, dur * 1000); | ||
| } |
| @@ -0,0 +1 @@ | ||
| build/ |
| @@ -0,0 +1,2 @@ | ||
| binding: | ||
| node-gyp rebuild --nodedir=../../.. |
| @@ -0,0 +1,17 @@ | ||
| #include <v8.h> | ||
| #include <node.h> | ||
|
|
||
| using namespace v8; | ||
|
|
||
| static int c = 0; | ||
|
|
||
| void Hello(const FunctionCallbackInfo<Value>& args) { | ||
| args.GetReturnValue().Set(c++); | ||
| } | ||
|
|
||
| extern "C" void init (Handle<Object> target) { | ||
| HandleScope scope(Isolate::GetCurrent()); | ||
| NODE_SET_METHOD(target, "hello", Hello); | ||
| } | ||
|
|
||
| NODE_MODULE(binding, init); |
| @@ -0,0 +1,8 @@ | ||
| { | ||
| 'targets': [ | ||
| { | ||
| 'target_name': 'binding', | ||
| 'sources': [ 'binding.cc' ] | ||
| } | ||
| ] | ||
| } |
| @@ -0,0 +1,42 @@ | ||
| // show the difference between calling a short js function | ||
| // relative to a comparable C++ function. | ||
| // Reports millions of calls per second. | ||
| // Note that JS speed goes up, while cxx speed stays about the same. | ||
|
|
||
| var assert = require('assert'); | ||
| var common = require('../../common.js'); | ||
|
|
||
| // this fails when we try to open with a different version of node, | ||
| // which is quite common for benchmarks. so in that case, just | ||
| // abort quietly. | ||
|
|
||
| try { | ||
| var binding = require('./build/Release/binding'); | ||
| } catch (er) { | ||
| console.error('misc/function_call.js Binding failed to load'); | ||
| process.exit(0); | ||
| } | ||
| var cxx = binding.hello; | ||
|
|
||
| var c = 0; | ||
| function js() { | ||
| return c++; | ||
| } | ||
|
|
||
| assert(js() === cxx()); | ||
|
|
||
| var bench = common.createBenchmark(main, { | ||
| type: ['js', 'cxx'], | ||
| millions: [1,10,50] | ||
| }); | ||
|
|
||
| function main(conf) { | ||
| var n = +conf.millions * 1e6; | ||
|
|
||
| var fn = conf.type === 'cxx' ? cxx : js; | ||
| bench.start(); | ||
| for (var i = 0; i < n; i++) { | ||
| fn(); | ||
| } | ||
| bench.end(+conf.millions); | ||
| } |
| @@ -0,0 +1,21 @@ | ||
|
|
||
| var common = require('../common.js'); | ||
| var bench = common.createBenchmark(main, { | ||
| millions: [2] | ||
| }); | ||
|
|
||
| function main(conf) { | ||
| var N = +conf.millions * 1e6; | ||
| var n = 0; | ||
|
|
||
| function cb() { | ||
| n++; | ||
| if (n === N) | ||
| bench.end(n / 1e6); | ||
| } | ||
|
|
||
| bench.start(); | ||
| for (var i = 0; i < N; i++) { | ||
| process.nextTick(cb); | ||
| } | ||
| } |
| @@ -0,0 +1,40 @@ | ||
| // Copyright Joyent, Inc. and other Node contributors. | ||
| // | ||
| // Permission is hereby granted, free of charge, to any person obtaining a | ||
| // copy of this software and associated documentation files (the | ||
| // "Software"), to deal in the Software without restriction, including | ||
| // without limitation the rights to use, copy, modify, merge, publish, | ||
| // distribute, sublicense, and/or sell copies of the Software, and to permit | ||
| // persons to whom the Software is furnished to do so, subject to the | ||
| // following conditions: | ||
| // | ||
| // The above copyright notice and this permission notice shall be included | ||
| // in all copies or substantial portions of the Software. | ||
| // | ||
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | ||
| // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
| // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | ||
| // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | ||
| // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | ||
| // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | ||
| // USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
|
|
||
| var common = require('../common.js'); | ||
| var bench = common.createBenchmark(main, { | ||
| millions: [2] | ||
| }); | ||
|
|
||
| process.maxTickDepth = Infinity; | ||
|
|
||
| function main(conf) { | ||
| var n = +conf.millions * 1e6; | ||
|
|
||
| bench.start(); | ||
| process.nextTick(onNextTick); | ||
| function onNextTick() { | ||
| if (--n) | ||
| process.nextTick(onNextTick); | ||
| else | ||
| bench.end(+conf.millions); | ||
| } | ||
| } |
| @@ -0,0 +1,25 @@ | ||
| var common = require('../common.js'); | ||
| var bench = common.createBenchmark(main, { | ||
| thousands: [1] | ||
| }); | ||
|
|
||
| var spawn = require('child_process').spawn; | ||
| function main(conf) { | ||
| var len = +conf.thousands * 1000; | ||
|
|
||
| bench.start(); | ||
| go(len, len); | ||
| } | ||
|
|
||
| function go(n, left) { | ||
| if (--left === 0) | ||
| return bench.end(n); | ||
|
|
||
| var child = spawn('echo', ['hello']); | ||
| child.on('exit', function(code) { | ||
| if (code) | ||
| process.exit(code); | ||
| else | ||
| go(n, left); | ||
| }); | ||
| } |
| @@ -0,0 +1,40 @@ | ||
| var common = require('../common.js'); | ||
| var spawn = require('child_process').spawn; | ||
| var path = require('path'); | ||
| var emptyJsFile = path.resolve(__dirname, '../../test/fixtures/semicolon.js'); | ||
| var starts = 100; | ||
| var i = 0; | ||
| var start; | ||
|
|
||
| var bench = common.createBenchmark(startNode, { | ||
| dur: [1] | ||
| }); | ||
|
|
||
| function startNode(conf) { | ||
| var dur = +conf.dur; | ||
| var go = true; | ||
| var starts = 0; | ||
| var open = 0; | ||
|
|
||
| setTimeout(function() { | ||
| go = false; | ||
| }, dur * 1000); | ||
|
|
||
| bench.start(); | ||
| start(); | ||
|
|
||
| function start() { | ||
| var node = spawn(process.execPath || process.argv[0], [emptyJsFile]); | ||
| node.on('exit', function(exitCode) { | ||
| if (exitCode !== 0) { | ||
| throw new Error('Error during node startup'); | ||
| } | ||
| starts++; | ||
|
|
||
| if (go) | ||
| start(); | ||
| else | ||
| bench.end(starts); | ||
| }); | ||
| } | ||
| } |
| @@ -0,0 +1,16 @@ | ||
|
|
||
| var common = require('../common.js'); | ||
| var bench = common.createBenchmark(main, { | ||
| millions: [100] | ||
| }) | ||
|
|
||
| function main(conf) { | ||
| var n = +conf.millions * 1e6; | ||
| bench.start(); | ||
| var s; | ||
| for (var i = 0; i < n; i++) { | ||
| s = '01234567890'; | ||
| s[1] = "a"; | ||
| } | ||
| bench.end(n / 1e6); | ||
| } |
| @@ -0,0 +1,40 @@ | ||
| var common = require('../common.js'); | ||
|
|
||
| var bench = common.createBenchmark(main, { | ||
| thousands: [500], | ||
| type: ['depth', 'breadth'] | ||
| }); | ||
|
|
||
| function main(conf) { | ||
| var n = +conf.thousands * 1e3; | ||
| if (conf.type === 'breadth') | ||
| breadth(n); | ||
| else | ||
| depth(n); | ||
| } | ||
|
|
||
| function depth(N) { | ||
| var n = 0; | ||
| bench.start(); | ||
| setTimeout(cb); | ||
| function cb() { | ||
| n++; | ||
| if (n === N) | ||
| bench.end(N / 1e3); | ||
| else | ||
| setTimeout(cb); | ||
| } | ||
| } | ||
|
|
||
| function breadth(N) { | ||
| var n = 0; | ||
| bench.start(); | ||
| function cb() { | ||
| n++; | ||
| if (n === N) | ||
| bench.end(N / 1e3); | ||
| } | ||
| for (var i = 0; i < N; i++) { | ||
| setTimeout(cb); | ||
| } | ||
| } |
| @@ -0,0 +1,40 @@ | ||
| var url = require('url') | ||
| var n = 25 * 100; | ||
|
|
||
| var urls = [ | ||
| 'http://nodejs.org/docs/latest/api/url.html#url_url_format_urlobj', | ||
| 'http://blog.nodejs.org/', | ||
| 'https://encrypted.google.com/search?q=url&q=site:npmjs.org&hl=en', | ||
| 'javascript:alert("node is awesome");', | ||
| 'some.ran/dom/url.thing?oh=yes#whoo' | ||
| ]; | ||
|
|
||
| var paths = [ | ||
| '../foo/bar?baz=boom', | ||
| 'foo/bar', | ||
| 'http://nodejs.org', | ||
| './foo/bar?baz' | ||
| ]; | ||
|
|
||
| benchmark('parse()', url.parse); | ||
| benchmark('format()', url.format); | ||
| paths.forEach(function(p) { | ||
| benchmark('resolve("' + p + '")', function(u) { | ||
| url.resolve(u, p) | ||
| }); | ||
| }); | ||
|
|
||
| function benchmark(name, fun) { | ||
| var timestamp = process.hrtime(); | ||
| for (var i = 0; i < n; ++i) { | ||
| for (var j = 0, k = urls.length; j < k; ++j) fun(urls[j]); | ||
| } | ||
| timestamp = process.hrtime(timestamp); | ||
|
|
||
| var seconds = timestamp[0]; | ||
| var nanos = timestamp[1]; | ||
| var time = seconds + nanos / 1e9; | ||
| var rate = n / time; | ||
|
|
||
| console.log('misc/url.js %s: %s', name, rate.toPrecision(5)); | ||
| } |
| @@ -0,0 +1,18 @@ | ||
| // compare with "google-chrome deps/v8/benchmarks/run.html" | ||
| var fs = require('fs'); | ||
| var path = require('path'); | ||
| var vm = require('vm'); | ||
|
|
||
| var dir = path.join(__dirname, '..', '..', 'deps', 'v8', 'benchmarks'); | ||
|
|
||
| global.print = function(s) { | ||
| if (s === '----') return; | ||
| console.log('misc/v8_bench.js %s', s); | ||
| }; | ||
|
|
||
| global.load = function (x) { | ||
| var source = fs.readFileSync(path.join(dir, x), 'utf8'); | ||
| vm.runInThisContext(source, x); | ||
| } | ||
|
|
||
| load('run.js'); |
| @@ -0,0 +1,61 @@ | ||
| // test UDP send/recv throughput | ||
|
|
||
| var common = require('../common.js'); | ||
| var PORT = common.PORT; | ||
|
|
||
| // `num` is the number of send requests to queue up each time. | ||
| // Keep it reasonably high (>10) otherwise you're benchmarking the speed of | ||
| // event loop cycles more than anything else. | ||
| var bench = common.createBenchmark(main, { | ||
| len: [1, 64, 256, 1024], | ||
| num: [100], | ||
| type: ['send', 'recv'], | ||
| dur: [5] | ||
| }); | ||
|
|
||
| var dur; | ||
| var len; | ||
| var num; | ||
| var type; | ||
| var chunk; | ||
| var encoding; | ||
|
|
||
| function main(conf) { | ||
| dur = +conf.dur; | ||
| len = +conf.len; | ||
| num = +conf.num; | ||
| type = conf.type; | ||
| chunk = new Buffer(len); | ||
| server(); | ||
| } | ||
|
|
||
| var dgram = require('dgram'); | ||
|
|
||
| function server() { | ||
| var sent = 0; | ||
| var received = 0; | ||
| var socket = dgram.createSocket('udp4'); | ||
|
|
||
| function onsend() { | ||
| if (sent++ % num == 0) | ||
| for (var i = 0; i < num; i++) | ||
| socket.send(chunk, 0, chunk.length, PORT, '127.0.0.1', onsend); | ||
| } | ||
|
|
||
| socket.on('listening', function() { | ||
| bench.start(); | ||
| onsend(); | ||
|
|
||
| setTimeout(function() { | ||
| var bytes = (type === 'send' ? sent : received) * chunk.length; | ||
| var gbits = (bytes * 8) / (1024 * 1024 * 1024); | ||
| bench.end(gbits); | ||
| }, dur * 1000); | ||
| }); | ||
|
|
||
| socket.on('message', function(buf, rinfo) { | ||
| received++; | ||
| }); | ||
|
|
||
| socket.bind(PORT); | ||
| } |
| @@ -0,0 +1,112 @@ | ||
| // test the speed of .pipe() with sockets | ||
|
|
||
| var common = require('../common.js'); | ||
| var PORT = common.PORT; | ||
|
|
||
| var bench = common.createBenchmark(main, { | ||
| len: [102400, 1024 * 1024 * 16], | ||
| type: ['utf', 'asc', 'buf'], | ||
| dur: [5], | ||
| }); | ||
|
|
||
| var dur; | ||
| var len; | ||
| var type; | ||
| var chunk; | ||
| var encoding; | ||
|
|
||
| function main(conf) { | ||
| dur = +conf.dur; | ||
| len = +conf.len; | ||
| type = conf.type; | ||
|
|
||
| switch (type) { | ||
| case 'buf': | ||
| chunk = new Buffer(len); | ||
| chunk.fill('x'); | ||
| break; | ||
| case 'utf': | ||
| encoding = 'utf8'; | ||
| chunk = new Array(len / 2 + 1).join('ĂĽ'); | ||
| break; | ||
| case 'asc': | ||
| encoding = 'ascii'; | ||
| chunk = new Array(len + 1).join('x'); | ||
| break; | ||
| default: | ||
| throw new Error('invalid type: ' + type); | ||
| break; | ||
| } | ||
|
|
||
| server(); | ||
| } | ||
|
|
||
| var net = require('net'); | ||
|
|
||
| function Writer() { | ||
| this.received = 0; | ||
| this.writable = true; | ||
| } | ||
|
|
||
| Writer.prototype.write = function(chunk, encoding, cb) { | ||
| this.received += chunk.length; | ||
|
|
||
| if (typeof encoding === 'function') | ||
| encoding(); | ||
| else if (typeof cb === 'function') | ||
| cb(); | ||
|
|
||
| return true; | ||
| }; | ||
|
|
||
| // doesn't matter, never emits anything. | ||
| Writer.prototype.on = function() {}; | ||
| Writer.prototype.once = function() {}; | ||
| Writer.prototype.emit = function() {}; | ||
|
|
||
|
|
||
| function Reader() { | ||
| this.flow = this.flow.bind(this); | ||
| this.readable = true; | ||
| } | ||
|
|
||
| Reader.prototype.pipe = function(dest) { | ||
| this.dest = dest; | ||
| this.flow(); | ||
| return dest; | ||
| }; | ||
|
|
||
| Reader.prototype.flow = function() { | ||
| var dest = this.dest; | ||
| var res = dest.write(chunk, encoding); | ||
| if (!res) | ||
| dest.once('drain', this.flow); | ||
| else | ||
| process.nextTick(this.flow); | ||
| }; | ||
|
|
||
|
|
||
| function server() { | ||
| var reader = new Reader(); | ||
| var writer = new Writer(); | ||
|
|
||
| // the actual benchmark. | ||
| var server = net.createServer(function(socket) { | ||
| socket.pipe(writer); | ||
| }); | ||
|
|
||
| server.listen(PORT, function() { | ||
| var socket = net.connect(PORT); | ||
| socket.on('connect', function() { | ||
| bench.start(); | ||
|
|
||
| reader.pipe(socket); | ||
|
|
||
| setTimeout(function() { | ||
| var bytes = writer.received; | ||
| var gbits = (bytes * 8) / (1024 * 1024 * 1024); | ||
| bench.end(gbits); | ||
| }, dur * 1000); | ||
| }); | ||
| }); | ||
| } |
| @@ -0,0 +1,115 @@ | ||
| // test the speed of .pipe() with sockets | ||
|
|
||
| var common = require('../common.js'); | ||
| var PORT = common.PORT; | ||
|
|
||
| var bench = common.createBenchmark(main, { | ||
| len: [102400, 1024 * 1024 * 16], | ||
| type: ['utf', 'asc', 'buf'], | ||
| dur: [5], | ||
| }); | ||
|
|
||
| var dur; | ||
| var len; | ||
| var type; | ||
| var chunk; | ||
| var encoding; | ||
|
|
||
| function main(conf) { | ||
| dur = +conf.dur; | ||
| len = +conf.len; | ||
| type = conf.type; | ||
|
|
||
| switch (type) { | ||
| case 'buf': | ||
| chunk = new Buffer(len); | ||
| chunk.fill('x'); | ||
| break; | ||
| case 'utf': | ||
| encoding = 'utf8'; | ||
| chunk = new Array(len / 2 + 1).join('ĂĽ'); | ||
| break; | ||
| case 'asc': | ||
| encoding = 'ascii'; | ||
| chunk = new Array(len + 1).join('x'); | ||
| break; | ||
| default: | ||
| throw new Error('invalid type: ' + type); | ||
| break; | ||
| } | ||
|
|
||
| server(); | ||
| } | ||
|
|
||
| var net = require('net'); | ||
|
|
||
| function Writer() { | ||
| this.received = 0; | ||
| this.writable = true; | ||
| } | ||
|
|
||
| Writer.prototype.write = function(chunk, encoding, cb) { | ||
| this.received += chunk.length; | ||
|
|
||
| if (typeof encoding === 'function') | ||
| encoding(); | ||
| else if (typeof cb === 'function') | ||
| cb(); | ||
|
|
||
| return true; | ||
| }; | ||
|
|
||
| // doesn't matter, never emits anything. | ||
| Writer.prototype.on = function() {}; | ||
| Writer.prototype.once = function() {}; | ||
| Writer.prototype.emit = function() {}; | ||
|
|
||
|
|
||
| function Reader() { | ||
| this.flow = this.flow.bind(this); | ||
| this.readable = true; | ||
| } | ||
|
|
||
| Reader.prototype.pipe = function(dest) { | ||
| this.dest = dest; | ||
| this.flow(); | ||
| return dest; | ||
| }; | ||
|
|
||
| Reader.prototype.flow = function() { | ||
| var dest = this.dest; | ||
| var res = dest.write(chunk, encoding); | ||
| if (!res) | ||
| dest.once('drain', this.flow); | ||
| else | ||
| process.nextTick(this.flow); | ||
| }; | ||
|
|
||
|
|
||
| function server() { | ||
| var reader = new Reader(); | ||
| var writer = new Writer(); | ||
|
|
||
| // the actual benchmark. | ||
| var server = net.createServer(function(socket) { | ||
| socket.pipe(socket); | ||
| }); | ||
|
|
||
| server.listen(PORT, function() { | ||
| var socket = net.connect(PORT); | ||
| socket.on('connect', function() { | ||
| bench.start(); | ||
|
|
||
| reader.pipe(socket); | ||
| socket.pipe(writer); | ||
|
|
||
| setTimeout(function() { | ||
| // multiply by 2 since we're sending it first one way | ||
| // then then back again. | ||
| var bytes = writer.received * 2; | ||
| var gbits = (bytes * 8) / (1024 * 1024 * 1024); | ||
| bench.end(gbits); | ||
| }, dur * 1000); | ||
| }); | ||
| }); | ||
| } |
| @@ -0,0 +1,112 @@ | ||
| // test the speed of .pipe() with sockets | ||
|
|
||
| var common = require('../common.js'); | ||
| var PORT = common.PORT; | ||
|
|
||
| var bench = common.createBenchmark(main, { | ||
| len: [102400, 1024 * 1024 * 16], | ||
| type: ['utf', 'asc', 'buf'], | ||
| dur: [5] | ||
| }); | ||
|
|
||
| var dur; | ||
| var len; | ||
| var type; | ||
| var chunk; | ||
| var encoding; | ||
|
|
||
| function main(conf) { | ||
| dur = +conf.dur; | ||
| len = +conf.len; | ||
| type = conf.type; | ||
|
|
||
| switch (type) { | ||
| case 'buf': | ||
| chunk = new Buffer(len); | ||
| chunk.fill('x'); | ||
| break; | ||
| case 'utf': | ||
| encoding = 'utf8'; | ||
| chunk = new Array(len / 2 + 1).join('ĂĽ'); | ||
| break; | ||
| case 'asc': | ||
| encoding = 'ascii'; | ||
| chunk = new Array(len + 1).join('x'); | ||
| break; | ||
| default: | ||
| throw new Error('invalid type: ' + type); | ||
| break; | ||
| } | ||
|
|
||
| server(); | ||
| } | ||
|
|
||
| var net = require('net'); | ||
|
|
||
| function Writer() { | ||
| this.received = 0; | ||
| this.writable = true; | ||
| } | ||
|
|
||
| Writer.prototype.write = function(chunk, encoding, cb) { | ||
| this.received += chunk.length; | ||
|
|
||
| if (typeof encoding === 'function') | ||
| encoding(); | ||
| else if (typeof cb === 'function') | ||
| cb(); | ||
|
|
||
| return true; | ||
| }; | ||
|
|
||
| // doesn't matter, never emits anything. | ||
| Writer.prototype.on = function() {}; | ||
| Writer.prototype.once = function() {}; | ||
| Writer.prototype.emit = function() {}; | ||
|
|
||
|
|
||
| function Reader() { | ||
| this.flow = this.flow.bind(this); | ||
| this.readable = true; | ||
| } | ||
|
|
||
| Reader.prototype.pipe = function(dest) { | ||
| this.dest = dest; | ||
| this.flow(); | ||
| return dest; | ||
| }; | ||
|
|
||
| Reader.prototype.flow = function() { | ||
| var dest = this.dest; | ||
| var res = dest.write(chunk, encoding); | ||
| if (!res) | ||
| dest.once('drain', this.flow); | ||
| else | ||
| process.nextTick(this.flow); | ||
| }; | ||
|
|
||
|
|
||
| function server() { | ||
| var reader = new Reader(); | ||
| var writer = new Writer(); | ||
|
|
||
| // the actual benchmark. | ||
| var server = net.createServer(function(socket) { | ||
| reader.pipe(socket); | ||
| }); | ||
|
|
||
| server.listen(PORT, function() { | ||
| var socket = net.connect(PORT); | ||
| socket.on('connect', function() { | ||
| bench.start(); | ||
|
|
||
| socket.pipe(writer); | ||
|
|
||
| setTimeout(function() { | ||
| var bytes = writer.received; | ||
| var gbits = (bytes * 8) / (1024 * 1024 * 1024); | ||
| bench.end(gbits); | ||
| }, dur * 1000); | ||
| }); | ||
| }); | ||
| } |
| @@ -0,0 +1,136 @@ | ||
| // In this benchmark, we connect a client to the server, and write | ||
| // as many bytes as we can in the specified time (default = 10s) | ||
|
|
||
| var common = require('../common.js'); | ||
| var util = require('util'); | ||
|
|
||
| // if there are --dur=N and --len=N args, then | ||
| // run the function with those settings. | ||
| // if not, then queue up a bunch of child processes. | ||
| var bench = common.createBenchmark(main, { | ||
| len: [102400, 1024 * 1024 * 16], | ||
| type: ['utf', 'asc', 'buf'], | ||
| dur: [5] | ||
| }); | ||
|
|
||
| var TCP = process.binding('tcp_wrap').TCP; | ||
| var PORT = common.PORT; | ||
|
|
||
| var dur; | ||
| var len; | ||
| var type; | ||
|
|
||
| function main(conf) { | ||
| dur = +conf.dur; | ||
| len = +conf.len; | ||
| type = conf.type; | ||
| server(); | ||
| } | ||
|
|
||
|
|
||
| function fail(err, syscall) { | ||
| throw util._errnoException(err, syscall); | ||
| } | ||
|
|
||
| function server() { | ||
| var serverHandle = new TCP(); | ||
| var err = serverHandle.bind('127.0.0.1', PORT); | ||
| if (err) | ||
| fail(err, 'bind'); | ||
|
|
||
| err = serverHandle.listen(511); | ||
| if (err) | ||
| fail(err, 'listen'); | ||
|
|
||
| serverHandle.onconnection = function(err, clientHandle) { | ||
| if (err) | ||
| fail(err, 'connect'); | ||
|
|
||
| // the meat of the benchmark is right here: | ||
| bench.start(); | ||
| var bytes = 0; | ||
|
|
||
| setTimeout(function() { | ||
| // report in Gb/sec | ||
| bench.end((bytes * 8) / (1024 * 1024 * 1024)); | ||
| }, dur * 1000); | ||
|
|
||
| clientHandle.onread = function(nread, buffer) { | ||
| // we're not expecting to ever get an EOF from the client. | ||
| // just lots of data forever. | ||
| if (nread < 0) | ||
| fail(nread, 'read'); | ||
|
|
||
| // don't slice the buffer. the point of this is to isolate, not | ||
| // simulate real traffic. | ||
| bytes += buffer.length; | ||
| }; | ||
|
|
||
| clientHandle.readStart(); | ||
| }; | ||
|
|
||
| client(); | ||
| } | ||
|
|
||
| function client() { | ||
| var chunk; | ||
| switch (type) { | ||
| case 'buf': | ||
| chunk = new Buffer(len); | ||
| chunk.fill('x'); | ||
| break; | ||
| case 'utf': | ||
| chunk = new Array(len / 2 + 1).join('ĂĽ'); | ||
| break; | ||
| case 'asc': | ||
| chunk = new Array(len + 1).join('x'); | ||
| break; | ||
| default: | ||
| throw new Error('invalid type: ' + type); | ||
| break; | ||
| } | ||
|
|
||
| var clientHandle = new TCP(); | ||
| var connectReq = {}; | ||
| var err = clientHandle.connect(connectReq, '127.0.0.1', PORT); | ||
|
|
||
| if (err) | ||
| fail(err, 'connect'); | ||
|
|
||
| clientHandle.readStart(); | ||
|
|
||
| connectReq.oncomplete = function(err) { | ||
| if (err) | ||
| fail(err, 'connect'); | ||
|
|
||
| while (clientHandle.writeQueueSize === 0) | ||
| write(); | ||
| }; | ||
|
|
||
| function write() { | ||
| var writeReq = { oncomplete: afterWrite }; | ||
| var err; | ||
| switch (type) { | ||
| case 'buf': | ||
| err = clientHandle.writeBuffer(writeReq, chunk); | ||
| break; | ||
| case 'utf': | ||
| err = clientHandle.writeUtf8String(writeReq, chunk); | ||
| break; | ||
| case 'asc': | ||
| err = clientHandle.writeAsciiString(writeReq, chunk); | ||
| break; | ||
| } | ||
|
|
||
| if (err) | ||
| fail(err, 'write'); | ||
| } | ||
|
|
||
| function afterWrite(err, handle, req) { | ||
| if (err) | ||
| fail(err, 'write'); | ||
|
|
||
| while (clientHandle.writeQueueSize === 0) | ||
| write(); | ||
| } | ||
| } |
| @@ -0,0 +1,149 @@ | ||
| // In this benchmark, we connect a client to the server, and write | ||
| // as many bytes as we can in the specified time (default = 10s) | ||
|
|
||
| var common = require('../common.js'); | ||
| var util = require('util'); | ||
|
|
||
| // if there are --dur=N and --len=N args, then | ||
| // run the function with those settings. | ||
| // if not, then queue up a bunch of child processes. | ||
| var bench = common.createBenchmark(main, { | ||
| len: [102400, 1024 * 1024 * 16], | ||
| type: ['utf', 'asc', 'buf'], | ||
| dur: [5] | ||
| }); | ||
|
|
||
| var TCP = process.binding('tcp_wrap').TCP; | ||
| var PORT = common.PORT; | ||
|
|
||
| var dur; | ||
| var len; | ||
| var type; | ||
|
|
||
| function main(conf) { | ||
| dur = +conf.dur; | ||
| len = +conf.len; | ||
| type = conf.type; | ||
| server(); | ||
| } | ||
|
|
||
| function fail(err, syscall) { | ||
| throw util._errnoException(err, syscall); | ||
| } | ||
|
|
||
| function server() { | ||
| var serverHandle = new TCP(); | ||
| var err = serverHandle.bind('127.0.0.1', PORT); | ||
| if (err) | ||
| fail(err, 'bind'); | ||
|
|
||
| err = serverHandle.listen(511); | ||
| if (err) | ||
| fail(err, 'listen'); | ||
|
|
||
| serverHandle.onconnection = function(err, clientHandle) { | ||
| if (err) | ||
| fail(err, 'connect'); | ||
|
|
||
| clientHandle.onread = function(nread, buffer) { | ||
| // we're not expecting to ever get an EOF from the client. | ||
| // just lots of data forever. | ||
| if (nread < 0) | ||
| fail(nread, 'read'); | ||
|
|
||
| var writeReq = { async: false }; | ||
| err = clientHandle.writeBuffer(writeReq, buffer); | ||
|
|
||
| if (err) | ||
| fail(err, 'write'); | ||
|
|
||
| writeReq.oncomplete = function(status, handle, req) { | ||
| if (status) | ||
| fail(err, 'write'); | ||
| }; | ||
| }; | ||
|
|
||
| clientHandle.readStart(); | ||
| }; | ||
|
|
||
| client(); | ||
| } | ||
|
|
||
| function client() { | ||
| var chunk; | ||
| switch (type) { | ||
| case 'buf': | ||
| chunk = new Buffer(len); | ||
| chunk.fill('x'); | ||
| break; | ||
| case 'utf': | ||
| chunk = new Array(len / 2 + 1).join('ĂĽ'); | ||
| break; | ||
| case 'asc': | ||
| chunk = new Array(len + 1).join('x'); | ||
| break; | ||
| default: | ||
| throw new Error('invalid type: ' + type); | ||
| break; | ||
| } | ||
|
|
||
| var clientHandle = new TCP(); | ||
| var connectReq = {}; | ||
| var err = clientHandle.connect(connectReq, '127.0.0.1', PORT); | ||
| var bytes = 0; | ||
|
|
||
| if (err) | ||
| fail(err, 'connect'); | ||
|
|
||
| clientHandle.readStart(); | ||
|
|
||
| clientHandle.onread = function(nread, buffer) { | ||
| if (nread < 0) | ||
| fail(nread, 'read'); | ||
|
|
||
| bytes += buffer.length; | ||
| }; | ||
|
|
||
| connectReq.oncomplete = function(err) { | ||
| if (err) | ||
| fail(err, 'connect'); | ||
|
|
||
| bench.start(); | ||
|
|
||
| setTimeout(function() { | ||
| // multiply by 2 since we're sending it first one way | ||
| // then then back again. | ||
| bench.end(2 * (bytes * 8) / (1024 * 1024 * 1024)); | ||
| }, dur * 1000); | ||
|
|
||
| while (clientHandle.writeQueueSize === 0) | ||
| write(); | ||
| }; | ||
|
|
||
| function write() { | ||
| var writeReq = { oncomplete: afterWrite }; | ||
| var err; | ||
| switch (type) { | ||
| case 'buf': | ||
| err = clientHandle.writeBuffer(writeReq, chunk); | ||
| break; | ||
| case 'utf': | ||
| err = clientHandle.writeUtf8String(writeReq, chunk); | ||
| break; | ||
| case 'asc': | ||
| err = clientHandle.writeAsciiString(writeReq, chunk); | ||
| break; | ||
| } | ||
|
|
||
| if (err) | ||
| fail(err, 'write'); | ||
| } | ||
|
|
||
| function afterWrite(err, handle, req) { | ||
| if (err) | ||
| fail(err, 'write'); | ||
|
|
||
| while (clientHandle.writeQueueSize === 0) | ||
| write(); | ||
| } | ||
| } |
| @@ -0,0 +1,137 @@ | ||
| // In this benchmark, we connect a client to the server, and write | ||
| // as many bytes as we can in the specified time (default = 10s) | ||
|
|
||
| var common = require('../common.js'); | ||
| var util = require('util'); | ||
|
|
||
| // if there are dur=N and len=N args, then | ||
| // run the function with those settings. | ||
| // if not, then queue up a bunch of child processes. | ||
| var bench = common.createBenchmark(main, { | ||
| len: [102400, 1024 * 1024 * 16], | ||
| type: ['utf', 'asc', 'buf'], | ||
| dur: [5] | ||
| }); | ||
|
|
||
| var TCP = process.binding('tcp_wrap').TCP; | ||
| var PORT = common.PORT; | ||
|
|
||
| var dur; | ||
| var len; | ||
| var type; | ||
|
|
||
| function main(conf) { | ||
| dur = +conf.dur; | ||
| len = +conf.len; | ||
| type = conf.type; | ||
| server(); | ||
| } | ||
|
|
||
| function fail(err, syscall) { | ||
| throw util._errnoException(err, syscall); | ||
| } | ||
|
|
||
| function server() { | ||
| var serverHandle = new TCP(); | ||
| var err = serverHandle.bind('127.0.0.1', PORT); | ||
| if (err) | ||
| fail(err, 'bind'); | ||
|
|
||
| err = serverHandle.listen(511); | ||
| if (err) | ||
| fail(err, 'listen'); | ||
|
|
||
| serverHandle.onconnection = function(err, clientHandle) { | ||
| if (err) | ||
| fail(err, 'connect'); | ||
|
|
||
| var chunk; | ||
| switch (type) { | ||
| case 'buf': | ||
| chunk = new Buffer(len); | ||
| chunk.fill('x'); | ||
| break; | ||
| case 'utf': | ||
| chunk = new Array(len / 2 + 1).join('ĂĽ'); | ||
| break; | ||
| case 'asc': | ||
| chunk = new Array(len + 1).join('x'); | ||
| break; | ||
| default: | ||
| throw new Error('invalid type: ' + type); | ||
| break; | ||
| } | ||
|
|
||
| clientHandle.readStart(); | ||
|
|
||
| while (clientHandle.writeQueueSize === 0) | ||
| write(); | ||
|
|
||
| function write() { | ||
| var writeReq = { async: false, oncomplete: afterWrite }; | ||
| var err; | ||
| switch (type) { | ||
| case 'buf': | ||
| err = clientHandle.writeBuffer(writeReq, chunk); | ||
| break; | ||
| case 'utf': | ||
| err = clientHandle.writeUtf8String(writeReq, chunk); | ||
| break; | ||
| case 'asc': | ||
| err = clientHandle.writeAsciiString(writeReq, chunk); | ||
| break; | ||
| } | ||
|
|
||
| if (err) { | ||
| fail(err, 'write'); | ||
| } else if (!writeReq.async) { | ||
| process.nextTick(function() { | ||
| afterWrite(null, clientHandle, writeReq); | ||
| }); | ||
| } | ||
| } | ||
|
|
||
| function afterWrite(err, handle, req) { | ||
| if (err) | ||
| fail(err, 'write'); | ||
|
|
||
| while (clientHandle.writeQueueSize === 0) | ||
| write(); | ||
| } | ||
| }; | ||
|
|
||
| client(); | ||
| } | ||
|
|
||
| function client() { | ||
| var clientHandle = new TCP(); | ||
| var connectReq = {}; | ||
| var err = clientHandle.connect(connectReq, '127.0.0.1', PORT); | ||
|
|
||
| if (err) | ||
| fail(err, 'connect'); | ||
|
|
||
| connectReq.oncomplete = function() { | ||
| var bytes = 0; | ||
| clientHandle.onread = function(nread, buffer) { | ||
| // we're not expecting to ever get an EOF from the client. | ||
| // just lots of data forever. | ||
| if (nread < 0) | ||
| fail(nread, 'read'); | ||
|
|
||
| // don't slice the buffer. the point of this is to isolate, not | ||
| // simulate real traffic. | ||
| bytes += buffer.length; | ||
| }; | ||
|
|
||
| clientHandle.readStart(); | ||
|
|
||
| // the meat of the benchmark is right here: | ||
| bench.start(); | ||
|
|
||
| setTimeout(function() { | ||
| // report in Gb/sec | ||
| bench.end((bytes * 8) / (1024 * 1024 * 1024)); | ||
| }, dur * 1000); | ||
| }; | ||
| } |
| @@ -31,6 +31,7 @@ server.listen(port, function() { | ||
| path: '/', | ||
| agent: agent | ||
| }, function(res) { | ||
| res.resume(); | ||
| res.on('end', function() { | ||
| if (++responses === n) { | ||
| server.close(); | ||
| @@ -0,0 +1,75 @@ | ||
| var common = require('../common.js'); | ||
| var bench = common.createBenchmark(main, { | ||
| dur: [5], | ||
| type: ['buf', 'asc', 'utf'], | ||
| size: [2, 1024, 1024 * 1024] | ||
| }); | ||
|
|
||
| var dur, type, encoding, size; | ||
| var server; | ||
|
|
||
| var path = require('path'); | ||
| var fs = require('fs'); | ||
| var cert_dir = path.resolve(__dirname, '../../test/fixtures'); | ||
| var options; | ||
| var tls = require('tls'); | ||
|
|
||
| function main(conf) { | ||
| dur = +conf.dur; | ||
| type = conf.type; | ||
| size = +conf.size; | ||
|
|
||
| var chunk; | ||
| switch (type) { | ||
| case 'buf': | ||
| chunk = new Buffer(size); | ||
| chunk.fill('b'); | ||
| break; | ||
| case 'asc': | ||
| chunk = new Array(size + 1).join('a'); | ||
| encoding = 'ascii'; | ||
| break; | ||
| case 'utf': | ||
| chunk = new Array(size/2 + 1).join('ĂĽ'); | ||
| encoding = 'utf8'; | ||
| break; | ||
| default: | ||
| throw new Error('invalid type'); | ||
| } | ||
|
|
||
| options = { key: fs.readFileSync(cert_dir + '/test_key.pem'), | ||
| cert: fs.readFileSync(cert_dir + '/test_cert.pem'), | ||
| ca: [ fs.readFileSync(cert_dir + '/test_ca.pem') ], | ||
| ciphers: 'AES256-GCM-SHA384' }; | ||
|
|
||
| server = tls.createServer(options, onConnection); | ||
| setTimeout(done, dur * 1000); | ||
| server.listen(common.PORT, function() { | ||
| var opt = { port: common.PORT, rejectUnauthorized: false }; | ||
| var conn = tls.connect(opt, function() { | ||
| bench.start(); | ||
| conn.on('drain', write); | ||
| write(); | ||
| }); | ||
|
|
||
| function write() { | ||
| var i = 0; | ||
| while (false !== conn.write(chunk, encoding)); | ||
| } | ||
| }); | ||
|
|
||
| var received = 0; | ||
| function onConnection(conn) { | ||
| conn.on('data', function(chunk) { | ||
| received += chunk.length; | ||
| }); | ||
| } | ||
|
|
||
| function done() { | ||
| var mbits = (received * 8) / (1024 * 1024); | ||
| bench.end(mbits); | ||
| conn.destroy(); | ||
| server.close(); | ||
| } | ||
| } | ||
|
|
| @@ -0,0 +1,64 @@ | ||
| var assert = require('assert'), | ||
| fs = require('fs'), | ||
| path = require('path'), | ||
| tls = require('tls'); | ||
|
|
||
| var common = require('../common.js'); | ||
| var bench = common.createBenchmark(main, { | ||
| concurrency: [1, 10], | ||
| dur: [5] | ||
| }); | ||
|
|
||
| var clientConn = 0; | ||
| var serverConn = 0; | ||
| var server; | ||
| var dur; | ||
| var concurrency; | ||
| var running = true; | ||
|
|
||
| function main(conf) { | ||
| dur = +conf.dur; | ||
| concurrency = +conf.concurrency; | ||
|
|
||
| var cert_dir = path.resolve(__dirname, '../../test/fixtures'), | ||
| options = { key: fs.readFileSync(cert_dir + '/test_key.pem'), | ||
| cert: fs.readFileSync(cert_dir + '/test_cert.pem'), | ||
| ca: [ fs.readFileSync(cert_dir + '/test_ca.pem') ], | ||
| ciphers: 'AES256-GCM-SHA384' }; | ||
|
|
||
| server = tls.createServer(options, onConnection); | ||
| server.listen(common.PORT, onListening); | ||
| } | ||
|
|
||
| function onListening() { | ||
| setTimeout(done, dur * 1000); | ||
| bench.start(); | ||
| for (var i = 0; i < concurrency; i++) | ||
| makeConnection(); | ||
| } | ||
|
|
||
| function onConnection(conn) { | ||
| serverConn++; | ||
| } | ||
|
|
||
| function makeConnection() { | ||
| var conn = tls.connect({ port: common.PORT, | ||
| rejectUnauthorized: false }, function() { | ||
| clientConn++; | ||
| conn.on('error', function(er) { | ||
| console.error('client error', er); | ||
| throw er; | ||
| }); | ||
| conn.end(); | ||
| if (running) makeConnection(); | ||
| }); | ||
| } | ||
|
|
||
| function done() { | ||
| running = false; | ||
| // it's only an established connection if they both saw it. | ||
| // because we destroy the server somewhat abruptly, these | ||
| // don't always match. Generally, serverConn will be | ||
| // the smaller number, but take the min just to be sure. | ||
| bench.end(Math.min(serverConn, clientConn)); | ||
| } |
| @@ -0,0 +1,19 @@ | ||
| /Debug/ | ||
| /build/gyp | ||
| /out/ | ||
| /Release/ | ||
|
|
||
| /cares.Makefile | ||
| /cares.target.mk | ||
|
|
||
| /*.opensdf | ||
| /*.sdf | ||
| /*.sln | ||
| /*.suo | ||
| /*.vcxproj | ||
| /*.vcxproj.filters | ||
| /*.vcxproj.user | ||
|
|
||
| *.so | ||
| *.[oa] | ||
| .buildstamp |
| @@ -0,0 +1,53 @@ | ||
| # Copyright Joyent, Inc. and other Node contributors. All rights reserved. | ||
| # | ||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| # of this software and associated documentation files (the "Software"), to | ||
| # deal in the Software without restriction, including without limitation the | ||
| # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||
| # sell copies of the Software, and to permit persons to whom the Software is | ||
| # furnished to do so, subject to the following conditions: | ||
| # | ||
| # The above copyright notice and this permission notice shall be included in | ||
| # all copies or substantial portions of the Software. | ||
| # | ||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
| # IN THE SOFTWARE. | ||
|
|
||
| SRCDIR ?= $(CURDIR) | ||
|
|
||
| ifeq (,$(builddir_name)) | ||
|
|
||
| VPATH := $(SRCDIR) | ||
| include $(SRCDIR)/build.mk | ||
|
|
||
| else # Out of tree build. | ||
|
|
||
| # Drop all built-in rules. | ||
| .SUFFIXES: | ||
|
|
||
| .PHONY: $(builddir_name) | ||
| $(builddir_name): $(builddir_name)/.buildstamp | ||
| $(MAKE) -C $@ -f $(CURDIR)/Makefile $(MAKECMDGOALS) \ | ||
| SRCDIR=$(CURDIR) builddir_name= | ||
|
|
||
| $(builddir_name)/.buildstamp: | ||
| mkdir -p $(dir $@) | ||
| touch $@ | ||
|
|
||
| # Add no-op rules for Makefiles to stop make from trying to rebuild them. | ||
| Makefile:: ; | ||
| %.mk:: ; | ||
|
|
||
| # Turn everything else into a no-op rule that depends on the build directory. | ||
| %:: $(builddir_name) ; | ||
|
|
||
| .PHONY: clean | ||
| clean: | ||
| $(RM) -fr $(builddir_name) | ||
|
|
||
| endif |
| @@ -0,0 +1,21 @@ | ||
| #!/bin/bash | ||
|
|
||
| export TOOLCHAIN=$PWD/android-toolchain | ||
| mkdir -p $TOOLCHAIN | ||
| $1/build/tools/make-standalone-toolchain.sh \ | ||
| --toolchain=arm-linux-androideabi-4.7 \ | ||
| --arch=arm \ | ||
| --install-dir=$TOOLCHAIN \ | ||
| --platform=android-9 | ||
| export PATH=$TOOLCHAIN/bin:$PATH | ||
| export AR=arm-linux-androideabi-ar | ||
| export CC=arm-linux-androideabi-gcc | ||
| export CXX=arm-linux-androideabi-g++ | ||
| export LINK=arm-linux-androideabi-g++ | ||
| export PLATFORM=android | ||
| export OS=android | ||
|
|
||
| if [ $2 -a $2 == 'gyp' ] | ||
| then | ||
| ./gyp_cares -DOS=android -Dtarget_arch=arm | ||
| fi |
| @@ -0,0 +1,147 @@ | ||
| # Copyright Joyent, Inc. and other Node contributors. All rights reserved. | ||
| # | ||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| # of this software and associated documentation files (the "Software"), to | ||
| # deal in the Software without restriction, including without limitation the | ||
| # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||
| # sell copies of the Software, and to permit persons to whom the Software is | ||
| # furnished to do so, subject to the following conditions: | ||
| # | ||
| # The above copyright notice and this permission notice shall be included in | ||
| # all copies or substantial portions of the Software. | ||
| # | ||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
| # IN THE SOFTWARE. | ||
|
|
||
| OS ?= $(shell sh -c 'uname -s | tr "[A-Z]" "[a-z]"') | ||
|
|
||
| OBJS= \ | ||
| src/ares_cancel.o \ | ||
| src/ares__close_sockets.o \ | ||
| src/ares_create_query.o \ | ||
| src/ares_data.o \ | ||
| src/ares_destroy.o \ | ||
| src/ares_expand_name.o \ | ||
| src/ares_expand_string.o \ | ||
| src/ares_fds.o \ | ||
| src/ares_free_hostent.o \ | ||
| src/ares_free_string.o \ | ||
| src/ares_gethostbyaddr.o \ | ||
| src/ares_gethostbyname.o \ | ||
| src/ares__get_hostent.o \ | ||
| src/ares_getnameinfo.o \ | ||
| src/ares_getopt.o \ | ||
| src/ares_getsock.o \ | ||
| src/ares_init.o \ | ||
| src/ares_library_init.o \ | ||
| src/ares_llist.o \ | ||
| src/ares_mkquery.o \ | ||
| src/ares_nowarn.o \ | ||
| src/ares_options.o \ | ||
| src/ares_parse_aaaa_reply.o \ | ||
| src/ares_parse_a_reply.o \ | ||
| src/ares_parse_mx_reply.o \ | ||
| src/ares_parse_naptr_reply.o \ | ||
| src/ares_parse_ns_reply.o \ | ||
| src/ares_parse_ptr_reply.o \ | ||
| src/ares_parse_soa_reply.o \ | ||
| src/ares_parse_srv_reply.o \ | ||
| src/ares_parse_txt_reply.o \ | ||
| src/ares_process.o \ | ||
| src/ares_query.o \ | ||
| src/ares__read_line.o \ | ||
| src/ares_search.o \ | ||
| src/ares_send.o \ | ||
| src/ares_strcasecmp.o \ | ||
| src/ares_strdup.o \ | ||
| src/ares_strerror.o \ | ||
| src/ares_timeout.o \ | ||
| src/ares__timeval.o \ | ||
| src/ares_version.o \ | ||
| src/ares_writev.o \ | ||
| src/bitncmp.o \ | ||
| src/inet_net_pton.o \ | ||
| src/inet_ntop.o \ | ||
|
|
||
| CFLAGS += -I. -I$(SRCDIR)/include -DHAVE_CONFIG_H | ||
|
|
||
| ARES_CONFIG_OS = $(OS) | ||
| SOEXT = so | ||
|
|
||
| # if on windows | ||
| ifneq (,$(findstring mingw,$(OS))) | ||
| ARES_CONFIG_OS = win32 | ||
| OBJS += src/windows_port.o | ||
| OBJS += src/ares_getenv.o | ||
| OBJS += src/ares_platform.o | ||
|
|
||
| LDFLAGS += -lws2_32.lib -liphlpapi.lib | ||
| else # else a posix system | ||
| CFLAGS += -g --std=gnu89 -pedantic | ||
| CFLAGS += -Wall -Wextra -Wno-unused-parameter | ||
| CFLAGS += -D_LARGEFILE_SOURCE | ||
| CFLAGS += -D_FILE_OFFSET_BITS=64 | ||
| endif | ||
|
|
||
| ifneq (,$(findstring cygwin,$(OS))) | ||
| ARES_CONFIG_OS = cygwin | ||
| CFLAGS += -D_GNU_SOURCE | ||
| endif | ||
|
|
||
| ifeq (dragonflybsd,$(OS)) | ||
| ARES_CONFIG_OS = freebsd | ||
| endif | ||
|
|
||
| ifeq (darwin,$(OS)) | ||
| CFLAGS += -D_DARWIN_USE_64_BIT_INODE=1 | ||
| LDFLAGS += -dynamiclib -install_name "@rpath/libcares.dylib" | ||
| SOEXT = dylib | ||
| endif | ||
|
|
||
| ifeq (linux,$(OS)) | ||
| CFLAGS += -D_GNU_SOURCE | ||
| endif | ||
|
|
||
| ifeq (android,$(OS)) | ||
| CFLAGS += -D_GNU_SOURCE | ||
| endif | ||
|
|
||
| ifeq (sunos,$(OS)) | ||
| LDFLAGS += -lsocket -lnsl | ||
| CFLAGS += -D__EXTENSIONS__ -D_XOPEN_SOURCE=500 | ||
| endif | ||
|
|
||
| CFLAGS += -I$(SRCDIR)/config/$(ARES_CONFIG_OS) | ||
|
|
||
| ifneq (,$(findstring libcares.$(SOEXT),$(MAKECMDGOALS))) | ||
| CFLAGS += -DCARES_BUILDING_LIBRARY | ||
| else | ||
| CFLAGS += -DCARES_STATICLIB | ||
| endif | ||
|
|
||
| all: libcares.a | ||
|
|
||
| src/.buildstamp: | ||
| mkdir -p $(dir $@) | ||
| touch $@ | ||
|
|
||
| libcares.a: $(OBJS) | ||
| $(AR) rcs $@ $^ | ||
|
|
||
| libcares.$(SOEXT): override CFLAGS += -fPIC | ||
| libcares.$(SOEXT): $(OBJS:%.o=%.pic.o) | ||
| $(CC) -shared -o $@ $^ $(LDFLAGS) | ||
|
|
||
| src/%.o src/%.pic.o: src/%.c include/ares.h include/ares_version.h \ | ||
| include/nameser.h src/.buildstamp \ | ||
| $(SRCDIR)/config/$(ARES_CONFIG_OS)/ares_config.h | ||
| $(CC) $(CFLAGS) -c $< -o $@ | ||
|
|
||
| .PHONY: clean | ||
| clean: | ||
| $(RM) -f libcares.a libcares.$(SOEXT) src/*.o src/.buildstamp |
| @@ -0,0 +1,20 @@ | ||
| #!/usr/bin/env python | ||
|
|
||
| import os | ||
| import re | ||
| import subprocess | ||
| import sys | ||
|
|
||
|
|
||
| def DoMain(*args): | ||
| cc = os.environ.get('CC', 'gcc') | ||
| stdin, stderr = os.pipe() | ||
| subprocess.call([cc, '-v'], stderr=stderr) | ||
| output = os.read(stdin, 4096) | ||
| match = re.search("\ngcc version (\d+\.\d+\.\d+)", output) | ||
| if match: | ||
| print(match.group(1)) | ||
|
|
||
|
|
||
| if __name__ == '__main__': | ||
| DoMain(*sys.argv) |
| @@ -0,0 +1,168 @@ | ||
| { | ||
| 'target_defaults': { | ||
| 'conditions': [ | ||
| ['OS!="win"', { | ||
| 'defines': [ | ||
| '_DARWIN_USE_64_BIT_INODE=1', | ||
| '_LARGEFILE_SOURCE', | ||
| '_FILE_OFFSET_BITS=64', | ||
| '_GNU_SOURCE' | ||
| ] | ||
| }], | ||
| ['OS=="solaris"', { | ||
| 'defines': [ | ||
| '__EXTENSIONS__', | ||
| '_XOPEN_SOURCE=500' | ||
| ] | ||
| }] | ||
| ] | ||
| }, | ||
|
|
||
| 'targets': [ | ||
| { | ||
| 'target_name': 'cares', | ||
| 'type': '<(library)', | ||
| 'include_dirs': [ 'include', 'src' ], | ||
| 'direct_dependent_settings': { | ||
| 'include_dirs': [ 'include' ] | ||
| }, | ||
| 'defines': [ 'HAVE_CONFIG_H' ], | ||
| 'sources': [ | ||
| 'common.gypi', | ||
| 'include/ares.h', | ||
| 'include/ares_version.h', | ||
| 'include/nameser.h', | ||
| 'src/ares_cancel.c', | ||
| 'src/ares__close_sockets.c', | ||
| 'src/ares_create_query.c', | ||
| 'src/ares_data.c', | ||
| 'src/ares_data.h', | ||
| 'src/ares_destroy.c', | ||
| 'src/ares_dns.h', | ||
| 'src/ares_expand_name.c', | ||
| 'src/ares_expand_string.c', | ||
| 'src/ares_fds.c', | ||
| 'src/ares_free_hostent.c', | ||
| 'src/ares_free_string.c', | ||
| 'src/ares_getenv.h', | ||
| 'src/ares_gethostbyaddr.c', | ||
| 'src/ares_gethostbyname.c', | ||
| 'src/ares__get_hostent.c', | ||
| 'src/ares_getnameinfo.c', | ||
| 'src/ares_getopt.c', | ||
| 'src/ares_getopt.h', | ||
| 'src/ares_getsock.c', | ||
| 'src/ares_init.c', | ||
| 'src/ares_ipv6.h', | ||
| 'src/ares_library_init.c', | ||
| 'src/ares_library_init.h', | ||
| 'src/ares_llist.c', | ||
| 'src/ares_llist.h', | ||
| 'src/ares_mkquery.c', | ||
| 'src/ares_nowarn.c', | ||
| 'src/ares_nowarn.h', | ||
| 'src/ares_options.c', | ||
| 'src/ares_parse_aaaa_reply.c', | ||
| 'src/ares_parse_a_reply.c', | ||
| 'src/ares_parse_mx_reply.c', | ||
| 'src/ares_parse_naptr_reply.c', | ||
| 'src/ares_parse_ns_reply.c', | ||
| 'src/ares_parse_ptr_reply.c', | ||
| 'src/ares_parse_soa_reply.c', | ||
| 'src/ares_parse_srv_reply.c', | ||
| 'src/ares_parse_txt_reply.c', | ||
| 'src/ares_platform.h', | ||
| 'src/ares_private.h', | ||
| 'src/ares_process.c', | ||
| 'src/ares_query.c', | ||
| 'src/ares__read_line.c', | ||
| 'src/ares_rules.h', | ||
| 'src/ares_search.c', | ||
| 'src/ares_send.c', | ||
| 'src/ares_setup.h', | ||
| 'src/ares_strcasecmp.c', | ||
| 'src/ares_strcasecmp.h', | ||
| 'src/ares_strdup.c', | ||
| 'src/ares_strdup.h', | ||
| 'src/ares_strerror.c', | ||
| 'src/ares_timeout.c', | ||
| 'src/ares__timeval.c', | ||
| 'src/ares_version.c', | ||
| 'src/ares_writev.c', | ||
| 'src/ares_writev.h', | ||
| 'src/bitncmp.c', | ||
| 'src/bitncmp.h', | ||
| 'src/inet_net_pton.c', | ||
| 'src/inet_ntop.c', | ||
| 'src/ares_inet_net_pton.h', | ||
| 'src/setup_once.h', | ||
| 'src/windows_port.c' | ||
| ], | ||
| 'conditions': [ | ||
| [ 'library=="static_library"', { | ||
| 'defines': [ 'CARES_STATICLIB' ] | ||
| }, { | ||
| 'defines': [ 'CARES_BUILDING_LIBRARY' ] | ||
| }], | ||
| [ 'OS=="win"', { | ||
| 'include_dirs': [ 'config/win32' ], | ||
| 'sources': [ | ||
| 'config/win32/ares_config.h', | ||
| 'src/windows_port.c', | ||
| 'src/ares_getenv.c', | ||
| 'src/ares_iphlpapi.h', | ||
| 'src/ares_platform.c' | ||
| ], | ||
| 'libraries': [ | ||
| '-lws2_32.lib', | ||
| '-liphlpapi.lib' | ||
| ], | ||
| }, { | ||
| # Not Windows i.e. POSIX | ||
| 'cflags': [ | ||
| '-g', | ||
| '-pedantic', | ||
| '-Wall', | ||
| '-Wextra', | ||
| '-Wno-unused-parameter' | ||
| ], | ||
| }], | ||
| [ 'OS not in "win android"', { | ||
| 'cflags': [ | ||
| '--std=gnu89' | ||
| ], | ||
| }], | ||
| [ 'OS=="linux"', { | ||
| 'include_dirs': [ 'config/linux' ], | ||
| 'sources': [ 'config/linux/ares_config.h' ] | ||
| }], | ||
| [ 'OS=="mac"', { | ||
| 'include_dirs': [ 'config/darwin' ], | ||
| 'sources': [ 'config/darwin/ares_config.h' ] | ||
| }], | ||
| [ 'OS=="freebsd" or OS=="dragonflybsd"', { | ||
| 'include_dirs': [ 'config/freebsd' ], | ||
| 'sources': [ 'config/freebsd/ares_config.h' ] | ||
| }], | ||
| [ 'OS=="openbsd"', { | ||
| 'include_dirs': [ 'config/openbsd' ], | ||
| 'sources': [ 'config/openbsd/ares_config.h' ] | ||
| }], | ||
| [ 'OS=="android"', { | ||
| 'include_dirs': [ 'config/android' ], | ||
| 'sources': [ 'config/android/ares_config.h' ], | ||
| }], | ||
| [ 'OS=="solaris"', { | ||
| 'include_dirs': [ 'config/sunos' ], | ||
| 'sources': [ 'config/sunos/ares_config.h' ], | ||
| 'direct_dependent_settings': { | ||
| 'libraries': [ | ||
| '-lsocket', | ||
| '-lnsl' | ||
| ] | ||
| } | ||
| }] | ||
| ] | ||
| } | ||
| ] | ||
| } |
| @@ -0,0 +1,172 @@ | ||
| { | ||
| 'variables': { | ||
| 'visibility%': 'hidden', | ||
| 'library%': 'static_library', # allow override to 'shared_library' for DLL/.so builds | ||
| 'component%': 'static_library', | ||
| 'host_arch%': '', | ||
| 'target_arch%': '' | ||
| }, | ||
|
|
||
| 'target_defaults': { | ||
| 'default_configuration': 'Debug', | ||
| 'configurations': { | ||
|
|
||
| 'Debug': { | ||
| 'defines': [ 'DEBUG', '_DEBUG' ], | ||
| 'cflags': [ '-g', '-O0' ], | ||
| 'msvs_settings': { | ||
| 'VCCLCompilerTool': { | ||
| 'target_conditions': [ | ||
| ['library=="static_library"', { | ||
| 'RuntimeLibrary': 1 # static debug | ||
| }, { | ||
| 'RuntimeLibrary': 3 # DLL debug | ||
| }] | ||
| ], | ||
| 'Optimization': 0, # /Od, no optimization | ||
| 'MinimalRebuild': 'false', | ||
| 'OmitFramePointers': 'false', | ||
| 'BasicRuntimeChecks': 3 # /RTC1 | ||
| }, | ||
| 'VCLinkerTool': { | ||
| 'LinkIncremental': 2 # enable incremental linking | ||
| } | ||
| }, | ||
| 'xcode_settings': { | ||
| 'GCC_OPTIMIZATION_LEVEL': '0' | ||
| } | ||
| }, | ||
|
|
||
| 'Release': { | ||
| 'defines': [ 'NDEBUG' ], | ||
| 'cflags': [ | ||
| '-O3', | ||
| '-fomit-frame-pointer', | ||
| '-fdata-sections', | ||
| '-ffunction-sections' | ||
| ], | ||
| 'msvs_settings': { | ||
| 'VCCLCompilerTool': { | ||
| 'target_conditions': [ | ||
| ['library=="static_library"', { | ||
| 'RuntimeLibrary': 0, # static release | ||
| }, { | ||
| 'RuntimeLibrary': 2, # debug release | ||
| }], | ||
| ], | ||
| 'Optimization': 3, # /Ox, full optimization | ||
| 'FavorSizeOrSpeed': 1, # /Ot, favour speed over size | ||
| 'InlineFunctionExpansion': 2, # /Ob2, inline anything eligible | ||
| 'WholeProgramOptimization': 'true', # /GL, whole program optimization, needed for LTCG | ||
| 'OmitFramePointers': 'true', | ||
| 'EnableFunctionLevelLinking': 'true', | ||
| 'EnableIntrinsicFunctions': 'true' | ||
| }, | ||
| 'VCLibrarianTool': { | ||
| 'AdditionalOptions': [ | ||
| '/LTCG' # link time code generation | ||
| ] | ||
| }, | ||
| 'VCLinkerTool': { | ||
| 'LinkTimeCodeGeneration': 1, # link-time code generation | ||
| 'OptimizeReferences': 2, # /OPT:REF | ||
| 'EnableCOMDATFolding': 2, # /OPT:ICF | ||
| 'LinkIncremental': 1 # disable incremental linking | ||
| }, | ||
| }, | ||
| } | ||
| }, | ||
|
|
||
| 'msvs_settings': { | ||
| 'VCCLCompilerTool': { | ||
| 'StringPooling': 'true', # pool string literals | ||
| 'DebugInformationFormat': 3, # Generate a PDB | ||
| 'WarningLevel': 3, | ||
| 'BufferSecurityCheck': 'true', | ||
| 'ExceptionHandling': 1, # /EHsc | ||
| 'SuppressStartupBanner': 'true', | ||
| 'WarnAsError': 'false', | ||
| 'AdditionalOptions': [ | ||
| '/MP', # compile across multiple CPUs | ||
| ], | ||
| }, | ||
| 'VCLinkerTool': { | ||
| 'GenerateDebugInformation': 'true', | ||
| 'RandomizedBaseAddress': 2, # enable ASLR | ||
| 'DataExecutionPrevention': 2, # enable DEP | ||
| 'AllowIsolation': 'true', | ||
| 'SuppressStartupBanner': 'true', | ||
| 'target_conditions': [ | ||
| ['_type=="executable"', { | ||
| 'SubSystem': 1, # console executable | ||
| }], | ||
| ], | ||
| }, | ||
| }, | ||
|
|
||
| 'xcode_settings': { | ||
| 'ALWAYS_SEARCH_USER_PATHS': 'NO', | ||
| 'GCC_CW_ASM_SYNTAX': 'NO', # No -fasm-blocks | ||
| 'GCC_ENABLE_CPP_EXCEPTIONS': 'NO', # -fno-exceptions | ||
| 'GCC_ENABLE_CPP_RTTI': 'NO', # -fno-rtti | ||
| 'GCC_ENABLE_PASCAL_STRINGS': 'NO', # No -mpascal-strings | ||
| # GCC_INLINES_ARE_PRIVATE_EXTERN maps to -fvisibility-inlines-hidden | ||
| 'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES', | ||
| 'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden | ||
| 'GCC_THREADSAFE_STATICS': 'NO', # -fno-threadsafe-statics | ||
| 'GCC_WARN_ABOUT_MISSING_NEWLINE': 'YES', # -Wnewline-eof | ||
| 'PREBINDING': 'NO', # No -Wl,-prebind | ||
| 'USE_HEADERMAP': 'NO', | ||
| 'WARNING_CFLAGS': [ | ||
| '-Wall', | ||
| '-Wendif-labels', | ||
| '-W', | ||
| '-Wno-unused-parameter' | ||
| ] | ||
| }, | ||
|
|
||
| 'conditions': [ | ||
| ['OS == "win"', { | ||
| 'msvs_cygwin_shell': 0, # prevent actions from trying to use cygwin | ||
| 'defines': [ | ||
| 'WIN32', | ||
| # we don't want VC++ warning us about how dangerous C functions are. | ||
| '_CRT_SECURE_NO_DEPRECATE', | ||
| # ... or that C implementations shouldn't use POSIX names | ||
| '_CRT_NONSTDC_NO_DEPRECATE' | ||
| ], | ||
| }], | ||
|
|
||
| [ 'OS in "linux freebsd openbsd solaris android"', { | ||
| 'variables': { | ||
| 'gcc_version%': '<!(python build/gcc_version.py)>)' | ||
| }, | ||
| 'cflags': [ '-Wall' ], | ||
| 'cflags_cc': [ '-fno-rtti', '-fno-exceptions' ], | ||
| 'conditions': [ | ||
| [ 'host_arch != target_arch and target_arch=="ia32"', { | ||
| 'cflags': [ '-m32' ], | ||
| 'ldflags': [ '-m32' ] | ||
| }], | ||
| [ 'OS=="linux"', { | ||
| 'cflags': [ '-ansi' ] | ||
| }], | ||
| [ 'visibility=="hidden" and gcc_version >= "4.0.0"', { | ||
| 'cflags': [ '-fvisibility=hidden' ] | ||
| }], | ||
| ] | ||
| }] | ||
| ], | ||
|
|
||
| 'target_conditions': [ | ||
| ['_type!="static_library"', { | ||
| 'cflags': [ '-fPIC' ], | ||
| 'xcode_settings': { | ||
| 'GCC_DYNAMIC_NO_PIC': 'NO', # No -mdynamic-no-pic | ||
| # (Equivalent to -fPIC) | ||
| 'OTHER_LDFLAGS': [ '-Wl,-search_paths_first' ] | ||
| } | ||
| }] | ||
| ] | ||
| } | ||
| } |