The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# low priority task queue which limits jobs (currently MD5 digest requests)
package Mogstored::TaskQueue;
use fields (
            'active',  # number of active tasks
            'max',     # maximum active tasks before deferring to pending
            'pending', # pending code refs for execution
           );

sub new {
    my Mogstored::TaskQueue $self = shift;
    $self = fields::new($self) unless ref $self;
    $self->{active} = 0;
    $self->{max} = 1;
    $self->{pending} = [];
    $self;
}

sub run {
    my ($self, $task) = @_;

    if ($self->{active} < $self->{max}) {
        $self->{active}++;
        $task->();
    } else {
        push @{$self->{pending}}, $task;
    }
}

sub task_done {
    my $self = shift;

    $self->{active}--;
    if ($self->{active} < $self->{max}) {
        my $task = shift @{$self->{pending}};
        if ($task) {
            $self->{active}++;
            $task->();
        }
    }
}

1;