diff --git a/ircd/cl.cc b/ircd/cl.cc index f9abfbe5a..0a88b0cb6 100644 --- a/ircd/cl.cc +++ b/ircd/cl.cc @@ -17,9 +17,9 @@ namespace ircd::cl { static bool is_error(const int &code) noexcept; static int throw_on_error(const int &code); - template static int call(func&&, args&&...); - template static T info(F&&, const id &, const param &, const mutable_buffer &); - template static T info(F&&, const id0 &, const id1 &, const param &, const mutable_buffer &); + template static int call(func&&, args&&...); + template static T info(F&&, const id &, const param &, const mutable_buffer &, T default_ = {}); + template static T info(F&&, const id0 &, const id1 &, const param &, const mutable_buffer &, T default_ = {}); static uint query_warp_size(cl_context, cl_device_id); } @@ -2648,29 +2648,42 @@ noexcept // template T ircd::cl::info(F&& func, - const id &i, + const id0 &i0, const param &p, - const mutable_buffer &out) + const mutable_buffer &out, + T default_) { using ircd::data; using ircd::size; size_t len {0}; - call(std::forward(func), i, p, size(out), data(out), &len); - const string_view str + const auto code { - data(out), len + call(std::forward(func), i0, p, size(out), data(out), &len) }; - return byte_view(str); + assert(code == CL_SUCCESS || code == maybe); + if constexpr(maybe != CL_SUCCESS) + if(code == maybe) + return default_; + + return byte_view + { + string_view + { + data(out), len + } + }; } template(func), i0, i1, p, size(out), data(out), &len); - const string_view str + const auto code { - data(out), len + call(std::forward(func), i0, i1, p, size(out), data(out), &len) }; - return byte_view(str); + assert(code == CL_SUCCESS || code == maybe); + if constexpr(maybe != CL_SUCCESS) + if(code == maybe) + return default_; + + return byte_view + { + string_view + { + data(out), len + } + }; } -template int ircd::cl::call(func&& f, @@ -2706,6 +2731,10 @@ ircd::cl::call(func&& f, f(std::forward(a)...) }; + if constexpr(maybe != CL_SUCCESS) + if(ret == maybe) + return ret; + return throw_on_error(ret); }