C++: Declare all callbacks invoked from C noexcept

If one of these functions does throw an exception, std::terminate()
will be called. Without this, the behavior is undefined since the C
stack is not prepared to deal with exceptions.
This commit is contained in:
Daniel Elstner 2015-10-14 20:56:51 +02:00
parent 15914cdb0f
commit 0ab8e5d22b
2 changed files with 11 additions and 9 deletions

View File

@ -74,7 +74,7 @@ ResourceReader::~ResourceReader()
} }
SR_PRIV int ResourceReader::open_callback(struct sr_resource *res, SR_PRIV int ResourceReader::open_callback(struct sr_resource *res,
const char *name, void *cb_data) const char *name, void *cb_data) noexcept
{ {
try { try {
auto *const reader = static_cast<ResourceReader*>(cb_data); auto *const reader = static_cast<ResourceReader*>(cb_data);
@ -87,7 +87,8 @@ SR_PRIV int ResourceReader::open_callback(struct sr_resource *res,
return SR_OK; return SR_OK;
} }
SR_PRIV int ResourceReader::close_callback(struct sr_resource *res, void *cb_data) SR_PRIV int ResourceReader::close_callback(struct sr_resource *res,
void *cb_data) noexcept
{ {
try { try {
auto *const reader = static_cast<ResourceReader*>(cb_data); auto *const reader = static_cast<ResourceReader*>(cb_data);
@ -101,7 +102,7 @@ SR_PRIV int ResourceReader::close_callback(struct sr_resource *res, void *cb_dat
} }
SR_PRIV ssize_t ResourceReader::read_callback(const struct sr_resource *res, SR_PRIV ssize_t ResourceReader::read_callback(const struct sr_resource *res,
void *buf, size_t count, void *cb_data) void *buf, size_t count, void *cb_data) noexcept
{ {
try { try {
auto *const reader = static_cast<ResourceReader*>(cb_data); auto *const reader = static_cast<ResourceReader*>(cb_data);
@ -208,7 +209,8 @@ void Context::set_log_level(const LogLevel *level)
check(sr_log_loglevel_set(level->id())); check(sr_log_loglevel_set(level->id()));
} }
static int call_log_callback(void *cb_data, int loglevel, const char *format, va_list args) static int call_log_callback(void *cb_data, int loglevel,
const char *format, va_list args) noexcept
{ {
const unique_ptr<char, decltype(&g_free)> const unique_ptr<char, decltype(&g_free)>
message {g_strdup_vprintf(format, args), &g_free}; message {g_strdup_vprintf(format, args), &g_free};
@ -978,7 +980,7 @@ bool Session::is_running() const
return (ret != 0); return (ret != 0);
} }
static void session_stopped_callback(void *data) static void session_stopped_callback(void *data) noexcept
{ {
auto *const callback = static_cast<SessionStoppedCallback*>(data); auto *const callback = static_cast<SessionStoppedCallback*>(data);
(*callback)(); (*callback)();
@ -996,7 +998,7 @@ void Session::set_stopped_callback(SessionStoppedCallback callback)
} }
static void datafeed_callback(const struct sr_dev_inst *sdi, static void datafeed_callback(const struct sr_dev_inst *sdi,
const struct sr_datafeed_packet *pkt, void *cb_data) const struct sr_datafeed_packet *pkt, void *cb_data) noexcept
{ {
auto callback = static_cast<DatafeedCallbackData *>(cb_data); auto callback = static_cast<DatafeedCallbackData *>(cb_data);
callback->run(sdi, pkt); callback->run(sdi, pkt);

View File

@ -246,11 +246,11 @@ private:
virtual size_t read(const struct sr_resource *res, void *buf, size_t count) = 0; virtual size_t read(const struct sr_resource *res, void *buf, size_t count) = 0;
static SR_PRIV int open_callback(struct sr_resource *res, static SR_PRIV int open_callback(struct sr_resource *res,
const char *name, void *cb_data); const char *name, void *cb_data) noexcept;
static SR_PRIV int close_callback(struct sr_resource *res, static SR_PRIV int close_callback(struct sr_resource *res,
void *cb_data); void *cb_data) noexcept;
static SR_PRIV ssize_t read_callback(const struct sr_resource *res, static SR_PRIV ssize_t read_callback(const struct sr_resource *res,
void *buf, size_t count, void *cb_data); void *buf, size_t count, void *cb_data) noexcept;
friend class Context; friend class Context;
}; };