]> Sergey Matveev's repositories - public-inbox.git/blob - lib/PublicInbox/EvCleanup.pm
Merge branch 'unsubscribe'
[public-inbox.git] / lib / PublicInbox / EvCleanup.pm
1 # Copyright (C) 2016 all contributors <meta@public-inbox.org>
2 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
3
4 # event cleanups (currently for Danga::Socket)
5 package PublicInbox::EvCleanup;
6 use strict;
7 use warnings;
8
9 my $asapq = { queue => [], timer => undef };
10 my $laterq = { queue => [], timer => undef };
11
12 sub _run_all ($) {
13         my ($q) = @_;
14
15         my $run = $q->{queue};
16         $q->{queue} = [];
17         $q->{timer} = undef;
18         $_->() foreach @$run;
19 }
20
21 sub _run_asap () { _run_all($asapq) }
22 sub _run_later () { _run_all($laterq) }
23
24 sub asap ($) {
25         my ($cb) = @_;
26         push @{$asapq->{queue}}, $cb;
27         $asapq->{timer} ||= Danga::Socket->AddTimer(0, *_run_asap);
28 }
29
30 sub later ($) {
31         my ($cb) = @_;
32         push @{$laterq->{queue}}, $cb;
33         $laterq->{timer} ||= Danga::Socket->AddTimer(60, *_run_later);
34 }
35
36 END {
37         _run_asap();
38         _run_later();
39 }
40
41 1;