Skip to content

Commit f253f6f

Browse files
committed
src: handle bad allocation errors
PR-URL: #20 Reviewed-by: Trevor Norris <trev.norris@gmail.com>
1 parent a0a32ca commit f253f6f

1 file changed

Lines changed: 95 additions & 31 deletions

File tree

src/nsolid.h

Lines changed: 95 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -989,9 +989,13 @@ int ThreadMetrics::Update(Cb&& cb, Data&&... data) {
989989
}
990990

991991
// _1 - ThreadMetrics*
992-
UserData* user_data = new UserData(
992+
UserData* user_data = new (std::nothrow) UserData(
993993
std::bind(std::forward<Cb>(cb), _1, std::forward<Data>(data)...));
994994

995+
if (user_data == nullptr) {
996+
return UV_ENOMEM;
997+
}
998+
995999
user_data_ = user_data;
9961000
proxy_ = thread_metrics_proxy_<UserData>;
9971001
stor_.thread_id = thread_id_;
@@ -1032,8 +1036,13 @@ MetricsStream* MetricsStream::CreateInstance(uint32_t flags,
10321036
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
10331037
// _1 - MetricsStream* metrics_stream
10341038
// _2 - const metrics_stream_bucket& bucket
1035-
UserData* user_data = new UserData(std::bind(
1039+
UserData* user_data = new (std::nothrow) UserData(std::bind(
10361040
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1041+
1042+
if (user_data == nullptr) {
1043+
return nullptr;
1044+
}
1045+
10371046
stream->DoSetup(flags,
10381047
metrics_stream_proxy_<UserData>,
10391048
internal::delete_proxy_<UserData>,
@@ -1062,8 +1071,13 @@ Tracer* Tracer::CreateInstance(uint32_t flags, Cb&& cb, Data&&... data) {
10621071
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
10631072
// _1 - Tracer*
10641073
// _2 - const SpanStor&
1065-
UserData* user_data = new UserData(std::bind(
1074+
UserData* user_data = new (std::nothrow) UserData(std::bind(
10661075
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1076+
1077+
if (user_data == nullptr) {
1078+
return nullptr;
1079+
}
1080+
10671081
tracer->DoSetup(flags,
10681082
trace_proxy_<UserData>,
10691083
internal::delete_proxy_<UserData>,
@@ -1092,16 +1106,23 @@ int CpuProfiler::TakeProfile(SharedEnvInst envinst,
10921106

10931107
// _1 - int status
10941108
// _2 - std::string json
1095-
std::unique_ptr<UserData> user_data = std::make_unique<UserData>(std::bind(
1109+
UserData* user_data = new (std::nothrow) UserData(std::bind(
10961110
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
10971111

1112+
if (user_data == nullptr) {
1113+
return UV_ENOMEM;
1114+
}
1115+
1116+
10981117
int er = get_cpu_profile_(envinst,
10991118
duration,
1100-
user_data.get(),
1119+
user_data,
11011120
cpu_profiler_proxy_<UserData>,
11021121
internal::delete_proxy_<UserData>);
1103-
if (!er)
1104-
user_data.release();
1122+
if (er) {
1123+
delete user_data;
1124+
}
1125+
11051126
return er;
11061127
}
11071128

@@ -1126,16 +1147,23 @@ int Snapshot::TakeSnapshot(SharedEnvInst envinst,
11261147

11271148
// _1 - int status
11281149
// _2 - std::string json
1129-
std::unique_ptr<UserData> user_data = std::make_unique<UserData>(std::bind(
1150+
UserData* user_data = new (std::nothrow) UserData(std::bind(
11301151
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
11311152

1153+
if (user_data == nullptr) {
1154+
return UV_ENOMEM;
1155+
}
1156+
11321157
int er = get_snapshot_(envinst,
11331158
redacted,
1134-
user_data.get(),
1159+
user_data,
11351160
snapshot_proxy_<UserData>,
11361161
internal::delete_proxy_<UserData>);
1137-
if (!er)
1138-
user_data.release();
1162+
1163+
if (er) {
1164+
delete user_data;
1165+
}
1166+
11391167
return er;
11401168
}
11411169

@@ -1151,14 +1179,21 @@ int QueueCallback(Cb&& cb, Data&&... data) {
11511179
using UserData = decltype(std::bind(
11521180
std::forward<Cb>(cb), std::forward<Data>(data)...));
11531181

1154-
std::unique_ptr<UserData> user_data = std::make_unique<UserData>(std::bind(
1182+
UserData* user_data = new (std::nothrow) UserData(std::bind(
11551183
std::forward<Cb>(cb), std::forward<Data>(data)...));
11561184

1185+
if (user_data == nullptr) {
1186+
return UV_ENOMEM;
1187+
}
1188+
11571189
int er = internal::queue_callback_(
1158-
user_data.get(),
1190+
user_data,
11591191
internal::queue_callback_proxy_<UserData>);
1160-
if (!er)
1161-
user_data.release();
1192+
1193+
if (er) {
1194+
delete user_data;
1195+
}
1196+
11621197
return er;
11631198
}
11641199

@@ -1168,15 +1203,22 @@ int QueueCallback(uint64_t timeout, Cb&& cb, Data&&... data) {
11681203
using UserData = decltype(std::bind(
11691204
std::forward<Cb>(cb), std::forward<Data>(data)...));
11701205

1171-
std::unique_ptr<UserData> user_data = std::make_unique<UserData>(std::bind(
1206+
UserData* user_data = new (std::nothrow) UserData(std::bind(
11721207
std::forward<Cb>(cb), std::forward<Data>(data)...));
11731208

1209+
if (user_data == nullptr) {
1210+
return UV_ENOMEM;
1211+
}
1212+
11741213
int er = internal::queue_callback_(
11751214
timeout,
1176-
user_data.get(),
1215+
user_data,
11771216
internal::queue_callback_proxy_<UserData>);
1178-
if (!er)
1179-
user_data.release();
1217+
1218+
if (er) {
1219+
delete user_data;
1220+
}
1221+
11801222
return er;
11811223
}
11821224

@@ -1191,17 +1233,23 @@ int RunCommand(SharedEnvInst envinst,
11911233
using UserData = decltype(std::bind(
11921234
std::forward<Cb>(cb), _1, std::forward<Data>(data)...));
11931235
// _1 - SharedEnvInst
1194-
std::unique_ptr<UserData> user_data = std::make_unique<UserData>(std::bind(
1236+
UserData* user_data = new (std::nothrow) UserData(std::bind(
11951237
std::forward<Cb>(cb), _1, std::forward<Data>(data)...));
11961238

1239+
if (user_data == nullptr) {
1240+
return UV_ENOMEM;
1241+
}
1242+
11971243
int er = internal::run_command_(
11981244
envinst,
11991245
type,
1200-
user_data.get(),
1246+
user_data,
12011247
internal::run_command_proxy_<UserData>);
12021248

1203-
if (!er)
1204-
user_data.release();
1249+
if (er) {
1250+
delete user_data;
1251+
}
1252+
12051253
return 0;
12061254
}
12071255

@@ -1223,17 +1271,25 @@ int CustomCommand(SharedEnvInst envinst,
12231271
// _3 - int status
12241272
// _4 - std::pair<bool, std::string> error
12251273
// _5 - std::pair<bool, std::string> value
1226-
std::unique_ptr<UserData> user_data = std::make_unique<UserData>(std::bind(
1274+
UserData* user_data = new (std::nothrow) UserData(std::bind(
12271275
std::forward<Cb>(cb), _1, _2, _3, _4, _5, std::forward<Data>(data)...));
1276+
1277+
if (user_data == nullptr) {
1278+
return UV_ENOMEM;
1279+
}
1280+
12281281
int er = internal::custom_command_(
12291282
envinst,
12301283
req_id,
12311284
command,
12321285
args,
1233-
user_data.get(),
1286+
user_data,
12341287
internal::custom_command_proxy_<UserData>);
1235-
if (!er)
1236-
user_data.release();
1288+
1289+
if (er) {
1290+
delete user_data;
1291+
}
1292+
12371293
return er;
12381294
}
12391295

@@ -1247,15 +1303,22 @@ int AtExitHook(Cb&& cb, Data&&... data) {
12471303

12481304
// _1 - bool on_signal
12491305
// _2 - bool profile_stopped
1250-
std::unique_ptr<UserData> user_data = std::make_unique<UserData>(std::bind(
1306+
UserData* user_data = new (std::nothrow) UserData(std::bind(
12511307
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
12521308

1309+
if (user_data == nullptr) {
1310+
return UV_ENOMEM;
1311+
}
1312+
12531313
int er = internal::at_exit_hook_(
1254-
user_data.get(),
1314+
user_data,
12551315
internal::at_exit_hook_proxy_<UserData>,
12561316
internal::delete_proxy_<UserData>);
1257-
if (!er)
1258-
user_data.release();
1317+
1318+
if (er) {
1319+
delete user_data;
1320+
}
1321+
12591322
return er;
12601323
}
12611324

@@ -1271,6 +1334,7 @@ int OnBlockedLoopHook(uint64_t threshold, Cb&& cb, Data&&... data) {
12711334
// _2 - std::string info
12721335
UserData* user_data = new (std::nothrow) UserData(std::bind(
12731336
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1337+
12741338
if (user_data == nullptr) {
12751339
return UV_ENOMEM;
12761340
}

0 commit comments

Comments
 (0)