ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Guard/Guard.pm
(Generate patch)

Comparing Guard/Guard.pm (file contents):
Revision 1.9 by root, Sat Dec 13 18:49:22 2008 UTC vs.
Revision 1.12 by root, Sat Dec 13 18:53:30 2008 UTC

107 107
108See the EXCEPTIONS section for an explanation of how exceptions 108See the EXCEPTIONS section for an explanation of how exceptions
109(i.e. C<die>) are handled inside guard blocks. 109(i.e. C<die>) are handled inside guard blocks.
110 110
111Example: acquire a Coro::Semaphore for a second by registering a 111Example: acquire a Coro::Semaphore for a second by registering a
112timer. The timer callback references the guard used to unlock it again. 112timer. The timer callback references the guard used to unlock it
113again. (Please ignore the fact that C<Coro::Semaphore> has a C<guard>
114method that does this already):
113 115
114 use Guard; 116 use Guard;
115 use AnyEvent; 117 use AnyEvent;
116 use Coro::Semaphore; 118 use Coro::Semaphore;
117 119
131 133
132The advantage of doing this with a guard instead of simply calling C<< 134The advantage of doing this with a guard instead of simply calling C<<
133$sem->down >> in the callback is that you can opt not to create the timer, 135$sem->down >> in the callback is that you can opt not to create the timer,
134or your code can throw an exception before it can create the timer, or you 136or your code can throw an exception before it can create the timer, or you
135can create multiple timers or other event watchers and only when the last 137can create multiple timers or other event watchers and only when the last
136one gets executed will the lock be unlocked. 138one gets executed will the lock be unlocked. Using the C<guard>, you do
139not have to worry about catching all the places where you have to unlock
140the semaphore.
137 141
138=item Guard::cancel $guard 142=item Guard::cancel $guard
139 143
140Calling this function will "disable" the guard object returned by the 144Calling this function will "disable" the guard object returned by the
141C<guard> function, i.e. it will free the BLOCK originally passed to 145C<guard> function, i.e. it will free the BLOCK originally passed to
165Therefore, whenever a guard block throws an exception, it will be caught, 169Therefore, whenever a guard block throws an exception, it will be caught,
166and this module will call the code reference stored in C<$Guard::DIED> 170and this module will call the code reference stored in C<$Guard::DIED>
167(with C<$@> set to the actual exception), which is similar to how most 171(with C<$@> set to the actual exception), which is similar to how most
168event loops handle this case. 172event loops handle this case.
169 173
174The default for C<$Guard::DIED> is to call C<warn "$@">.
175
176The C<$@> variable will be restored to its value before the guard call in
177all cases, so guards will not disturb C<$@> in any way.
178
170The code reference stored in C<$Guard::DIED> should not die (behaviour is 179The code reference stored in C<$Guard::DIED> should not die (behaviour is
171not guaranteed, but right now, the exception will simply be ignored). 180not guaranteed, but right now, the exception will simply be ignored).
172
173The default for C<$Guard::DIED> is to call C<warn "$@">.
174 181
175=head1 AUTHOR 182=head1 AUTHOR
176 183
177 Marc Lehmann <schmorp@schmorp.de> 184 Marc Lehmann <schmorp@schmorp.de>
178 http://home.schmorp.de/ 185 http://home.schmorp.de/

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines