Problem:
- RequestQueue::do_all() can not processed all requests
because Request::execute() can throw exception.
Solution:
- Encapsulate catching exceptions to Request::execute().
Change-Id: I5d9bba24c3d57948068997ccd61438853ab3fbcf
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
handler_(handler)
{}
- void execute()
+private:
+ void do_execute() override
{
LOGI("ADD: handler[%p fd=%d]\n", handler_, handler_->fd());
epoll_add_handler(efd_, handler_);
}
-private:
int efd_;
Handler *handler_;
};
deleter_(deleter)
{}
- void execute()
+private:
+ void do_execute() override
{
skip_list_->add(handler_);
deleter_(handler_);
}
-private:
int efd_;
SkipList<Handler *> *skip_list_;
#include <queue>
#include <memory>
+#include <swap_debug.h>
namespace EvLoop {
class Request {
public:
virtual ~Request() {}
- virtual void execute() = 0;
+ void execute()
+ {
+ try {
+ do_execute();
+ } catch (const std::runtime_error &e) {
+ LOGE("%s\n", e.what());
+ } catch (...) {
+ LOGE("Unknown error\n");
+ }
+ }
+
+private:
+ virtual void do_execute() = 0;
};