|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC] Generating Go bindings for libxl
> That looks about like we expected -- tolerable and functional, to be
> certain, but LotsOfReallyLongTypeNames.
Yeah that's definitely a down side...
> The only purpose of unions in these structures is to save space (as
> opposed to other kinds of unions are specifically designed to allow
> different "views" of the same underlying data). We're replacing the
> unions with structures which will be 1) allocated separately, and 2)
> require casting and type assertions to handle properly. This will save
> *some* space, but at the cost of a certain amount of complexity, and
> run-time overhead.
WRT runtime overhead, type assertions are actually quite fast. You can
try this [1] benchmark that I found referenced in several threads asking
about the performance of type assertions. On my machine, each case
was ~1.5 ns/op.
> What we just defined three separate elements in the struct? E.g.:
[...]
> if ( di.Type.Key == libxl.DomainTypeHvm ) {
> /* ... */
> firmware := di.Type.Hvm.Firmware;
> }
I see your point here, but as type assertions are so common in Go, I don't
think we need to worry about making this part "easier to write." If someone
really wanted to have easier access to DomainBuildInfoTypeUnionHvm, they
could write a getter that hides the type assertion. Then they could have:
hvminfo := di.getHVMBuildInfo()
if hvminfo != nil {
firmware := hvminfo.Firmware
}
> This also mean you could make a mistake and access the HVM fields for a
> PV domain, and you'd get neither a compile-time nor a run-time error.
>
> Anyway, like I said, just tossing it out there. If we decide we don't
> want duplicate structs, I think your implementation looks about as good
> as it can be.
I'm not strongly opposed to the struct duplication, but I do prefer the ability
to perform type assertions as a way to determine which field is "valid."
> So the advantage of this is that you can just call:
>
> fromC(&di, &cdi)
>
> Rather than:
>
> di.fromC(&cdi)
>
> ?
>
> But the cost for this is that we're switching from static type-checking
> to dynamic type-checking. If in the first example, cdi is the wrong
> type (for instance, if we forget the & at the front), everything will
> compile, and we won't notice unless the function actually gets called.
> In the second example, if we're not trying to implement a generic
> "marshaler" method, we can define the function signature to specify
> exactly what pointer we need.
The advantage is it simplifies the generated code's error handling. However,
I was re-thinking this portion as well, because giving up the static type
checking is not worth "cleaner" generated code. I'll make that change.
> Right -- that looks like just about the only option? Anyway, it's a
> good option; no point spending a lot of time looking for ways to improve
> something that's only really going to live inside one generated file.
Agreed.
> We could basically do the same thing; but make `val` non-exported.
Okay.
> I'd be tempted to say just do something like:
>
> type CpuidPolicyList struct {
> val C.libxl_cpuid_policy_list
> };
>
> A part of me thinks even something like this wouldn't be terrible:
>
> type CpuidPolicyList C.libxl_cpuid_policy_list
>
> It "leaks" the internals out to the callers, but it also means you don't
> have to do all this faff of marshalling / unmarshalling what's
> essentially just a pointer.
I don't think it's a good idea to expose the C type. Besides the fact that [2]
explicitly states not to do this, exporting this type gives the false idea that
this type is somehow portable.
> Should probably be C.LIBXL_MS_VM_GENID_LEN, but yes.
Sounds good.
> It sort of looks like this is an entirely internal thing that libxl
> uses. I think to begin with we can just declare this as an empty
> struct, and figure out what to put in it once it becomes more clear how
> it needs to be used.
Okay, will do.
> Thanks for all your work on this!
No problem, I'm glad to be working on it.
-NR
[1] https://play.golang.org/p/E9H_4K2J9-
[2] https://golang.org/cmd/cgo/#hdr-Go_references_to_C
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |