On 8/14/19 2:31 PM, Richard W.M. Jones wrote:
In this patch series we use the newly introduced free callback on the completion function to dererence the OCaml NBD.Buffer. I will make the same kind of change for Python later in a separate series.
The completion function is always called at the C level, even if the OCaml program didn't use the optional argument. That's because the free callback doesn't run otherwise.
There is a case for having the free callback run even if there is no registered callback:
nbd_aio_pread (nbd, buf, sizeof buf, 0, (nbd_completion_callback) { .callback = NULL, .free = completion_free },
Presumably you'd also want some .user_data there? If we are going to insist on a non-NULL .callback when .free is non-NULL, that should probably be enforced by the generator for OClosure (we are already ensured non-NULL .callback for Closure).
0);
but the semantics of that are a bit weird. Why would you need to "free" a callback which doesn't exist? Would it be correct for the library to free the callback immediately, rather than after the theoretical completion callback would have run?
I could live with 'if .free is non-NULL, free(user_data) is called after the point that callback would be used, regardless of whether .callback was NULL'. Perhaps my idea of consolidating free callbacks into just retirement code will make that easier (because then we don't have the mess of whether .callback has to be changed to NULL on the fly to track whether .free still needs to be called; instead we set .free to NULL once it is done). -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3226 Virtualization: qemu.org | libvirt.org