See the earlier commit "Add Extent64 arg type" for rationale in
supporting a new generator arg type. This patch adds the Go bindings
for use of Extent64, which required adding a counterpart Go type and
introducing a helper function for copying from the C array to an
actual Go object, very similar to the existing copy_uint32_array
helper for 32-bit extents.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
v4: split out of larger patch [Laszlo], avoid awkward slice since we
can't use copy() anyway [Laszlo]
---
generator/GoLang.ml | 23 +++++++++++++++++++++++
golang/handle.go | 6 ++++++
2 files changed, 29 insertions(+)
diff --git a/generator/GoLang.ml b/generator/GoLang.ml
index cc7d78b6..7a516366 100644
--- a/generator/GoLang.ml
+++ b/generator/GoLang.ml
@@ -528,6 +528,21 @@ let
}
return ret
}
+
+func copy_extent_array(entries *C.nbd_extent, count C.size_t) []LibnbdExtent {
+ if (uint64(count) > 64*1024*1024) {
+ panic(\"violation of state machine guarantee\")
+ }
+ ret := make([]LibnbdExtent, count)
+ addr := uintptr(unsafe.Pointer(entries))
+ for i := 0; i < int(count); i++ {
+ ptr := (*C.nbd_extent)(unsafe.Pointer(addr))
+ ret[i].Length = uint64((*ptr).length)
+ ret[i].Flags = uint64((*ptr).flags)
+ addr += unsafe.Sizeof(*ptr)
+ }
+ return ret
+}
";
List.iter (
@@ -542,6 +557,8 @@ let
match cbarg with
| CBArrayAndLen (UInt32 n, _) ->
pr "%s []uint32" n;
+ | CBArrayAndLen (Extent64 n, _) ->
+ pr "%s []LibnbdExtent" n;
| CBBytesIn (n, len) ->
pr "%s []byte" n;
| CBInt n ->
@@ -568,6 +585,8 @@ let
match cbarg with
| CBArrayAndLen (UInt32 n, count) ->
pr "%s *C.uint32_t, %s C.size_t" n count
+ | CBArrayAndLen (Extent64 n, count) ->
+ pr "%s *C.nbd_extent, %s C.size_t" n count
| CBBytesIn (n, len) ->
pr "%s unsafe.Pointer, %s C.size_t" n len
| CBInt n ->
@@ -610,6 +629,8 @@ let
match cbarg with
| CBArrayAndLen (UInt32 n, count) ->
pr "copy_uint32_array(%s, %s)" n count
+ | CBArrayAndLen (Extent64 n, count) ->
+ pr "copy_extent_array(%s, %s)" n count
| CBBytesIn (n, len) ->
pr "C.GoBytes(%s, C.int(%s))" n len
| CBInt n ->
@@ -760,6 +781,8 @@ let
match cbarg with
| CBArrayAndLen (UInt32 n, count) ->
pr "uint32_t *%s, size_t %s" n count
+ | CBArrayAndLen (Extent64 n, count) ->
+ pr "nbd_extent *%s, size_t %s" n count
| CBBytesIn (n, len) ->
pr "void *%s, size_t %s" n len
| CBInt n ->
diff --git a/golang/handle.go b/golang/handle.go
index 5fe4ed4f..2b0ee6d5 100644
--- a/golang/handle.go
+++ b/golang/handle.go
@@ -58,6 +58,12 @@ func (h *Libnbd) String() string {
return "&Libnbd{}"
}
+/* Used for block status callback. */
+type LibnbdExtent struct {
+ Length uint64 // length of the extent
+ Flags uint64 // flags describing properties of the extent
+}
+
/* All functions (except Close) return ([result,] LibnbdError). */
type LibnbdError struct {
Op string // operation which failed
--
2.41.0