• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/ucode/tests/custom/06_lib_uloop/05_task_callbacks

  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