Support thread naming in NetlinkListener

Add an additional member to NetlinkListener class to store the thread
name. Rename the thread when thread starts if user specified a special
name for that NetlinkListener. Rename the socket destroy listener in
netd to SkDestroyListen.

Bug: 112068616
Test: ps -A -T -Z -MO pri,nice,rtprio,sched,pcy,time | grep SkDstyL
Change-Id: Ie9ac296dc28b56abffd1a83ffcbccc7d8eb1338f
diff --git a/server/NFLogListener.cpp b/server/NFLogListener.cpp
index 67ed453..f13fcf7 100644
--- a/server/NFLogListener.cpp
+++ b/server/NFLogListener.cpp
@@ -216,7 +216,7 @@
     RETURN_IF_NOT_OK(sys.setsockopt<int32_t>(sock, SOL_SOCKET, SO_TIMESTAMP, 1));
 
     std::shared_ptr<NetlinkListenerInterface> listener =
-        std::make_unique<NetlinkListener>(std::move(event), std::move(sock));
+            std::make_unique<NetlinkListener>(std::move(event), std::move(sock), "NFLogListener");
     const auto sendFn = [&listener](const Slice msg) { return listener->send(msg); };
     RETURN_IF_NOT_OK(cfgCmdPfUnbind(sendFn));
     return std::unique_ptr<NFLogListener>(new NFLogListener(std::move(listener)));
diff --git a/server/NetlinkListener.cpp b/server/NetlinkListener.cpp
index 0cbb761..523957e 100644
--- a/server/NetlinkListener.cpp
+++ b/server/NetlinkListener.cpp
@@ -57,8 +57,11 @@
 
 }  // namespace
 
-NetlinkListener::NetlinkListener(UniqueFd event, UniqueFd sock)
-    : mEvent(std::move(event)), mSock(std::move(sock)), mWorker([this]() { run(); }) {
+NetlinkListener::NetlinkListener(UniqueFd event, UniqueFd sock, const std::string& name)
+    : mEvent(std::move(event)),
+      mSock(std::move(sock)),
+      mWorker([this]() { run(); }),
+      mThreadName(name) {
     const auto rxErrorHandler = [](const nlmsghdr& nlmsg, const Slice msg) {
         std::stringstream ss;
         ss << nlmsg << " " << msg << " " << netdutils::toHex(msg, 32);
@@ -105,6 +108,12 @@
         fn(nlmsg, buf);
     };
 
+    if (mThreadName.length() > 0) {
+        int ret = pthread_setname_np(pthread_self(), mThreadName.c_str());
+        if (ret) {
+            ALOGE("thread name set failed, name: %s, ret: %s", mThreadName.c_str(), strerror(ret));
+        }
+    }
     const auto& sys = sSyscalls.get();
     const std::array<Fd, 2> fds{{{mEvent}, {mSock}}};
     const int events = POLLIN;
diff --git a/server/NetlinkListener.h b/server/NetlinkListener.h
index 6e53c34..1373f20 100644
--- a/server/NetlinkListener.h
+++ b/server/NetlinkListener.h
@@ -70,7 +70,7 @@
 // netfilter extensions that allow batching of events like NFLOG.
 class NetlinkListener : public NetlinkListenerInterface {
   public:
-    NetlinkListener(netdutils::UniqueFd event, netdutils::UniqueFd sock);
+    NetlinkListener(netdutils::UniqueFd event, netdutils::UniqueFd sock, const std::string& name);
 
     ~NetlinkListener() override;
 
@@ -88,6 +88,7 @@
     std::mutex mMutex;
     std::map<uint16_t, DispatchFn> mDispatchMap;  // guarded by mMutex
     std::thread mWorker;
+    std::string mThreadName;
 };
 
 }  // namespace net
diff --git a/server/TrafficController.cpp b/server/TrafficController.cpp
index c15c4e6..b686ae8 100644
--- a/server/TrafficController.cpp
+++ b/server/TrafficController.cpp
@@ -121,7 +121,7 @@
     RETURN_IF_NOT_OK(sys.connect(sock, kernel));
 
     std::unique_ptr<NetlinkListenerInterface> listener =
-        std::make_unique<NetlinkListener>(std::move(event), std::move(sock));
+            std::make_unique<NetlinkListener>(std::move(event), std::move(sock), "SkDestroyListen");
 
     return listener;
 }