On 5/28/19 7:57 AM, Richard W.M. Jones wrote:
By using a special type we can more naturally express flags in
different programming languages. For example OCaml will prefer an
optional argument containing a list of flags, defaulting to the empty
list:
pread [...] ?(flags = [])
---
generator/generator | 66 +++++++++++++++++++++++++-----------
python/t/400-pread.py | 2 +-
python/t/410-pwrite.py | 2 +-
python/t/460-block-status.py | 4 +--
python/t/500-aio-pread.py | 2 +-
python/t/510-aio-pwrite.py | 2 +-
6 files changed, 53 insertions(+), 25 deletions(-)
Definitely nicer than my poor attempt at OCaml hacking :)
@@ -2494,6 +2495,21 @@ let generate_lib_states_c () =
(* Generate C API. *)
+(* Check the API definition. *)
+let () =
+ (* Flags must only appear once in the final argument position. *)
+ List.iter (
+ fun (name, { args }) ->
+ let args = List.rev args in
+ match args with
+ | [] -> ()
+ | Flags _ :: xs
+ | xs ->
+ if List.exists (function Flags _ -> true | _ -> false) xs then
+ failwithf "%s: Flags must appear in final argument position only"
+ name
+ ) handle_calls
+
And this part is nice (even if I'm having to read up on quite a bit of
documentation to understand how it works)
+++ b/python/t/400-pread.py
@@ -20,7 +20,7 @@ import nbd
h = nbd.NBD ()
h.connect_command (["nbdkit", "-s", "--exit-with-parent",
"-v",
"pattern", "size=512"])
-buf = h.pread (512, 0, 0)
+buf = h.pread (512, 0)
At any rate, you achieved the same goal I had in mind for omitting a 0
flags argument in Python.
print ("%r" % buf)
diff --git a/python/t/410-pwrite.py b/python/t/410-pwrite.py
index 9152ba2..811f233 100644
--- a/python/t/410-pwrite.py
+++ b/python/t/410-pwrite.py
@@ -33,7 +33,7 @@ h = nbd.NBD ()
h.connect_command (["nbdkit", "-s", "--exit-with-parent",
"-v",
"file", datafile])
h.pwrite (buf1, 0, nbd.CMD_FLAG_FUA)
There's still the question of how to pass two flags at once; if I
understand your patch (and after confirming it with nbdsh), we have to
write:
h.zero (64*1024, 0, nbd.CMD_FLAG_FUA | nbd.CMD_FLAG_NO_HOLE)
[side note - requires a server that supports flush; to my surprise,
nbkdit 'null' does but 'memory' did not; I'll probably fix that]
I don't know if we want to somehow allow:
h.zero (64*1024, 0, nbd.CMD_FLAG_FUA, nbd.CMD_FLAG_NO_HOLE)
instead (two arguments, each with one flag, which the glue code then
combines into a single integer; compared to the existing approach of
letting Python do the bitwise math and pass in a single integer up front).
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization:
qemu.org |
libvirt.org