| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 | var test = require('tap').testvar fs = require('../')test('open lots of stuff', function (t) {  // Get around EBADF from libuv by making sure that stderr is opened  // Otherwise Darwin will refuse to give us a FD for stderr!  process.stderr.write('')  // How many parallel open()'s to do  var n = 1024  var opens = 0  var fds = []  var going = true  var closing = false  var doneCalled = 0  for (var i = 0; i < n; i++) {    go()  }  function go() {    opens++    fs.open(__filename, 'r', function (er, fd) {      if (er) throw er      fds.push(fd)      if (going) go()    })  }  // should hit ulimit pretty fast  setTimeout(function () {    going = false    t.equal(opens - fds.length, n)    done()  }, 100)  function done () {    if (closing) return    doneCalled++    if (fds.length === 0) {      console.error('done called %d times', doneCalled)      // First because of the timeout      // Then to close the fd's opened afterwards      // Then this time, to complete.      // Might take multiple passes, depending on CPU speed      // and ulimit, but at least 3 in every case.      t.ok(doneCalled >= 2)      return t.end()    }    closing = true    setTimeout(function () {      // console.error('do closing again')      closing = false      done()    }, 100)    // console.error('closing time')    var closes = fds.slice(0)    fds.length = 0    closes.forEach(function (fd) {      fs.close(fd, function (er) {        if (er) throw er      })    })  }})
 |