On Sep 13, 2018, at 6:52 AM, Jason A. Donenfeld [off-list ref] wrote:
quoted
On Thu, Sep 13, 2018 at 7:03 AM Kevin Easton [off-list ref] wrote:
Yes. It's also how most get/put APIs already work in the kernel, eg
kref_get/put (mostly because they tend to be 'getting/putting' an
already-initialized object, though).
Right; in this case the object wouldn't be initialized yet, which
might defeat the purpose, since one advantage of the & way you
mentioned is _put modifies the context.
Andy - any opinions on this? The tl;dr is:
1) what we have now:
simd_context_t simd_context = simd_get();
for (item in items) {
do_something(item);
simd_context = simd_relax(simd_context);
}
simd_put();
2) what kevin is proposing:
simd_context_t simd_context;
simd_get(&simd_context);
for (item in items) {
do_something(item);
simd_relax(&simd_context);
}
simd_put(&simd_context);
I can see pros and cons of each approach.
I have no strong opinion, except that, if you paint the bikeshed “pass by value”, then simd_get and simd_relax should probably have warn_unused_result set.