|
|
|
@ -121,14 +121,8 @@ static const char* error_time_name(grpc_error_times key) { |
|
|
|
|
GPR_UNREACHABLE_CODE(return "unknown"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool grpc_error_is_special(grpc_error* err) { |
|
|
|
|
return err == GRPC_ERROR_NONE || err == GRPC_ERROR_OOM || |
|
|
|
|
err == GRPC_ERROR_CANCELLED; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
grpc_error* grpc_error_ref(grpc_error* err, const char* file, int line) { |
|
|
|
|
if (grpc_error_is_special(err)) return err; |
|
|
|
|
grpc_error* grpc_error_do_ref(grpc_error* err, const char* file, int line) { |
|
|
|
|
if (grpc_trace_error_refcount.enabled()) { |
|
|
|
|
gpr_log(GPR_DEBUG, "%p: %" PRIdPTR " -> %" PRIdPTR " [%s:%d]", err, |
|
|
|
|
gpr_atm_no_barrier_load(&err->atomics.refs.count), |
|
|
|
@ -138,8 +132,7 @@ grpc_error* grpc_error_ref(grpc_error* err, const char* file, int line) { |
|
|
|
|
return err; |
|
|
|
|
} |
|
|
|
|
#else |
|
|
|
|
grpc_error* grpc_error_ref(grpc_error* err) { |
|
|
|
|
if (grpc_error_is_special(err)) return err; |
|
|
|
|
grpc_error* grpc_error_do_ref(grpc_error* err) { |
|
|
|
|
gpr_ref(&err->atomics.refs); |
|
|
|
|
return err; |
|
|
|
|
} |
|
|
|
@ -177,8 +170,7 @@ static void error_destroy(grpc_error* err) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
void grpc_error_unref(grpc_error* err, const char* file, int line) { |
|
|
|
|
if (grpc_error_is_special(err)) return; |
|
|
|
|
void grpc_error_do_unref(grpc_error* err, const char* file, int line) { |
|
|
|
|
if (grpc_trace_error_refcount.enabled()) { |
|
|
|
|
gpr_log(GPR_DEBUG, "%p: %" PRIdPTR " -> %" PRIdPTR " [%s:%d]", err, |
|
|
|
|
gpr_atm_no_barrier_load(&err->atomics.refs.count), |
|
|
|
@ -189,8 +181,7 @@ void grpc_error_unref(grpc_error* err, const char* file, int line) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#else |
|
|
|
|
void grpc_error_unref(grpc_error* err) { |
|
|
|
|
if (grpc_error_is_special(err)) return; |
|
|
|
|
void grpc_error_do_unref(grpc_error* err) { |
|
|
|
|
if (gpr_unref(&err->atomics.refs)) { |
|
|
|
|
error_destroy(err); |
|
|
|
|
} |
|
|
|
@ -450,26 +441,23 @@ grpc_error* grpc_error_set_int(grpc_error* src, grpc_error_ints which, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
typedef struct { |
|
|
|
|
grpc_error* error; |
|
|
|
|
grpc_status_code code; |
|
|
|
|
const char* msg; |
|
|
|
|
} special_error_status_map; |
|
|
|
|
static const special_error_status_map error_status_map[] = { |
|
|
|
|
{GRPC_ERROR_NONE, GRPC_STATUS_OK, ""}, |
|
|
|
|
{GRPC_ERROR_CANCELLED, GRPC_STATUS_CANCELLED, "Cancelled"}, |
|
|
|
|
{GRPC_ERROR_OOM, GRPC_STATUS_RESOURCE_EXHAUSTED, "Out of memory"}, |
|
|
|
|
{GRPC_STATUS_OK, ""}, // GRPC_ERROR_NONE
|
|
|
|
|
{GRPC_STATUS_INVALID_ARGUMENT, ""}, // GRPC_ERROR_RESERVED_1
|
|
|
|
|
{GRPC_STATUS_RESOURCE_EXHAUSTED, "Out of memory"}, // GRPC_ERROR_OOM
|
|
|
|
|
{GRPC_STATUS_INVALID_ARGUMENT, ""}, // GRPC_ERROR_RESERVED_2
|
|
|
|
|
{GRPC_STATUS_CANCELLED, "Cancelled"}, // GRPC_ERROR_CANCELLED
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
bool grpc_error_get_int(grpc_error* err, grpc_error_ints which, intptr_t* p) { |
|
|
|
|
GPR_TIMER_SCOPE("grpc_error_get_int", 0); |
|
|
|
|
if (grpc_error_is_special(err)) { |
|
|
|
|
for (size_t i = 0; i < GPR_ARRAY_SIZE(error_status_map); i++) { |
|
|
|
|
if (error_status_map[i].error == err) { |
|
|
|
|
if (which != GRPC_ERROR_INT_GRPC_STATUS) return false; |
|
|
|
|
if (p != nullptr) *p = error_status_map[i].code; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (which != GRPC_ERROR_INT_GRPC_STATUS) return false; |
|
|
|
|
*p = error_status_map[reinterpret_cast<size_t>(err)].code; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
uint8_t slot = err->ints[which]; |
|
|
|
|
if (slot != UINT8_MAX) { |
|
|
|
@ -490,13 +478,10 @@ grpc_error* grpc_error_set_str(grpc_error* src, grpc_error_strs which, |
|
|
|
|
bool grpc_error_get_str(grpc_error* err, grpc_error_strs which, |
|
|
|
|
grpc_slice* str) { |
|
|
|
|
if (grpc_error_is_special(err)) { |
|
|
|
|
for (size_t i = 0; i < GPR_ARRAY_SIZE(error_status_map); i++) { |
|
|
|
|
if (error_status_map[i].error == err) { |
|
|
|
|
if (which != GRPC_ERROR_STR_GRPC_MESSAGE) return false; |
|
|
|
|
*str = grpc_slice_from_static_string(error_status_map[i].msg); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (which != GRPC_ERROR_STR_GRPC_MESSAGE) return false; |
|
|
|
|
*str = grpc_slice_from_static_string( |
|
|
|
|
error_status_map[reinterpret_cast<size_t>(err)].msg); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
uint8_t slot = err->strs[which]; |
|
|
|
|
if (slot != UINT8_MAX) { |
|
|
|
|