ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/maps/perl/map-prefetch.ext
(Generate patch)

Comparing deliantra/maps/perl/map-prefetch.ext (file contents):
Revision 1.4 by root, Mon Jun 26 15:44:47 2006 UTC vs.
Revision 1.5 by root, Tue Jun 27 18:22:14 2006 UTC

30 } 30 }
31 31
32 [keys %exit] 32 [keys %exit]
33} 33}
34 34
35my %MAP_EXITS; 35my @PREFETCH;
36my %MAP_TIMEOUT; 36my %MAP_TIMEOUT;
37 37
38sub on_mapenter { 38sub prefetch;
39 my ($ob) = @_; 39sub prefetch {
40 while (my $path = shift @PREFETCH) {
41 my $NOW = Time::HiRes::time;
40 42
41 my $exit = $MAP_EXITS{$ob->map->path} ||= find_exits $ob->map; 43 next if $MAP_TIMEOUT{$path} > $NOW;
42 44
43 my $NOW = Time::HiRes::time; 45 $MAP_TIMEOUT{$path} = $NOW + 60 + rand 60;
44
45 for my $path (@$exit) {
46 next if $MAP_TIMEOUT{$path} > $NOW;
47 46
48 if (my $map = cf::map::has_been_loaded $path) { 47 if (my $map = cf::map::has_been_loaded $path) {
49 next if $map->in_memory == cf::MAP_IN_MEMORY; 48 next if $map->in_memory == cf::MAP_IN_MEMORY;
50 49
51 $path = $map->tmppath if $map->in_memory == cf::MAP_SWAPPED; 50 $path = $map->tmppath if $map->in_memory == cf::MAP_SWAPPED;
52 } 51 }
53 52
54 $MAP_TIMEOUT{$path} = $NOW + 60 + rand 60;
55
56 aio_open $path, O_RDONLY, 0, sub { 53 aio_open $path, O_RDONLY, 0, sub {
57 my ($fh) = @_ 54 my $fh = shift
58 or return; 55 or return;
59 aio_readahead $fh, 0, -s $fh, sub { 56 aio_readahead $fh, 0, -s $fh, sub {
60 my $time = Time::HiRes::time - $NOW; 57 my $time = Time::HiRes::time - $NOW;
61 warn "LONG PREFETCH $path $time\n" if $time > 0.3; 58 warn "LONG PREFETCH $path $time\n" if $time > 0.3;
59
60 prefetch;
62 }; 61 };
63 }; 62 };
63
64 last;
64 } 65 }
66}
67
68my %MAP_EXITS;
69
70sub on_mapenter {
71 my ($ob) = @_;
72
73 my $exit = $MAP_EXITS{$ob->map->path} ||= find_exits $ob->map;
74
75 push @PREFETCH, @$exit;
76 prefetch;
65} 77}
66 78
67sub on_clock { 79sub on_clock {
68 # boy how I hate polling 80 # boy how I hate polling
69 IO::AIO::poll_cb; 81 IO::AIO::poll_cb;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines