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

Commit 0963dbd0 authored by Eric Jeong's avatar Eric Jeong
Browse files

Stop socket listener when terminating by SIGTERM

- During the termination, StatsService is stopped while
StatsSocketListener is still running.
- This could cause invalid thread access.

Bug: 147316537
Test: Run a test app which keeps sending StatsLog and repeatedly execute
adb shell su root kill `pidof statsd`. statsd should not crash.

Change-Id: Iedd2dcb892f704bdba9adc864afa696de64b8e4c
parent 9a419cda
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -37,6 +37,7 @@ using std::shared_ptr;
using std::make_shared;
using std::make_shared;


shared_ptr<StatsService> gStatsService = nullptr;
shared_ptr<StatsService> gStatsService = nullptr;
sp<StatsSocketListener> gSocketListener = nullptr;


void signalHandler(int sig) {
void signalHandler(int sig) {
    if (sig == SIGPIPE) {
    if (sig == SIGPIPE) {
@@ -47,6 +48,7 @@ void signalHandler(int sig) {
        return;
        return;
    }
    }


    if (gSocketListener != nullptr) gSocketListener->stopListener();
    if (gStatsService != nullptr) gStatsService->Terminate();
    if (gStatsService != nullptr) gStatsService->Terminate();
    ALOGW("statsd terminated on receiving signal %d.", sig);
    ALOGW("statsd terminated on receiving signal %d.", sig);
    exit(1);
    exit(1);
@@ -92,11 +94,11 @@ int main(int /*argc*/, char** /*argv*/) {


    gStatsService->Startup();
    gStatsService->Startup();


    sp<StatsSocketListener> socketListener = new StatsSocketListener(eventQueue);
    gSocketListener = new StatsSocketListener(eventQueue);


    ALOGI("Statsd starts to listen to socket.");
    ALOGI("Statsd starts to listen to socket.");
    // Backlog and /proc/sys/net/unix/max_dgram_qlen set to large value
    // Backlog and /proc/sys/net/unix/max_dgram_qlen set to large value
    if (socketListener->startListener(600)) {
    if (gSocketListener->startListener(600)) {
        exit(1);
        exit(1);
    }
    }