… | |
… | |
30 | } |
30 | } |
31 | |
31 | |
32 | [keys %exit] |
32 | [keys %exit] |
33 | } |
33 | } |
34 | |
34 | |
35 | my %MAP_EXITS; |
35 | my @PREFETCH; |
36 | my %MAP_TIMEOUT; |
36 | my %MAP_TIMEOUT; |
37 | |
37 | |
38 | sub on_mapenter { |
38 | sub prefetch; |
39 | my ($ob) = @_; |
39 | sub 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 | |
|
|
68 | my %MAP_EXITS; |
|
|
69 | |
|
|
70 | sub 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 | |
67 | sub on_clock { |
79 | sub on_clock { |
68 | # boy how I hate polling |
80 | # boy how I hate polling |
69 | IO::AIO::poll_cb; |
81 | IO::AIO::poll_cb; |