Merge "snapuserd: Handle real time signal 36" am: 7ec205920c

Original change: https://android-review.googlesource.com/c/platform/system/core/+/1840414

Change-Id: Id54f17a60f31bdd54757580589ee4474711730f1
diff --git a/fs_mgr/libsnapshot/snapuserd/cow_snapuserd_test.cpp b/fs_mgr/libsnapshot/snapuserd/cow_snapuserd_test.cpp
index bff0a50..44ea2cb 100644
--- a/fs_mgr/libsnapshot/snapuserd/cow_snapuserd_test.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/cow_snapuserd_test.cpp
@@ -109,6 +109,7 @@
     void MergeInterruptRandomly(int max_duration);
     void ReadDmUserBlockWithoutDaemon();
     void ReadLastBlock();
+    void TestRealTimeSignal();
 
     std::string snapshot_dev() const { return snapshot_dev_->path(); }
 
@@ -152,6 +153,7 @@
     size_t size_ = 50_MiB;
     int cow_num_sectors_;
     int total_base_size_;
+    pid_t pid_;
 };
 
 class CowSnapuserdMetadataTest final {
@@ -254,6 +256,7 @@
     } else {
         client_ = SnapuserdClient::Connect(kSnapuserdSocketTest, 10s);
         ASSERT_NE(client_, nullptr);
+        pid_ = pid;
     }
 }
 
@@ -769,6 +772,16 @@
     ASSERT_FALSE(snapshot_dev_->path().empty());
 }
 
+void CowSnapuserdTest::TestRealTimeSignal() {
+    StartSnapuserdDaemon();
+    ASSERT_EQ(kill(pid_, 36), 0);  // Real time signal 36
+    ASSERT_EQ(kill(pid_, 0), 0);   // Verify pid exists
+    ASSERT_TRUE(client_->DetachSnapuserd());
+    std::this_thread::sleep_for(1s);
+    client_->CloseConnection();
+    client_ = nullptr;
+}
+
 void CowSnapuserdTest::SetupImpl() {
     CreateBaseDevice();
     CreateCowDevice();
@@ -1278,6 +1291,11 @@
     harness.Shutdown();
 }
 
+TEST(Snapuserd_Test, Snapshot_TestRealTimeSignal) {
+    CowSnapuserdTest harness;
+    harness.TestRealTimeSignal();
+}
+
 }  // namespace snapshot
 }  // namespace android
 
diff --git a/fs_mgr/libsnapshot/snapuserd/snapuserd_daemon.cpp b/fs_mgr/libsnapshot/snapuserd/snapuserd_daemon.cpp
index e05822e..e2ed7ed 100644
--- a/fs_mgr/libsnapshot/snapuserd/snapuserd_daemon.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/snapuserd_daemon.cpp
@@ -29,6 +29,8 @@
 DEFINE_bool(socket_handoff, false,
             "If true, perform a socket hand-off with an existing snapuserd instance, then exit.");
 
+constexpr int kProfilingSignal = __SIGRTMIN + 4;
+
 namespace android {
 namespace snapshot {
 
@@ -39,6 +41,7 @@
     sigdelset(&signal_mask_, SIGINT);
     sigdelset(&signal_mask_, SIGTERM);
     sigdelset(&signal_mask_, SIGUSR1);
+    sigdelset(&signal_mask_, kProfilingSignal);
 
     // Masking signals here ensure that after this point, we won't handle INT/TERM
     // until after we call into ppoll()
@@ -46,6 +49,7 @@
     signal(SIGTERM, Daemon::SignalHandler);
     signal(SIGPIPE, Daemon::SignalHandler);
     signal(SIGUSR1, Daemon::SignalHandler);
+    signal(kProfilingSignal, Daemon::SignalHandler);
 
     MaskAllSignalsExceptIntAndTerm();
 
@@ -83,6 +87,7 @@
     sigdelset(&signal_mask, SIGTERM);
     sigdelset(&signal_mask, SIGPIPE);
     sigdelset(&signal_mask, SIGUSR1);
+    sigdelset(&signal_mask, kProfilingSignal);
     if (sigprocmask(SIG_SETMASK, &signal_mask, NULL) != 0) {
         PLOG(ERROR) << "Failed to set sigprocmask";
     }
@@ -116,6 +121,10 @@
             LOG(ERROR) << "Received SIGPIPE signal";
             break;
         }
+        case kProfilingSignal: {
+            LOG(INFO) << "Received real-time signal SIGRTMIN+4";
+            break;
+        }
         case SIGUSR1: {
             LOG(INFO) << "Received SIGUSR1, attaching to proxy socket";
             Daemon::Instance().ReceivedSocketSignal();