IPC-DirQueue
view release on metacpan or search on metacpan
lib/IPC/DirQueue.pm view on Meta::CPAN
# E | enq enq |
# D | stat pickup_queued_job |
# the enqueuer process E enqueues a job just after the stat, inside the
# 1-second period "t". dequeuer process D dequeues it with
# pickup_queued_job(). all is well. But then, E enqueues another job
# inside the same 1-second period "t", and since the stat() has already
# happened for "t", and since we've already picked up the job in "t", we
# don't recheck; result is, we miss this enqueue event.
#
# Avoid this by checking in a busy-loop until time(2) says we're out of
# that "danger zone" 1-second period. Any further enq's would then
# cause stat(2) to report a different timestamp.
while (time == $qdirlaststat) {
Time::HiRes::usleep ($pollintvl);
dbg "wait_for_queued_job: spinning until time != stat $qdirlaststat";
my $job = $self->pickup_queued_job();
if ($job) { return $job; }
}
( run in 0.239 second using v1.01-cache-2.11-cpan-87723dcf8b7 )