Execute benchmark server as child process 41/279541/2
authorHwankyu Jhun <h.jhun@samsung.com>
Thu, 11 Aug 2022 07:42:00 +0000 (16:42 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Thu, 11 Aug 2022 07:51:58 +0000 (16:51 +0900)
To test the performance easily, the benchmark-server will be executed
using fork() & execv() by the tool.

Change-Id: I394131d6294a78c869adfcb6f6565397feb9b77b
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
benchmark/tool/main.cc

index d7f632a..a92c8ea 100644 (file)
  * limitations under the License.
  */
 
-
 #include <glib.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
 
 #include <chrono>
 #include <iostream>
@@ -27,6 +30,7 @@
 namespace {
 
 constexpr const char SERVER_PROC_NAME[] = "org.tizen.appfw.rpc_port.benchmark";
+constexpr const char SERVER_BIN[] = "/usr/bin/rpc-port-benchmark-server";
 
 namespace bp = rpc_port::BenchmarkProxy::proxy;
 
@@ -48,6 +52,14 @@ class Tester {
   }
 
   ~Tester() {
+    if (server_pid_ > 0) {
+      if (kill(server_pid_, SIGTERM) != 0) {
+        std::cerr << "kill() is failed. errno: " << errno << std::endl;
+      } else {
+        int status;
+        waitpid(server_pid_, &status, 0);
+      }
+    }
   }
 
   void Run(int argc, char** argv) {
@@ -57,6 +69,7 @@ class Tester {
       exit(1);
     }
 
+    ExecuteServer();
     proxy_.reset(new bp::Benchmark(&listener_, SERVER_PROC_NAME));
 
     try {
@@ -100,11 +113,32 @@ class Tester {
     std::cout << "Latency: " << std::to_string(l) << "ms" << std::endl;
   }
 
+  void ExecuteServer() {
+    server_pid_ = fork();
+    if (server_pid_ == 0) {
+      setsid();
+
+      char* argv[] = { strdup(SERVER_BIN), nullptr, nullptr };
+      int ret = execv(argv[0], argv);
+      if (ret < 0) {
+        std::cerr << "execv() is failed. errno: " << errno << std::endl;
+        exit(-1);
+      }
+    } else if (server_pid_ == -1) {
+      std::cerr << "fork() is failed. errno: " << errno << std::endl;
+      exit(-1);
+    } else {
+      _W("benchmark server is running. pid: %d", server_pid_);
+      usleep(100 * 1000);
+    }
+  }
+
  private:
   std::unique_ptr<rpc_port::benchmark::Options> options_;
   std::unique_ptr<bp::Benchmark> proxy_;
   ConnectionListener listener_;
   std::chrono::system_clock::time_point start_;
+  pid_t server_pid_ = -1;
 };
 
 }  // namespace