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;
}