use strict;
no strict qw(refs);
+use threads;
+use threads::shared;
+
use Carp;
local $SIG{'__WARN__'} = \&Carp::cluck;
use Fcntl qw(:mode);
use POSIX;
-my $fioc_size = 0;
+my $fioc_size :shared = 0;
use constant FIOC_NAME => 'fioc';
-my $fioc_buf = '';
+my $fioc_buf :shared = '';
use constant FIOC_NONE => 0;
use constant FIOC_ROOT => 1;
use constant FIOC_FILE => 2;
my ($size) = @_;
print 'called ', (caller(0))[3], "\n";
return 0 if $size == $fioc_size;
-
+
if ($size < $fioc_size) {
$fioc_buf = substr($fioc_buf, 0, $size);
}
sub fioc_write {
my ($path, $data, $offset) = @_;
print 'called ', (caller(0))[3], "\n";
+ lock($fioc_buf);
return -&EINVAL if fioc_file_type($path) != FIOC_FILE;
sub fioc_truncate {
my ($path, $size) = @_;
print 'called ', (caller(0))[3], "\n";
+ lock($fioc_buf);
return -&EINVAL if fioc_file_type($path) != FIOC_FILE;
return(0, pack('L', $fioc_size));
}
elsif ($cmd == FIOC_SET_SIZE) {
+ lock($fioc_buf);
fioc_resize(unpack('L', $data));
return 0;
}
'open' => 'main::fioc_open',
'read' => 'main::fioc_read',
'write' => 'main::fioc_write',
- 'ioctl' => 'main::fioc_ioctl');
+ 'ioctl' => 'main::fioc_ioctl',
+ 'threaded' => 1);