view tools/xenstore/xenstored_watch.h @ 5867:932fc8a1b38d

# HG changeset patch
# User Rusty Russell <rusty@rustcorp.com.au>
# Node ID a92163adedcfcff0d05c965d09da747f3c8aa13e
# Parent 63ab20781afa311300f3a8e832744292014ea7f6

Remove ill-conceived concept of watches blocking reply on connection which did write/mkdir/rm/setperm etc.
This causes deadlocks in real life, and I can't see a sane way of avoiding them: it is reasonable for someone to ignore watch notifications while doing other actions, and that means that we can do other writes. These writes can block pending other watchers; if one of these is the process blocked awaiting our ack, we deadlock.

diff -r 63ab20781afa -r a92163adedcf tools/xenstore/xenstored_core.c
author cl349@firebug.cl.cam.ac.uk
date Tue Jul 26 13:11:01 2005 +0000 (2005-07-26)
parents a83ac0806d6b
children 997b2b07b96d
line source
1 /*
2 Watch code for Xen Store Daemon.
3 Copyright (C) 2005 Rusty Russell IBM Corporation
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
23 #include "xenstored_core.h"
25 bool do_watch(struct connection *conn, struct buffered_data *in);
26 bool do_watch_ack(struct connection *conn, const char *token);
27 bool do_unwatch(struct connection *conn, struct buffered_data *in);
29 /* Is this a watch event message for this connection? */
30 bool is_watch_event(struct connection *conn, struct buffered_data *out);
32 /* Look through our watches: if any of them have an event, queue it. */
33 void queue_next_event(struct connection *conn);
35 /* Fire all watches: recurse means all the children are effected (ie. rm) */
36 void fire_watches(struct transaction *trans, const char *node, bool recurse);
38 /* Find shortest timeout: if any, reduce tv (may already be set). */
39 void shortest_watch_ack_timeout(struct timeval *tv);
41 /* Check for watches which may have timed out. */
42 void check_watch_ack_timeout(void);
44 void dump_watches(struct connection *conn);
46 #endif /* _XENSTORED_WATCH_H */