49 lines
711 B
Ruby
49 lines
711 B
Ruby
class File
|
|
def exclusive_lock
|
|
flock File::LOCK_EX
|
|
end
|
|
|
|
def shared_lock
|
|
flock File::LOCK_SH
|
|
end
|
|
|
|
def unblock
|
|
flock File::LOCK_UN
|
|
end
|
|
end
|
|
|
|
class FileQueue
|
|
attr_reader :file, :size
|
|
alias to_io file
|
|
|
|
def initialize file, size = 16
|
|
@file = case file
|
|
when File then file
|
|
else File.open file, 'a+'
|
|
end
|
|
@size, @pack = size, "A#{size}"
|
|
end
|
|
|
|
def push *a
|
|
f = @file
|
|
f.seek 0, IO::SEEK_END
|
|
f.exclusive_lock
|
|
f.write a.pack( @pack*a.length)
|
|
f.unblock
|
|
end
|
|
|
|
def pop
|
|
f = @file
|
|
f.rewind
|
|
f.exclusive_lock
|
|
s = f.read( @size).unpack( 'L')[0]
|
|
f.rewind
|
|
f.write [s.succ].pack( 'L')
|
|
f.sync
|
|
f.shared_lock
|
|
f.pos = s
|
|
f.read( @size).unpack( 'L')[0]
|
|
f.unblock
|
|
end
|
|
end
|