[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6.1 05/11] libxl_qmp: Implementation of libxl__ev_qmp_*
On Tue, Nov 13, 2018 at 04:10:21PM +0000, Ian Jackson wrote: > Anthony PERARD writes ("Re: [PATCH v6.1 05/11] libxl_qmp: Implementation of > libxl__ev_qmp_*"): > > On Tue, Nov 13, 2018 at 01:14:30PM +0000, Ian Jackson wrote: > > But now I realise that `disconnected` would be an illigal state. > > > > What about: > > > > Precondition: !disconnected > > ensure that qmp_ev_callback_writable is been called when needed > > That sounds good, but I think you probably want something more like: > > On entry: connected/..., but with [the ev_fd] maybe Idle > On return: the same state, but with [the ev_fd] Active iff needed > > ? Or whatever else is true. Here is a simpler comment that is true: !disconnected -> same state Even if in this function ev_fd is modified, it needs to be Active on entry, and stay Active on return. But just saying that qmp_state needs to be different than disconnected is enough. > > > > +static int qmp_ev_prepare_cmd(libxl__gc *gc, > > > > + libxl__ev_qmp *ev, > > > > + const char *cmd, > > > > + const libxl__json_object *args) > > > > +{ > > > > + char *buf = NULL; > > > > > > Missing state comment. > > > > Maybe: > > > > Precondition: connecting/connected > > Does it change the state to a new one ? Are the old and new states > pure states as described in the state table, or are they > half-transitioned ? (More on this below.) They are half-transitioned, here is a new comments: on entry: connecting/connected but with `msg` free on return: same state but with `msg` set > > > > +static void qmp_ev_fd_callback(libxl__egc *egc, libxl__ev_fd *ev_fd, > > > > + int fd, short events, short revents) > > > > +{ > > > > > > Missing state comment, although I think the precondition can be easily > > > inferred from the state of ev_fd and the postcondition varies, but > > > would still be nice to discuss it. > > > > This function is the main loop function, so almost everything happen in > > this function. It should not be called directly. So I'm not sure what > > kind of comment would be usefull here. > > The purpose of the state comments is not just to allow verification > that call sites are legal. It is also to allow verification that the > contents of the function is appropriate. > > > Maybe: > > Preconditions: > > `ev_fd` is Active > > this means that `ev` isn't disconnected > > Any allowed internal state transition can happen. > > A user callback may be called, when that happen, the function should > > return. > > You could also write something more discursive. Maybe > > On entry, ev_fd is (of course) Active. The ev_qmp may be in any > state where this is permitted. qmp_ev_fd_callback will do the > work necessary to make progress, depending on the current state, > and make the appropriate state transitions and callbacks. > > ? That sounds fine. Thanks. > > > > +static int qmp_ev_callback_writable(libxl__gc *gc, > > > > + libxl__ev_qmp *ev, int fd) > > > > + /* connected -> waiting_reply > > > > + * the state isn't change otherwise. */ > > > > +{ > > > > > > I don't know what `otherwise' means. Maybe you mean all other states > > > are legal and remain unchanged ? But that does not seem to be > > > likely. Presumably disconnected is ruled out, at least. > > > > If for some random reason this function is called with the state > > disconnected, it would just return. Unless the state is disconnecting > > and tx_buf haven't been cleared yet. > > > > `Otherwise` would be the `otherwise` of haskell, or the `default` of a > > switch case in C. > > > > So a different comment could be: > > Precondition: > > !disconnected > > You are contradicting yourself. You are both stating that this > function may be called in state disconnected, and that it may not. > > But assuming that what you write here in your proposed comment is > true, ... > > > State transition > > connected -> waiting_reply > > * -> state unchange > > on error: disconnected > > The state of the transmiting buffer will be changed. > > ... this looks good. Do I need to say here and everywhere else that on error the new state isn't really disconnected, and that the ev_qmp needs to be cleaned? On one hand, saying that the new state is disconnected means that the ev_qmp functions that only deal with !disconnected, but on the other, the caller still need to call _dispose. > > > > +static int qmp_ev_callback_readable(libxl__egc *egc, > > > > + libxl__ev_qmp *ev, int fd) > > > > + /* on error: * -> disconnected */ > > > > > > Precondition ? And on non-error ? > > > > Here is a more complete comment: > > Precondition: > > !disconnected > > State transition: > > Only the state of the receiving buffer is change on success > > on error: disconnected > > That's good. I would have been happy with: > > !disconnected -> same state (with rx buffer updated) > on error -> disconnected I'll go with that, that looks better and easier to read. Thanks, -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |