[PATCH for discussion only] New event API (RHBZ#664558).
It's not too clear from the patch, so I have also extracted the new API from <guestfs.h> and the relevant section of the man page. Rich. ---------------------------------------------------------------------- /* Events. */ #define GUESTFS_EVENT_CLOSE 0x0001 #define GUESTFS_EVENT_SUBPROCESS_QUIT 0x0002 #define GUESTFS_EVENT_LAUNCH_DONE 0x0004 #define GUESTFS_EVENT_PROGRESS 0x0008 #define GUESTFS_EVENT_APPLIANCE 0x0010 #define GUESTFS_EVENT_LIBRARY 0x0020 #define GUESTFS_EVENT_TRACE 0x0040 #define GUESTFS_EVENT_ALL UINT64_MAX #ifndef GUESTFS_TYPEDEF_EVENT_CALLBACK #define GUESTFS_TYPEDEF_EVENT_CALLBACK 1 typedef void (*guestfs_event_callback) ( guestfs_h *g, void *opaque, uint64_t event, int event_handle, int flags, const char *buf, size_t buf_len, const uint64_t *array, size_t array_len); #endif #define LIBGUESTFS_HAVE_SET_EVENT_CALLBACK 1 int guestfs_set_event_callback (guestfs_h *g, guestfs_event_callback cb, uint64_t event_bitmask, int flags, void *opaque); #define LIBGUESTFS_HAVE_DELETE_EVENT_CALLBACK 1 void guestfs_delete_event_callback (guestfs_h *g, int event_handle); ---------------------------------------------------------------------- SETTING CALLBACKS TO HANDLE EVENTS Note: This section documents the new-style event mechanism, which you should use in new code if possible. The old functions "guestfs_set_log_message_callback", "guestfs_set_subprocess_quit_callback", "guestfs_set_launch_done_callback", "guestfs_set_close_callback" and "guestfs_set_progress_callback" are no longer documented in this manual page. Handles generate events when certain things happen, such as log messages being generated, progress messages during long-running operations, or the handle being closed. The API calls described below let you register a callback to be called when events happen. You can register multiple callbacks (for the same, different or overlapping sets of events), and individually remove callbacks. If callbacks are not removed, then they remain in force until the handle is closed. In the current implementation, events are only generated synchronously: that means that events (and hence callbacks) can only happen while you are in the middle of making another libguestfs call. The callback is called in the same thread. Events may contain a payload, usually nothing (void), an array of 64 bit unsigned integers, or a message buffer. Payloads are discussed later on. CLASSES OF EVENTS GUESTFS_EVENT_CLOSE (payload type: void) The callback function will be called while the handle is being closed (synchronously from "guestfs_close"). Note that libguestfs installs an atexit(3) handler to try to clean up handles that are open when the program exits. This means that this callback might be called indirectly from exit(3), which can cause unexpected problems in higher-level languages (eg. if your HLL interpreter has already been cleaned up by the time this is called, and if your callback then jumps into some HLL function). If no callback is registered: the handle is closed without any callback being invoked. GUESTFS_EVENT_SUBPROCESS_QUIT (payload type: void) The callback function will be called when the child process quits, either asynchronously or if killed by "guestfs_kill_subprocess". (This corresponds to a transition from any state to the CONFIG state). If no callback is registered: the event is ignored. GUESTFS_EVENT_LAUNCH_DONE (payload type: void) The callback function will be called when the child process becomes ready first time after it has been launched. (This corresponds to a transition from LAUNCHING to the READY state). If no callback is registered: the event is ignored. GUESTFS_EVENT_PROGRESS (payload type: array of 4 x uint64_t) Some long-running operations can generate progress messages. If this callback is registered, then it will be called each time a progress message is generated (usually two seconds after the operation started, and three times per second thereafter until it completes, although the frequency may change in future versions). The callback receives in the payload four unsigned 64 bit numbers which are (in order): "proc_nr", "serial", "position", "total". The units of "total" are not defined, although for some operations "total" may relate in some way to the amount of data to be transferred (eg. in bytes or megabytes), and "position" may be the portion which has been transferred. The only defined and stable parts of the API are: · The callback can display to the user some type of progress bar or indicator which shows the ratio of "position":"total". · 0 <= "position" <= "total" · If any progress notification is sent during a call, then a final progress notification is always sent when "position" = "total". This is to simplify caller code, so callers can easily set the progress indicator to "100%" at the end of the operation, without requiring special code to detect this case. The callback also receives the procedure number ("proc_nr") and serial number ("serial") of the call. These are only useful for debugging protocol issues, and the callback can normally ignore them. The callback may want to print these numbers in error messages or debugging messages. If no callback is registered: progress messages are discarded. GUESTFS_EVENT_APPLIANCE (payload type: message buffer) The callback function is called whenever a log message is generated by qemu, the appliance kernel, guestfsd (daemon), or utility programs. If the verbose flag ("guestfs_set_verbose") is set before launch ("guestfs_launch") then additional debug messages are generated. If no callback is registered: the messages are discarded unless the verbose flag is set in which case they are sent to stderr. You can override the printing of verbose messages to stderr by setting up a callback. GUESTFS_EVENT_LIBRARY (payload type: message buffer) The callback function is called whenever a log message is generated by the library part of libguestfs. If the verbose flag ("guestfs_set_verbose") is set then additional debug messages are generated. If no callback is registered: the messages are discarded unless the verbose flag is set in which case they are sent to stderr. You can override the printing of verbose messages to stderr by setting up a callback. GUESTFS_EVENT_TRACE (payload type: message buffer) The callback function is called whenever a trace message is generated. This only applies if the trace flag ("guestfs_set_trace") is set. If no callback is registered: the messages are discarded unless the verbose flag is set in which case they are sent to stderr. You can override the printing of verbose messages to stderr by setting up a callback. guestfs_set_event_callback int guestfs_set_event_callback (guestfs_h *g, guestfs_event_callback cb, uint64_t event_bitmask, int flags, void *opaque); This function registers a callback ("cb") for all event classes in the "event_bitmask". For example, to register for all log message events, you could call this function with the bitmask "GUESTFS_EVENT_APPLIANCE|GUESTFS_EVENT_LIBRARY". To register a single callback for all possible classes of events, use "GUESTFS_EVENT_ALL". "flags" should always be passed as 0. "opaque" is an opaque pointer which is passed to the callback. You can use it for any purpose. The return value is the event handle (an integer) which you can use to delete the callback (see below). If there is an error, this function returns "-1", and sets the error in the handle in the usual way (see "guestfs_last_error" etc.) Callbacks remain in effect until they are deleted, or until the handle is closed. In the case where multiple callbacks are registered for a particular event class, all of the callbacks are called. The order in which multiple callbacks are called is not defined. guestfs_delete_event_callback void guestfs_delete_event_callback (guestfs_h *g, int event_handle); Delete a callback that was previously registered. "event_handle" should be the integer that was returned by a previous call to "guestfs_set_event_callback" on the same handle. guestfs_event_callback typedef void (*guestfs_event_callback) ( guestfs_h *g, void *opaque, uint64_t event, int event_handle, int flags, const char *buf, size_t buf_len, const uint64_t *array, size_t array_len); This is the type of the event callback function that you have to provide. The basic parameters are: the handle ("g"), the opaque user pointer ("opaque"), the event class (eg. "GUESTFS_EVENT_PROGRESS"), the event handle, and "flags" which in the current API you should ignore. The remaining parameters contain the event payload (if any). Each event may contain a payload, which usually relates to the event class, but for future proofing your code should be written to handle any payload for any event class. "buf" and "buf_len" contain a message buffer (if "buf_len == 0", then there is no message buffer). Note that this message buffer can contain arbitrary 8 bit data, including NUL bytes. "array" and "array_len" is an array of 64 bit unsigned integers. At the moment this is only used for progress messages. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming blog: http://rwmj.wordpress.com Fedora now supports 80 OCaml packages (the OPEN alternative to F#) http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora
API is still the same as in the previous message. This just continues with the implementation. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones virt-top is 'top' for virtual machines. Tiny program with many powerful monitoring features, net stats, disk stats, logging, etc. http://et.redhat.com/~rjones/virt-top
Proposed 4-patch set to implement the new event API. OCaml and Perl bindings done, Ruby bindings are still to be done. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones New in Fedora 11: Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 70 libraries supprt'd http://fedoraproject.org/wiki/MinGW http://www.annexia.org/fedora_mingw
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones New in Fedora 11: Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 70 libraries supprt'd http://fedoraproject.org/wiki/MinGW http://www.annexia.org/fedora_mingw
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into Xen guests. http://et.redhat.com/~rjones/virt-p2v
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into Xen guests. http://et.redhat.com/~rjones/virt-p2v
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones virt-df lists disk usage of guests without needing to install any software inside the virtual machine. Supports Linux and Windows. http://et.redhat.com/~rjones/virt-df/
This patch series is ready to go ... Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones virt-top is 'top' for virtual machines. Tiny program with many powerful monitoring features, net stats, disk stats, logging, etc. http://et.redhat.com/~rjones/virt-top
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones virt-df lists disk usage of guests without needing to install any software inside the virtual machine. Supports Linux and Windows. http://et.redhat.com/~rjones/virt-df/
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones New in Fedora 11: Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 70 libraries supprt'd http://fedoraproject.org/wiki/MinGW http://www.annexia.org/fedora_mingw
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming blog: http://rwmj.wordpress.com Fedora now supports 80 OCaml packages (the OPEN alternative to F#) http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming blog: http://rwmj.wordpress.com Fedora now supports 80 OCaml packages (the OPEN alternative to F#) http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones virt-top is 'top' for virtual machines. Tiny program with many powerful monitoring features, net stats, disk stats, logging, etc. http://et.redhat.com/~rjones/virt-top
participants (1)
-
Richard W.M. Jones