std::lock_guard<std::recursive_mutex> lock(GetMutex());
auto* tmp_handle = new std::shared_ptr<AccessController>(shared_from_this());
GMainContext* context = g_main_context_ref_thread_default();
- Job job([=]() -> Job::Type {
+ auto job = std::make_shared<Job>([=] {
std::lock_guard<std::recursive_mutex> job_lock(GetMutex());
if ((*tmp_handle).use_count() == 1) {
- delete tmp_handle; // LCOV_EXCL_LINE
+ delete tmp_handle; // LCOV_EXCL_LINE
return Job::Type::Continue; // LCOV_EXCL_LINE
}
void CynaraThread::Dispose() {
if (disposed_) return;
- queue_.Push(Job());
+ queue_.Push(nullptr);
thread_.join();
disposed_ = true;
}
void CynaraThread::ThreadRun() {
while (true) {
- Job job = queue_.WaitAndPop();
- if (job.Do() == Job::Type::Finish)
- return; // LCOV_EXCL_LINE
+ auto job = WaitAndPop();
+ if (job == nullptr || job->Do() == Job::Type::Finish) return;
}
}
-void CynaraThread::Push(Job job) {
+void CynaraThread::Push(std::shared_ptr<Job> job) {
queue_.Push(std::move(job));
}
+std::shared_ptr<Job> CynaraThread::WaitAndPop() {
+ return queue_.WaitAndPop();
+}
+
} // namespace internal
} // namespace rpc_port
#define CYNARA_THREAD_HH_
#include <functional>
-#include <shared-queue.hpp>
+#include <memory>
#include <thread>
+#include <shared-queue.hpp>
+
namespace rpc_port {
namespace internal {
CynaraThread& operator=(CynaraThread&) = delete;
~CynaraThread();
- void ThreadRun();
- void Push(Job job);
+ void Push(std::shared_ptr<Job> job);
void Dispose();
private:
CynaraThread();
- Job Pop();
+ void ThreadRun();
+ std::shared_ptr<Job> WaitAndPop();
bool disposed_ = true;
std::thread thread_;
- mutable tizen_base::SharedQueue<Job> queue_;
+ mutable tizen_base::SharedQueue<std::shared_ptr<Job>> queue_;
};
} // namespace internal