#include <gio/gio.h>
#include <glib.h>
+#include <list>
#include <memory>
#include <queue>
#include <string>
class ResultCb {
public:
- ResultCb(amd_app_request_broker_result_cb cb, void* user_data)
- : cb_(cb), user_data_(user_data) {
+ class IEvent {
+ public:
+ virtual ~IEvent() = default;
+ virtual void OnTimedOut(ResultCb* cb) = 0;
+ };
+
+ ResultCb(IEvent* listener, amd_app_request_broker_result_cb cb,
+ void* user_data)
+ : listener_(listener), cb_(cb), user_data_(user_data) {
timer_ = g_timeout_add(5000, OnTimedOut, this);
}
private:
static gboolean OnTimedOut(gpointer user_data) {
auto* cb = static_cast<ResultCb*>(user_data);
- cb->Invoke(-ETIMEDOUT);
cb->timer_ = 0;
+
+ auto* listener = cb->listener_;
+ if (listener != nullptr)
+ listener->OnTimedOut(cb);
+
return G_SOURCE_REMOVE;
}
private:
+ IEvent* listener_;
amd_app_request_broker_result_cb cb_;
void* user_data_;
guint timer_ = 0;
};
-class ClientChannel : public amd::ClientSocket {
+class ClientChannel : public amd::ClientSocket,
+ public ResultCb::IEvent,
+ public std::enable_shared_from_this<ClientChannel> {
public:
ClientChannel(pid_t pid, uid_t uid)
: ClientSocket(), pid_(pid), uid_(uid) {
return uid_;
}
+ std::shared_ptr<ClientChannel> GetSharedPtr() {
+ return shared_from_this();
+ }
+
+ void AddResultCb(amd_app_request_broker_result_cb cb, void* user_data) {
+ Push(std::make_shared<ResultCb>(this, cb, user_data));
+ }
+
void Push(std::shared_ptr<ResultCb> result_cb) {
queue_.push(std::move(result_cb));
}
}
private:
+ void OnTimedOut(ResultCb* cb) override {
+ cb->Invoke(-ETIMEDOUT);
+ queue_.pop();
+ }
+
static gboolean OnDataReceived(GIOChannel* channel, GIOCondition cond,
gpointer user_data);
static gboolean OnSocketDisconnected(GIOChannel* channel, GIOCondition cond,
_E("Client channel will be removed. pid(%d)", channel->GetPid());
broker.RemoveClientChannel(channel->GetPid());
+
return ret;
}
- channel->Push(std::make_shared<ResultCb>(callback, user_data));
+ channel->AddResultCb(callback, user_data);
return 0;
}