Skip to content

Commit

Permalink
retval refinement
Browse files Browse the repository at this point in the history
  • Loading branch information
Your Name committed Oct 1, 2024
1 parent ec1e8de commit c7ce261
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 18 deletions.
15 changes: 6 additions & 9 deletions common/alog.h
Original file line number Diff line number Diff line change
Expand Up @@ -573,18 +573,15 @@ inline LogBuffer& operator<<(LogBuffer& log, const NamedValue<T>& v) {
return retv; \
}

// err can be either an error number of int, or an retval<T>
#define LOG_ERROR_RETVAL(err, ...) do { \
if (std::is_same<decltype(err), int>::value) { \
retval_base e{err}; \
assert(e.failed()); \
LOG_ERROR(__VA_ARGS__, ' ', e); \
return e; \
} else { \
LOG_ERROR(__VA_ARGS__); \
return err; \
} \
retval_base e{err}; \
LOG_ERROR(__VA_ARGS__, ' ', e); \
return e; \
} while(0)

#define LOG_ERRNO_RETVAL(...) LOG_ERROR_RETVAL(errno, __VA_ARGS__)

// Acts like a LogBuilder
// but able to do operations when log builds
template <typename Builder, typename Append>
Expand Down
16 changes: 10 additions & 6 deletions common/retval.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ limitations under the License.
#pragma once
#include <inttypes.h>
#include <assert.h>
#include <type_traits>

namespace photon {

struct retval_base {
// use uint64_t to make sure the result is returned
// use int64_t to make sure the result is returned
// via another register, so that it is accessed easily
uint64_t _errno = 0;
int64_t _errno = 0;
// retval_base(int eno) : _errno(eno)
bool failed() const { return _errno; }
bool succeeded() const { return !failed(); }
int get_errno() const { assert(_errno > 0); return (int)_errno; }
Expand All @@ -35,14 +37,17 @@ T failure_value() { return 0; }
template<typename T>
struct retval : public retval_base {
T _val;
retval(T x) : _val(x) { }
retval(int _errno, T val) : retval_base{(uint64_t)_errno}, _val(val) {
retval(const retval&) = default;
retval(int _errno, T val) : retval_base{_errno}, _val(val) { }
retval(int _errno) : retval_base{_errno}, _val(failure_value<T>()) {
assert(failed());
}
retval(const retval_base& rvb) : retval_base(rvb) {
assert(failed());
_val = failure_value<T>();
}
template<typename P, typename Q = typename std::enable_if<!std::is_integral<P>::value>::type>
retval(P val) : _val(val) { }
operator T() const {
return get();
}
Expand Down Expand Up @@ -71,7 +76,7 @@ struct retval : public retval_base {

template<>
struct retval<void> : public retval_base {
retval(int errno_ = 0) : retval_base{(uint64_t)errno_} { }
retval(int errno_ = 0) : retval_base{errno_} { }
retval(const retval_base& rvb) : retval_base(rvb) { }
void get() const { }
retval_base base() const {
Expand All @@ -94,4 +99,3 @@ DEFINE_FAILURE_VALUE(int8_t, -1)
DEFINE_FAILURE_VALUE(int16_t, -1)
DEFINE_FAILURE_VALUE(int32_t, -1)
DEFINE_FAILURE_VALUE(int64_t, -1)

2 changes: 1 addition & 1 deletion common/test/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -923,7 +923,7 @@ retval<void> ret_succeeded() {
TEST(retval, basic) {
const static retval<int> rvs[] =
{{32}, {EINVAL, -2345}, {EADDRINUSE, -1234}, {EALREADY, -5234}};
EXPECT_EQ(rvs[0], 32);
EXPECT_EQ(rvs[0], -1);
EXPECT_EQ(rvs[1], -2345);
EXPECT_EQ(rvs[2], -1234);
EXPECT_EQ(rvs[3], -5234);
Expand Down
5 changes: 3 additions & 2 deletions thread/test/st_utest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ GTEST_API_ int main(int argc, char **argv) {
#endif

// Initialize state-threads, create idle coroutine.
assert(st_init() == 0);
int ret = st_init();
assert(ret == 0);
if (ret < 0) return ret;

testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
Expand All @@ -40,4 +42,3 @@ VOID TEST(SampleTest, ExampleIntSizeTest)
EXPECT_EQ(4, (int)sizeof(int32_t));
EXPECT_EQ(8, (int)sizeof(int64_t));
}

0 comments on commit c7ce261

Please sign in to comment.