Revision: | 1.4 |
Committed: | Tue Nov 18 23:20:41 2008 UTC (15 years, 7 months ago) by root |
Content type: | application/x-troff |
Branch: | MAIN |
CVS Tags: | rel-6_09, rel-5_131, rel-6_0, rel-5_23, rel-5_24, rel-5_25, rel-6_32, rel-6_33, rel-6_31, rel-5_162, rel-5_2, rel-6_10, rel-6_13, rel-6_03, rel-6_02, rel-5_151, rel-5_22, rel-5_11, rel-5_12, rel-5_15, rel-5_14, rel-5_17, rel-5_16, rel-5_37, rel-5_36, rel-6_23, rel-6_08, rel-6_07, rel-6_06, rel-6_05, rel-6_04, rel-6_29, rel-6_28, rel-6_01, rel-5_132, rel-5_0, rel-5_371, rel-5_372, rel-5_1, rel-5_161 |
Changes since 1.3: | +47 -1 lines |
Log Message: | *** empty log message *** |
# | Content |
---|---|
1 | $|=1; |
2 | print "1..6\n"; |
3 | |
4 | use Coro; |
5 | use Coro::Semaphore; |
6 | |
7 | { |
8 | my $sem = new Coro::Semaphore 2; |
9 | |
10 | my $rand = 0; |
11 | |
12 | sub xrand { |
13 | $rand = ($rand * 121 + 2121) % 212121; |
14 | $rand / 212120 |
15 | } |
16 | |
17 | my $counter; |
18 | |
19 | $_->join for |
20 | map { |
21 | async { |
22 | my $current = $Coro::current; |
23 | for (1..100) { |
24 | cede if 0.2 > xrand; |
25 | Coro::async_pool { $current->ready } if 0.2 > xrand; |
26 | $counter += $sem->count; |
27 | my $guard = $sem->guard; |
28 | cede; cede; cede; cede; |
29 | } |
30 | } |
31 | } 1..15 |
32 | ; |
33 | |
34 | print $counter == 998 ? "" : "not ", "ok 1 # $counter\n"; |
35 | } |
36 | |
37 | # check terminate |
38 | { |
39 | my $sem = new Coro::Semaphore 0; |
40 | |
41 | $as1 = async { |
42 | my $g = $sem->guard; |
43 | print "not ok 2\n"; |
44 | }; |
45 | |
46 | $as2 = async { |
47 | my $g = $sem->guard; |
48 | print "ok 2\n"; |
49 | }; |
50 | |
51 | cede; |
52 | |
53 | $sem->up; # wake up as1 |
54 | $as1->cancel; # destroy as1 before it could ->guard |
55 | $as1->join; |
56 | $as2->join; |
57 | } |
58 | |
59 | # check throw |
60 | { |
61 | my $sem = new Coro::Semaphore 0; |
62 | |
63 | $as1 = async { |
64 | my $g = eval { |
65 | $sem->guard; |
66 | }; |
67 | print $@ ? "" : "not ", "ok 3\n"; |
68 | }; |
69 | |
70 | $as2 = async { |
71 | my $g = $sem->guard; |
72 | print "ok 4\n"; |
73 | }; |
74 | |
75 | cede; |
76 | |
77 | $sem->up; # wake up as1 |
78 | $as1->throw (1); # destroy as1 before it could ->guard |
79 | $as1->join; |
80 | $as2->join; |
81 | } |
82 | |
83 | # check wait |
84 | { |
85 | my $sem = new Coro::Semaphore 0; |
86 | |
87 | $as1 = async { |
88 | $sem->wait; |
89 | print "ok 5\n"; |
90 | }; |
91 | |
92 | $as2 = async { |
93 | my $g = $sem->guard; |
94 | print "ok 6\n"; |
95 | }; |
96 | |
97 | cede; |
98 | |
99 | $sem->up; # wake up as1 |
100 | $as1->join; |
101 | $as2->join; |
102 | } |
103 | |
104 |