AnyEvent-BitTorrent
view release on metacpan or search on metacpan
lib/AnyEvent/BitTorrent.pm view on Meta::CPAN
282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
AE::
log
trace
=>
'Closing %s'
,
$s
->files->[
$i
]->{fh};
flock
$s
->files->[
$i
]->{fh}, LOCK_UN;
close
$s
->files->[
$i
]->{fh};
$s
->files->[
$i
]->{fh} = ();
}
if
(
$m
eq
'r'
) {
AE::
log
trace
=>
'Opening %s to read'
,
$s
->files->[
$i
]->{path};
sysopen
(
$s
->files->[
$i
]->{fh},
$s
->files->[
$i
]->{path}, O_RDONLY)
||
return
;
flock
(
$s
->files->[
$i
]->{fh}, LOCK_SH) ||
return
;
weaken
$s
unless
isweak
$s
;
my
$x
=
$i
;
$s
->files->[
$x
]->{timeout}
= AE::timer(500, 0,
sub
{
$s
//
return
;
$s
->_open(
$x
,
'c'
) });
}
elsif
(
$m
eq
'w'
) {
AE::
log
trace
=>
'Opening %s to write'
,
$s
->files->[
$i
]->{path};
my
@split
= File::Spec->splitdir(
$s
->files->[
$i
]->{path});
pop
@split
;
# File name itself
my
$dir
= File::Spec->catdir(
@split
);
File::Path::mkpath(
$dir
)
if
!-d
$dir
;
sysopen
(
$s
->files->[
$i
]->{fh},
$s
->files->[
$i
]->{path},
O_WRONLY | O_CREAT)
||
return
;
flock
$s
->files->[
$i
]->{fh}, LOCK_EX;
truncate
$s
->files->[
$i
]->{fh},
$s
->files->[
$i
]->{
length
}
if
-s
$s
->files->[
$i
]->{fh}
!=
$s
->files->[
$i
]->{
length
};
# XXX - pre-allocate files
weaken
$s
unless
isweak
$s
;
my
$x
=
$i
;
$s
->files->[
$x
]->{timeout}
= AE::timer(60, 0,
sub
{
$s
//
return
;
$s
->_open(
$x
,
'c'
) });
}
elsif
(
$m
eq
'c'
) {
$s
->files->[
$i
]->{timeout} = () }
else
{
return
}
return
$s
->files->[
$i
]->{mode} =
$m
;
}
has
piece_cache
=> (
is
=>
'ro'
,
isa
=> HashRef,
default
=>
sub
{ {} });
lib/AnyEvent/BitTorrent.pm view on Meta::CPAN
410411412413414415416417418419420421422423424425426427428429430
AE::
log
note
=>
'Failed to open file. Using null chars instead.'
;
}
else
{
sysseek
$s
->files->[
$file_index
]->{fh},
$total_offset
, SEEK_SET;
sysread
$s
->files->[
$file_index
]->{fh},
my
(
$_data
),
$this_read
;
$data
.=
$_data
if
$_data
;
AE::
log
trace
=>
'Read %d bytes of data from file (%d bytes collected so far)'
,
length
$_data
,
length
$data
;
weaken
$s
unless
isweak
$s
;
my
$x
=
$file_index
;
$s
->files->[
$x
]->{timeout}
= AE::timer(500, 0,
sub
{
$s
//
return
;
$s
->_open(
$x
,
'c'
) });
}
$file_index
++;
$length
-=
$this_read
;
AE::
log
trace
=>
'Still need to read %d bytes'
,
$length
;
last
READ
if
not
defined
$s
->files->[
$file_index
];
lib/AnyEvent/BitTorrent.pm view on Meta::CPAN
474475476477478479480481482483484485486487488489490491492493494
AE::
log
trace
=>
'Wrote data to cache...'
;
}
else
{
$s
->_open(
$file_index
,
'w'
);
sysseek
$s
->files->[
$file_index
]->{fh},
$total_offset
, SEEK_SET;
my
$w
=
syswrite
$s
->files->[
$file_index
]->{fh},
substr
$data
, 0,
$this_write
,
''
;
AE::
log
trace
=>
'Wrote %d bytes of data to file (%d bytes left)'
,
$w
,
length
$data
;
weaken
$s
unless
isweak
$s
;
my
$x
=
$file_index
;
$s
->files->[
$x
]->{timeout}
= AE::timer(120, 0,
sub
{
$s
//
return
;
$s
->_open(
$x
,
'c'
) });
}
$file_index
++;
last
WRITE
if
not
defined
$s
->files->[
$file_index
];
$total_offset
= 0;
}
return
length
$data
;
}
lib/AnyEvent/BitTorrent.pm view on Meta::CPAN
115511561157115811591160116111621163116411651166116711681169117011711172117311741175
}
my
$end
=
$start
+
$s
->files->[
$file
]->{
length
};
$start
=
$start
/
$s
->piece_length;
$end
=
$end
/
$s
->piece_length;
(
int
(
$start
) ..
int
$end
+ (
$end
!=
int
(
$end
) ? 0 : +1));
}
sub
_request_pieces {
my
(
$s
,
$p
) =
@_
;
return
if
$s
->state ne
'active'
;
weaken
$p
unless
isweak
$p
;
$p
//
return
;
$p
->{handle} //
return
;
my
@indexes
;
if
(
scalar
keys
%{
$s
->working_pieces} < 10) {
# XXX - Max working pieces
for
my
$findex
(0 .. $
#{$s->files}) {
for
my
$index
(
$s
->_file_to_range(
$findex
)) {
next
if
!(
vec
(
$p
->{bitfield},
$index
, 1)
&& !
vec
(
$s
->bitfield,
$index
, 1));
push
@indexes
,
lib/AnyEvent/BitTorrent.pm view on Meta::CPAN
123312341235123612371238123912401241124212431244124512461247124812491250125112521253
||
$_
->[2] !=
$_block_size
} @{
$p
->{local_requests}}
];
$p
->{timeout} = AE::timer(45, 0,
sub
{
$s
->_del_peer(
$p
->{handle}) });
#$s->_request_pieces( $p) # XXX - Ask a different peer
}
)
];
weaken(
$s
->working_pieces->{
$index
}{
$offset
}[3])
unless
isweak(
$s
->working_pieces->{
$index
}{
$offset
}[3]);
push
@{
$p
->{local_requests}}, [
$index
,
$offset
,
$_block_size
];
}
}
# Cheap callback system
has
on_hash_pass
=> (
is
=>
'rw'
,
isa
=> CodeRef,
default
=>
sub
{
( run in 0.356 second using v1.01-cache-2.11-cpan-e9199f4ba4c )