… | |
… | |
12 | so that it cede's more often. Some applications (such as the Deliantra |
12 | so that it cede's more often. Some applications (such as the Deliantra |
13 | game server) sometimes need to load large Storable objects without |
13 | game server) sometimes need to load large Storable objects without |
14 | blocking the server for a long time. |
14 | blocking the server for a long time. |
15 | |
15 | |
16 | This is being implemented by using a perlio layer that feeds only small |
16 | This is being implemented by using a perlio layer that feeds only small |
17 | amounts of data (1024 bytes per call) into Storable, and C<Coro::cede>'ing |
17 | amounts of data (4096 bytes per call) into Storable, and C<Coro::cede>'ing |
18 | regularly (at most 50 times per second by default, though). |
18 | regularly (at most 100 times per second by default, though). |
19 | |
19 | |
20 | As it seems that Storable is not reentrant, this module also wraps most |
20 | As Storable is not reentrant, this module also wraps most functions of the |
21 | functions of the Storable module so that only one freeze or thaw is done |
21 | Storable module so that only one freeze or thaw is done at any one moment |
22 | at any one moment (recursive invocations are not currently supported). |
22 | (and recursive invocations are not currently supported). |
23 | |
23 | |
24 | =head1 FUNCTIONS |
24 | =head1 FUNCTIONS |
25 | |
25 | |
26 | =over 4 |
26 | =over 4 |
27 | |
27 | |
… | |
… | |
29 | |
29 | |
30 | Retrieve an object from the given $pst, which must have been created with |
30 | Retrieve an object from the given $pst, which must have been created with |
31 | C<Coro::Storable::freeze> or C<Storable::store_fd>/C<Storable::store> |
31 | C<Coro::Storable::freeze> or C<Storable::store_fd>/C<Storable::store> |
32 | (sorry, but Storable uses incompatible formats for disk/mem objects). |
32 | (sorry, but Storable uses incompatible formats for disk/mem objects). |
33 | |
33 | |
34 | This works by calling C<Coro::cede> for every 4096 bytes read in. |
34 | This function will cede regularly. |
35 | |
35 | |
36 | =item $pst = freeze $ref |
36 | =item $pst = freeze $ref |
37 | |
37 | |
38 | Freeze the given scalar into a Storable object. It uses the same format as |
38 | Freeze the given scalar into a Storable object. It uses the same format as |
39 | C<Storable::store_fd>. |
39 | C<Storable::store_fd>. |
40 | |
40 | |
41 | This works by calling C<Coro::cede> for every write that Storable |
41 | This functino will cede regularly. |
42 | issues. Unfortunately, Storable often makes many very small writes, so it |
|
|
43 | is rather inefficient. But it does keep the latency low. |
|
|
44 | |
42 | |
45 | =item $pst = nfreeze $ref |
43 | =item $pst = nfreeze $ref |
46 | |
44 | |
47 | Same as C<freeze> but is compatible to C<Storable::nstore_fd> (note the |
45 | Same as C<freeze> but is compatible to C<Storable::nstore_fd> (note the |
48 | C<n>). |
46 | C<n>). |
… | |
… | |
51 | |
49 | |
52 | Same as C<freeze> but is guaranteed to block. This is useful e.g. in |
50 | Same as C<freeze> but is guaranteed to block. This is useful e.g. in |
53 | C<Coro::Util::fork_eval> when you want to serialise a data structure |
51 | C<Coro::Util::fork_eval> when you want to serialise a data structure |
54 | for use with the C<thaw> function for this module. You cannot use |
52 | for use with the C<thaw> function for this module. You cannot use |
55 | C<Storable::freeze> for this as Storable uses incompatible formats for |
53 | C<Storable::freeze> for this as Storable uses incompatible formats for |
56 | memory and file images. |
54 | memory and file images, and this module uses file images. |
57 | |
55 | |
58 | =item $pst = blocking_nfreeze $ref |
56 | =item $pst = blocking_nfreeze $ref |
59 | |
57 | |
60 | Same as C<blocking_freeze> but uses C<nfreeze> internally. |
58 | Same as C<blocking_freeze> but uses C<nfreeze> internally. |
61 | |
59 | |
62 | =item $guard = guard |
60 | =item $guard = guard |
63 | |
61 | |
64 | Acquire the Storable lock, for when you want to call Storable yourself. |
62 | Acquire the Storable lock, for when you want to call Storable yourself. |
65 | |
63 | |
66 | Note that this module already wraps the Storable functions, so there is |
64 | Note that this module already wraps all Storable functions, so there is |
67 | rarely the need to do this yourself. |
65 | rarely the need to do this yourself. |
68 | |
66 | |
69 | =back |
67 | =back |
70 | |
68 | |
71 | =cut |
69 | =cut |
… | |
… | |
88 | use base "Exporter"; |
86 | use base "Exporter"; |
89 | |
87 | |
90 | our $VERSION = 4.748; |
88 | our $VERSION = 4.748; |
91 | our @EXPORT = qw(thaw freeze nfreeze blocking_thaw blocking_freeze blocking_nfreeze); |
89 | our @EXPORT = qw(thaw freeze nfreeze blocking_thaw blocking_freeze blocking_nfreeze); |
92 | |
90 | |
93 | our $GRANULARITY = 0.02; |
91 | our $GRANULARITY = 0.01; |
94 | |
92 | |
95 | my $lock = new Coro::Semaphore; |
93 | my $lock = new Coro::Semaphore; |
96 | |
94 | |
97 | sub guard { |
95 | sub guard { |
98 | $lock->guard |
96 | $lock->guard |