File: concurrent.js

package info (click to toggle)
mongodb 1%3A2.4.10-5
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 82,464 kB
  • sloc: cpp: 740,225; ansic: 152,098; sh: 13,820; python: 11,864; makefile: 1,012; perl: 922; pascal: 617; java: 452; lisp: 222; asm: 174
file content (30 lines) | stat: -rw-r--r-- 1,254 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/* NOTE: Requires mongo shell to be built with V8 javascript engine,
which implements concurrent threads via fork() */

// Fork and start
function fork_(thunk) {
    thread = fork(thunk)
    thread.start()
    return thread
}

// In functional form, useful for high-order functions like map in fun.js
function join_(thread) {thread.join()}

// Fork a loop on each one-arg block and wait for all of them to terminate. Foreground blocks are executed n times, background blocks are executed repeatedly until all forground loops finish. If any fail, stop all loops and reraise exception in main thread
function parallel(n, foregroundBlock1s, backgroundBlock1s) {
    var err = null
    var stop = false
    function loop(m) {return function(block1) {return function() {
        for (var i = 0; i < m; i++) {if (stop) break; block1(i)} }}}
    function watch(block) {return function() {
        try {block()} catch(e) {err = e; stop = true}}}
    foreThunks = map(watch, map(loop(n), foregroundBlock1s))
    backThunks = map(watch, map(loop(Infinity), backgroundBlock1s))
    foreThreads = map(fork_, foreThunks)
    backThreads = map(fork_, backThunks)
    map(join_, foreThreads)
    stop = true
    map(join_, backThreads)
    if (err != null) throw err
}