Skip to content

Instantly share code, notes, and snippets.

@laverdet
laverdet / gist:791157
Created January 22, 2011 14:39
node-fibers adapter example
$ cat adapter.js
require('./node-fibers');
var print = require('util').print;
// This function runs an asynchronous function from within a fiber as if it
// were synchronous.
function asyncAsSync(fn /* ... */) {
var args = [].slice.call(arguments, 1);
var fiber = Fiber.current;
@laverdet
laverdet / earlyfibers.diff
Created February 4, 2011 19:49
Test patch to fix issue #6 in laverdet/node-fibers
diff --git a/src/coroutine.cc b/src/coroutine.cc
index e1d8908..265faf4 100644
--- a/src/coroutine.cc
+++ b/src/coroutine.cc
@@ -42,7 +42,10 @@ static pthread_key_create_t& dyn_pthread_key_create();
* the original implementation but that doesn't work because dlsym() tries to get a lock which ends
* up calling pthread_getspecific and pthread_setspecific. So have to implement our own versions of
* these functions assuming one thread only and then as soon as we can, put all that saved data into
- * real TLS.
+ * a better structure.
@laverdet
laverdet / copy.js
Created February 22, 2011 16:45
compare copying a file natively, and with fibers
require('fibers');
var fs = require('fs');
function resumer() {
var fiber = Fiber.current;
return function(err, val) {
if (err) {
fiber.throwInto(err);
} else {
fiber.run(val);
String.prototype.method = function() {}
function func(str) {}
var stringObject = new String("hello world");
var stringPrimitive = "hello world";
exports.compare = {
"stringObject.method()": function() {
stringObject.method();
},
function Future() {}
Future.mixin({
didComplete: function(value) {
if (value === undefined) {
throw new TypeError('May not return undefined from future');
}
this._value = value;
var fibers = this._fibers;
if (fibers) {
@laverdet
laverdet / future.js
Created March 29, 2011 14:16
Simple future library which makes use of node-fibers for blocking operations
"use strict";
require('fibers');
this.Future = Future;
this.FiberFuture = FiberFuture;
this.wait = wait;
/**
* Return a function which automatically creates a fiber for each invocation.
*/
@laverdet
laverdet / nextTick.js
Created March 29, 2011 23:49
nextTick will ALWAYS fire before a setTimeout from the same tick
setTimeout(function() {
console.log('timeout');
}, 0);
// simulate extreme cpu load
var d = +new Date;
console.log(new Date);
while (d + 2000 > new Date);
console.log(new Date);
// Bad third-party code
var fs = require('fs');
require('fibers');
function fetchSomething() { // don't do this!
var fiber = Fiber.current;
fs.readFile(__filename, 'utf8', function(err, val) {
fiber.run(val);
});
return Fiber.yield();
@laverdet
laverdet / binlog-tailer.js
Created May 6, 2011 07:56
MySQL binlog tailer
"use strict";
this.MysqlBinlogTailer = MysqlBinlogTailer;
var EventEmitter = require('events').EventEmitter;
var fs = require('fs');
var path = require('path');
/**
* Tails a Mysql binlog and emits an event for every query executed.
*/
@laverdet
laverdet / fibonacci.js
Created August 4, 2011 05:47
Fibonacci Generator
require('fibers');
// Generator function. Returns a function which returns incrementing
// Fibonacci numbers with each call.
function Fibonacci() {
// Create a new fiber which yields sequential Fibonacci numbers
var fiber = Fiber(function() {
Fiber.yield(0); // F(0) -> 0
var prev = 0, curr = 1;
while (true) {