On 03/08/2011 07:45 AM, Avi Kivity wrote:
On 03/08/2011 03:35 PM, Anthony Liguori wrote:
On 03/08/2011 05:12 AM, Avi Kivity wrote:
On 03/07/2011 05:59 PM, Anthony Liguori wrote:
How do async commands work? You mentioned them when talking about
QAPI but it's not obvious to me that there is any "native" support
for
async commands?
Async commands are interesting..
Would there be anything in them other than starting each command in
its own thread? If it then drops the right locks it can execute in
parallel with other commands, if it doesn't, then it's synchronous
(and presumably doesn't depend on external or guest events).
I've implemented them (for virt-agent) and I'll have it in v2 of
round 1.
I use callbacks. If a function is marked to be async, it generates a
signature like:
typedef void (GuestViewFileCompletionFunc)(void *qmp__opaque, const
char * qmp__retval, Error *qmp__err);
void qmp_guest_view_file(const char * filename, Error **err,
GuestViewFileCompletionFunc *qmp__cc, void *qmp__opaque);
The handler just needs to squirrel away qmp__cc and qmp__opaque and
call it whenever the command completes.
Okay. My preference would be threads, but we can always start with
one model and use adapters to switch to another.
(and instead of an opaque/func pair, I'd do
typedef struct GuestViewFileCompletion {
void (*complete)(struct GuestViewFileCompletion *gvfc);
} GuestViewFileCompletion;
so there's less squirrelling and more type-safetying.
)
The opaque is a bit nicer to use because instead of having to generate
another structure with this embedded, I can just pass the command state
directly.
That said, once I get this all working nicely, I'll take a look at using
a structure and see whether it makes it uglier. I do prefer the
embedded struct.
(and gah, do we really need a vfs/rpc in qemu?)
Fun, eh :-) Unfortunately, our friends at VMware provide a
VixVM_CopyFileFromGuestToHost API so there's an expectation that we
provide a similar interface.
Regards,
Anthony Liguori