Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d2c8928 authored by Mike Yu's avatar Mike Yu
Browse files

Improve the way to get binder service in ResolverEventReporter

To prevent DNS lookup threads from being blocked by waiting for
the netd_listener service ready, use non-blocking call to get the
service.

Test: system/netd/tests/runtests.sh passed
Change-Id: I1148d49f87cce4091e18b5cfaf363177f4fdbfd0
parent 303b0dfd
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -300,7 +300,10 @@ void reportDnsEvent(int eventType, const android_net_context& netContext, int la
                               latencyUs);

    const std::shared_ptr<INetdEventListener> listener = ResolverEventReporter::getListener();
    if (!listener) return;
    if (!listener) {
        ALOGE("DNS event not sent since NetdEventListenerService is unavailable.");
        return;
    }
    const int latencyMs = latencyUs / 1000;
    listener->onDnsEvent(netContext.dns_netid, eventType, returnCode, latencyMs, query_name,
                         ip_addrs, total_ip_addr_count, netContext.uid);
+12 −7
Original line number Diff line number Diff line
@@ -14,20 +14,25 @@
 * limitations under the License.
 */

#include <android/binder_manager.h>

#include "ResolverEventReporter.h"

#include <android/binder_manager.h>

using aidl::android::net::metrics::INetdEventListener;

std::shared_ptr<INetdEventListener> ResolverEventReporter::getListener() {
    // It should be initialized only once.
    static ResolverEventReporter reporter;

    return reporter.mListener;
    return reporter.getNetdEventListener();
}

ResolverEventReporter::ResolverEventReporter() {
    ndk::SpAIBinder binder = ndk::SpAIBinder(AServiceManager_getService("netd_listener"));
std::shared_ptr<INetdEventListener> ResolverEventReporter::getNetdEventListener() {
    std::lock_guard lock(mEventMutex);
    if (mListener == nullptr) {
        // Use the non-blocking call AServiceManager_checkService in order not to delay DNS
        // lookup threads when the netd_listener service is not ready.
        ndk::SpAIBinder binder = ndk::SpAIBinder(AServiceManager_checkService("netd_listener"));
        mListener = INetdEventListener::fromBinder(binder);
    }
    return mListener;
}
+7 −3
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
#ifndef NETD_RESOLV_EVENT_REPORTER_H
#define NETD_RESOLV_EVENT_REPORTER_H

#include <android-base/thread_annotations.h>

#include "aidl/android/net/metrics/INetdEventListener.h"

/*
@@ -29,10 +31,12 @@ class ResolverEventReporter {
    static std::shared_ptr<aidl::android::net::metrics::INetdEventListener> getListener();

  private:
    // Get netd events listener binder.
    ResolverEventReporter();
    std::mutex mEventMutex;
    std::shared_ptr<aidl::android::net::metrics::INetdEventListener> mListener
            GUARDED_BY(mEventMutex);

    std::shared_ptr<aidl::android::net::metrics::INetdEventListener> mListener;
    std::shared_ptr<aidl::android::net::metrics::INetdEventListener> getNetdEventListener()
            EXCLUDES(mEventMutex);
};

#endif  // NETD_RESOLV_EVENT_REPORTER_H