Make ChannelObject as move only class 56/316956/2
authorpjh9216 <jh9216.park@samsung.com>
Fri, 20 Dec 2024 08:12:28 +0000 (17:12 +0900)
committerpjh9216 <jh9216.park@samsung.com>
Mon, 23 Dec 2024 00:05:48 +0000 (09:05 +0900)
- Because this object would be sent to other thread, move only class is
  more safe and fast

Change-Id: I6ec5a9b275a027cf3a269ab6b7ca3719a34676f4
Signed-off-by: pjh9216 <jh9216.park@samsung.com>
CMakeLists.txt
src/tizen-core/channel/channel_object.h
src/tizen-core/shared_queue.h
src/tizen-core/stub.cc
src/tizen-core/stub_channel.cc
src/tizen-core/task.cc
src/tizen-core/task.h
tests/tizen-core_unittests/tizen_core_channel_test.cc

index 2864036bcff6e9ea5c657f5beddf66ca52967751..f23c4b4c12a15de98c5098fe98fa86811fc188f1 100644 (file)
@@ -17,7 +17,7 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
 SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
 SET(CMAKE_C_FLAGS_RELEASE "-O2")
 
-SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_C_FLAGS} -fPIC -std=c++17")
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_C_FLAGS} -fPIC -std=c++23")
 SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
 SET(CMAKE_CXX_FLAGS_RELEASE "-O2")
 
index 0a4b1c3bf5a945f7b1a03c04f34396ed0f879c56..a4aa1d9ce417cd80964d0892eeecc5401aa1abd9 100644 (file)
@@ -32,6 +32,11 @@ class EXPORT_API ChannelObject {
   ChannelObject() : id_(0) {}
   ChannelObject(int id, T data) : id_(id), data_(data) {}
 
+  ChannelObject(const ChannelObject&) = delete;
+  ChannelObject& operator = (const ChannelObject&) = delete;
+  ChannelObject(ChannelObject&&) noexcept = default;
+  ChannelObject& operator = (ChannelObject&&) noexcept = default;
+
   void SetId(int id) {
     id_ = id;
   }
index d0277bbb258c0e2eceea8e57e48bc9e9bfa4c014..7136aee0ce9f72adf8fc1f0a02e3094dba302f7b 100644 (file)
@@ -34,7 +34,7 @@ class SharedQueue {
 
   void Push(T item) {
     std::lock_guard<std::mutex> lock(mutex_);
-    queue_.push(item);
+    queue_.push(std::move(item));
     cond_var_.notify_one();
   }
 
index 282776b4a9b7fcdac1985f4fcd549642c0aadeb1..9bf2ce16a50e98074c698474b1d5d114871d9cdc 100644 (file)
@@ -329,10 +329,8 @@ API int tizen_core_add_channel(tizen_core_h core,
       static_cast<tizen_core::channel::Receiver<void*>*>(receiver);
   auto channel_source = task->AddChannel<void*>(
       channel_receiver->shared_from_this(),
-      [=](const tizen_core::channel::ChannelObject<void*>& object) {
-        callback(
-            &const_cast<tizen_core::channel::ChannelObject<void*>&>(object),
-            user_data);
+      [callback, user_data](auto object) {
+        callback(&object, user_data);
       });
   if (channel_source == nullptr) {
     _E("Failed to add channel");            // LCOV_EXCL_LINE
index 409ae25380fc63c1045b79315ab1b6e5a405aaf5..0db739e845dbfe532e002c98b4de483d4a9cf7a1 100644 (file)
@@ -68,7 +68,8 @@ API int tizen_core_channel_sender_send(tizen_core_channel_sender_h sender,
       static_cast<tizen_core::channel::Sender<void*>*>(sender);
   auto* channel_object =
       static_cast<tizen_core::channel::ChannelObject<void*>*>(object);
-  channel_sender->Send(*channel_object);
+
+  channel_sender->Send(std::move(*channel_object));
   return TIZEN_CORE_ERROR_NONE;
 }
 
@@ -113,7 +114,7 @@ API int tizen_core_channel_receiver_receive(
       static_cast<tizen_core::channel::Receiver<void*>*>(receiver);
   auto channel_object = channel_receiver->Receive();
   *object = static_cast<tizen_core_channel_object_h>(
-      new tizen_core::channel::ChannelObject<void*>(channel_object));
+      new tizen_core::channel::ChannelObject<void*>(std::move(channel_object)));
   if (*object == nullptr) {
     _E("Out of memory");
     return TIZEN_CORE_ERROR_OUT_OF_MEMORY;
index 060afe6809e980aecd77c26d1ae7a9eec283f5fe..3751575f569252c170094e7986f933a2b32a5d5b 100644 (file)
@@ -80,7 +80,7 @@ class ChannelSource : public Source {
  public:
   ChannelSource(std::shared_ptr<Task> task,
                 std::shared_ptr<channel::Receiver<T>> receiver,
-                std::function<void(const channel::ChannelObject<T>&)> cb)
+                std::move_only_function<void(channel::ChannelObject<T>)> cb)
       : task_(std::move(task)),
         receiver_(std::move(receiver)),
         cb_(std::move(cb)),
@@ -109,7 +109,7 @@ class ChannelSource : public Source {
  private:
   std::shared_ptr<Task> task_;
   std::shared_ptr<channel::Receiver<T>> receiver_;
-  std::function<void(const channel::ChannelObject<T>&)> cb_;
+  std::move_only_function<void(channel::ChannelObject<T>)> cb_;
   std::shared_ptr<PollFd> poll_fd_;
 };
 
@@ -327,7 +327,7 @@ void Task::AddSource(std::shared_ptr<ISource> source) {
 template <typename T>
 std::shared_ptr<ISource> Task::AddChannel(
     std::shared_ptr<channel::Receiver<T>> receiver,
-    std::function<void(const channel::ChannelObject<T>&)> cb) {
+    std::move_only_function<void(channel::ChannelObject<T>)> cb) {
   auto source = std::make_shared<ChannelSource<T>>(
       shared_from_this(), std::move(receiver), std::move(cb));
   AddSource(source);
@@ -475,7 +475,7 @@ uint32_t Task::GetRefCount() const { return ref_count_; }
 
 template std::shared_ptr<ISource> Task::AddChannel<void*>(
     std::shared_ptr<channel::Receiver<void*>> receiver,
-    std::function<void(const channel::ChannelObject<void*>&)> cb);
+    std::move_only_function<void(channel::ChannelObject<void*>)> cb);
 template std::shared_ptr<ISource> Task::AddEvent<void*>(
     std::shared_ptr<event::EventBroker<void*>> broker);
 template void Task::EmitEvent<void*>(
index fe6596e61d736719117216a33637b4520573970f..aa468e5033b5cd42b2773e813d8d05630441806f 100644 (file)
@@ -66,7 +66,7 @@ class EXPORT_API Task : public ILoop,
   template <typename T>
   std::shared_ptr<ISource> AddChannel(
       std::shared_ptr<channel::Receiver<T>> receiver,
-      std::function<void(const channel::ChannelObject<T>&)> cb);
+      std::move_only_function<void(channel::ChannelObject<T>)> cb);
   template <typename T>
   std::shared_ptr<ISource> AddEvent(
       std::shared_ptr<event::EventBroker<T>> broker);
index a06ce05f5a18e4afe6406a14c573a7fde548b6c0..5d109a682d6a700bf2b0605cd045a0ed7d181650 100644 (file)
@@ -270,6 +270,12 @@ TEST_F(TizenCoreChannelTest, tizen_core_channel_object_get_sender_task_name_P) {
   ret = tizen_core_channel_object_get_sender_task_name(object, &task_name);
   ASSERT_EQ(ret, TIZEN_CORE_ERROR_NONE);
   ASSERT_STREQ(task_name, "sender");
+
+  void* data = nullptr;
+  ret = tizen_core_channel_object_get_data(object, &data);
+  ASSERT_EQ(ret, TIZEN_CORE_ERROR_NONE);
+  ASSERT_STREQ(static_cast<const char*>(data), "test");
+
   tizen_core_channel_object_destroy(object);
 }