Allow registering multiple event listeners from the same process

Rather than store the listener in a map keyed by the pid of thecaller,
we simply store them in a set keyed by the unique address of the binder
interface itself.

Test: system/netd/tests/runtests.sh
Change-Id: I811ff356653334df9fb4afa8501cd9375f1bdd68
diff --git a/server/EventReporter.h b/server/EventReporter.h
index 76a0cee..f471d7f 100644
--- a/server/EventReporter.h
+++ b/server/EventReporter.h
@@ -17,9 +17,8 @@
 #ifndef NETD_SERVER_EVENT_REPORTER_H
 #define NETD_SERVER_EVENT_REPORTER_H
 
-#include <atomic>
-#include <map>
 #include <mutex>
+#include <set>
 
 #include <android-base/thread_annotations.h>
 #include <binder/IServiceManager.h>
@@ -32,27 +31,25 @@
  */
 class EventReporter {
   public:
+    using UnsolListeners = std::set<const android::sp<android::net::INetdUnsolicitedEventListener>>;
+
     // Returns the binder reference to the netd events listener service, attempting to fetch it if
     // we do not have it already. This method is threadsafe.
     android::sp<android::net::metrics::INetdEventListener> getNetdEventListener();
-    using UnsolListenerMap =
-            std::map<pid_t, const android::sp<android::net::INetdUnsolicitedEventListener>>;
-    UnsolListenerMap getNetdUnsolicitedEventListenerVec() EXCLUDES(mUnsolicitedMutex);
+
+    // Returns a copy of the registered listeners.
+    UnsolListeners getNetdUnsolicitedEventListeners() EXCLUDES(mUnsolicitedMutex);
+
     void registerUnsolEventListener(
-            pid_t pid, const android::sp<android::net::INetdUnsolicitedEventListener>& listener)
+            const android::sp<android::net::INetdUnsolicitedEventListener>& listener)
             EXCLUDES(mUnsolicitedMutex);
 
   private:
-    // TODO: consider changing this into an atomic type such as
-    // std::atomic<android::net::metrics::INetdEventListener> and deleting the mutex.
-    //
-    // Alternatively, if this locking causes a performance penalty, have each single-threaded
-    // caller (FwmarkServer) keep their own per-thread copy of NetdEventListener
-    // and remove mNetdEventListener entirely.
     std::mutex mEventMutex;
     std::mutex mUnsolicitedMutex;
-    android::sp<android::net::metrics::INetdEventListener> mNetdEventListener;
-    UnsolListenerMap mNetdUnsolicitedEventListenerMap GUARDED_BY(mUnsolicitedMutex);
+    android::sp<android::net::metrics::INetdEventListener> mNetdEventListener
+            GUARDED_BY(mEventMutex);
+    UnsolListeners mUnsolListeners GUARDED_BY(mUnsolicitedMutex);
 };
 
 #endif  // NETD_SERVER_EVENT_REPORTER_H