$main_folder = '/u/preport/preport'; $lockfile = "$main_folder.lock"; $ticket = "$main_folder.ticket"; sub get_ticket { my($ticket_no); my($wait); # Wait for semaphore: $wait = "true"; while ($wait) { # Wait for semaphore to be released (if set): while (-f $lockfile) { sleep(5); } # When semaphore is gone, create own one: unless (open(LOCKFILE, ">>$lockfile")) { unlink($lockfile); warn "$self: can't write semaphore '$lockfile': $!\n"; return(undef); } print LOCKFILE "$$\n"; close(LOCKFILE); # Check wether semaphore is our's or was created # in the meantime by another program: unless (open(LOCKFILE, "<$lockfile")) { unlink($lockfile); warn "$self: can't read semaphore '$lockfile': $!\n"; return(undef); } $_ = ; chop; close(LOCKFILE); # Loop if semaphore isn't our's: $wait = ($_ != $$); if ($wait) { warn "Semaphore access conflict detected!\n"; warn "Waiting for other process to terminate.\n"; } } # Get next ticket number: $ticket_no = ''; unless (open(TICKET, "<$ticket")) { unlink($lockfile); warn "$self: can't read '$ticket': $!\n"; return(undef); } while () { chop; if (/^\d+$/) { $ticket_no = $_; } } close(TICKET); if ($ticket_no eq '') { unlink($lockfile); warn "$self: no ticket number in '$ticket'!\n"; return(undef); } $ticket_no++; if ($ticket_no > 9999) { $ticket_no = '0000'; } unless (open(TICKET, ">$ticket")) { unlink($lockfile); warn "$self: can't write '$ticket': $!\n"; return(undef); } print TICKET "$ticket_no\n"; close(TICKET); # Release semaphore: unlink($lockfile); return($ticket_no); }