ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/Storable.pm
Revision: 1.106
Committed: Mon Mar 16 11:12:52 2020 UTC (4 years, 2 months ago) by root
Branch: MAIN
CVS Tags: rel-6_57, HEAD
Changes since 1.105: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 =head1 NAME
2
3 Coro::Storable - offer a more fine-grained Storable interface
4
5 =head1 SYNOPSIS
6
7 use Coro::Storable;
8
9 =head1 DESCRIPTION
10
11 This module implements a few functions from the Storable module in a way
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
14 blocking the server for a long time.
15
16 This is being implemented by using a perlio layer that feeds only small
17 amounts of data (4096 bytes per call) into Storable, and C<Coro::cede>'ing
18 regularly (at most 100 times per second by default, though).
19
20 As Storable is not reentrant, this module also wraps most functions of the
21 Storable module so that only one freeze or thaw is done at any one moment
22 (and recursive invocations are not currently supported).
23
24 =head1 FUNCTIONS
25
26 =over 4
27
28 =item $ref = thaw $pst
29
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>
32 (sorry, but Storable uses incompatible formats for disk/mem objects).
33
34 This function will cede regularly.
35
36 =item $pst = freeze $ref
37
38 Freeze the given scalar into a Storable object. It uses the same format as
39 C<Storable::store_fd>.
40
41 This functino will cede regularly.
42
43 =item $pst = nfreeze $ref
44
45 Same as C<freeze> but is compatible to C<Storable::nstore_fd> (note the
46 C<n>).
47
48 =item $pst = blocking_freeze $ref
49
50 Same as C<freeze> but is guaranteed to block. This is useful e.g. in
51 C<Coro::Util::fork_eval> when you want to serialise a data structure
52 for use with the C<thaw> function for this module. You cannot use
53 C<Storable::freeze> for this as Storable uses incompatible formats for
54 memory and file images, and this module uses file images.
55
56 =item $pst = blocking_nfreeze $ref
57
58 Same as C<blocking_freeze> but uses C<nfreeze> internally.
59
60 =item $guard = guard
61
62 Acquire the Storable lock, for when you want to call Storable yourself.
63
64 Note that this module already wraps all Storable functions, so there is
65 rarely the need to do this yourself.
66
67 =back
68
69 =cut
70
71 package Coro::Storable;
72
73 use common::sense;
74
75 use Coro ();
76 use Coro::Semaphore ();
77
78 BEGIN {
79 # suppress warnings
80 local $^W = 0;
81 require Storable;
82 }
83
84 use Storable;
85 use base "Exporter";
86
87 our $VERSION = 6.57;
88 our @EXPORT = qw(thaw freeze nfreeze blocking_thaw blocking_freeze blocking_nfreeze);
89
90 our $GRANULARITY = 0.01;
91
92 my $lock = new Coro::Semaphore;
93
94 sub guard {
95 $lock->guard
96 }
97
98 # wrap xs functions
99 for (qw(net_pstore pstore net_mstore mstore pretrieve mretrieve dclone)) {
100 my $orig = \&{"Storable::$_"};
101 *{"Storable::$_"} = eval 'sub (' . (prototype $orig) . ') {
102 my $guard = $lock->guard;
103 &$orig
104 }';
105 die if $@;
106 }
107
108 sub thaw($) {
109 open my $fh, "<:cede($GRANULARITY)", \$_[0]
110 or die "cannot open pst via PerlIO::cede: $!";
111 Storable::fd_retrieve $fh
112 }
113
114 sub freeze($) {
115 open my $fh, ">:cede($GRANULARITY)", \my $buf
116 or die "cannot open pst via PerlIO::cede: $!";
117 Storable::store_fd $_[0], $fh;
118 close $fh;
119
120 $buf
121 }
122
123 sub nfreeze($) {
124 open my $fh, ">:cede($GRANULARITY)", \my $buf
125 or die "cannot open pst via PerlIO::cede: $!";
126 Storable::nstore_fd $_[0], $fh;
127 close $fh;
128
129 $buf
130 }
131
132 sub blocking_thaw($) {
133 open my $fh, "<", \$_[0]
134 or die "cannot open pst: $!";
135 Storable::fd_retrieve $fh
136 }
137
138 sub blocking_freeze($) {
139 open my $fh, ">", \my $buf
140 or die "cannot open pst: $!";
141 Storable::store_fd $_[0], $fh;
142 close $fh;
143
144 $buf
145 }
146
147 sub blocking_nfreeze($) {
148 open my $fh, ">", \my $buf
149 or die "cannot open pst: $!";
150 Storable::nstore_fd $_[0], $fh;
151 close $fh;
152
153 $buf
154 }
155
156 1;
157
158 =head1 AUTHOR/SUPPORT/CONTACT
159
160 Marc A. Lehmann <schmorp@schmorp.de>
161 http://software.schmorp.de/pkg/Coro.html
162
163 =cut
164
165