1 A task output callback may run a nested event loop, during which the task 2 finishes and is released. The outer callback invocation must still be able 3 to complete. 4 5 -- Testcase -- 6 {% 7 import * as uloop from 'uloop'; 8 9 uloop.init(); 10 11 let seen = []; 12 13 uloop.task( 14 (pipe) => { 15 pipe.send('first'); 16 17 return 'last'; 18 }, 19 (msg) => { 20 push(seen, msg); 21 22 if (msg != 'first') 23 return; 24 25 uloop.timer(300, () => uloop.end()); 26 uloop.run(); 27 } 28 ); 29 30 uloop.timer(600, () => uloop.end()); 31 uloop.run(); 32 33 printf("%J\n", seen); 34 35 uloop.done(); 36 %} 37 -- End -- 38 39 -- Expect stdout -- 40 [ "first", "last" ] 41 -- End -- 42 43 44 A finished task is released even if its output callback throws an 45 exception for every message. 46 47 -- Testcase -- 48 {% 49 import * as uloop from 'uloop'; 50 import * as fs from 'fs'; 51 52 uloop.init(); 53 54 let errors = 0; 55 56 uloop.guard(function() { 57 errors++; 58 }); 59 60 // the VM retains the most recent exception, so raise one beforehand 61 uloop.timer(1, () => die('warm-up')); 62 uloop.timer(10, () => uloop.end()); 63 uloop.run(); 64 65 let base_fds = length(fs.lsdir('/dev/fd')); 66 let base = gc('count'); 67 68 uloop.task( 69 (pipe) => { 70 pipe.send('first'); 71 72 return 'last'; 73 }, 74 (msg) => die(msg) 75 ); 76 77 uloop.timer(300, () => uloop.end()); 78 uloop.run(); 79 80 printf("errors: %d, alive: %d, open: %d\n", errors, 81 gc('count') - base, length(fs.lsdir('/dev/fd')) - base_fds); 82 83 uloop.done(); 84 %} 85 -- End -- 86 87 -- Expect stdout -- 88 errors: 3, alive: 0, open: 0 89 -- End --
This page was automatically generated by LXR 0.3.1. • OpenWrt