diff options
| author | 2017-02-22 18:40:04 +0000 | |
|---|---|---|
| committer | 2017-02-22 18:40:04 +0000 | |
| commit | fdf61aa5576b673aa070d4cf715c63f14dbc2c2c (patch) | |
| tree | 7a2f732d2c52d547bb3b901a143446df30427a6d /cmds | |
| parent | 33f4b64f23978b99088a0afeee662bc211cc9f17 (diff) | |
| parent | 057e74631b8b1c658ec9b67684bf486e1ec3e7e5 (diff) | |
Merge "lshal: Fix timeout causes unexpected exits."
am: 057e74631b
Change-Id: Iadfbc11f8bbfc45759f2214d0811922cbb173758
Diffstat (limited to 'cmds')
| -rw-r--r-- | cmds/lshal/Lshal.cpp | 8 | ||||
| -rw-r--r-- | cmds/lshal/Timeout.h | 32 | 
2 files changed, 32 insertions, 8 deletions
diff --git a/cmds/lshal/Lshal.cpp b/cmds/lshal/Lshal.cpp index ce058c8a47..6fd9b21368 100644 --- a/cmds/lshal/Lshal.cpp +++ b/cmds/lshal/Lshal.cpp @@ -469,9 +469,17 @@ int Lshal::main(int argc, char **argv) {      return status;  } +void signalHandler(int sig) { +    if (sig == SIGINT) { +        int retVal; +        pthread_exit(&retVal); +    } +} +  }  // namespace lshal  }  // namespace android  int main(int argc, char **argv) { +    signal(SIGINT, ::android::lshal::signalHandler);      return ::android::lshal::Lshal{}.main(argc, argv);  } diff --git a/cmds/lshal/Timeout.h b/cmds/lshal/Timeout.h index 001c3d6790..ca477bf615 100644 --- a/cmds/lshal/Timeout.h +++ b/cmds/lshal/Timeout.h @@ -29,7 +29,8 @@ static constexpr std::chrono::milliseconds IPC_CALL_WAIT{500};  class BackgroundTaskState {  public: -    BackgroundTaskState(){} +    BackgroundTaskState(std::function<void(void)> &&func) +            : mFunc(std::forward<decltype(func)>(func)) {}      void notify() {          std::unique_lock<std::mutex> lock(mMutex);          mFinished = true; @@ -42,22 +43,37 @@ public:          mCondVar.wait_until(lock, end, [this](){ return this->mFinished; });          return mFinished;      } +    void operator()() { +        mFunc(); +    }  private:      std::mutex mMutex;      std::condition_variable mCondVar;      bool mFinished = false; +    std::function<void(void)> mFunc;  }; +void *callAndNotify(void *data) { +    BackgroundTaskState &state = *static_cast<BackgroundTaskState *>(data); +    state(); +    state.notify(); +    return NULL; +} +  template<class R, class P> -bool timeout(std::chrono::duration<R, P> delay, const std::function<void(void)> &func) { +bool timeout(std::chrono::duration<R, P> delay, std::function<void(void)> &&func) {      auto now = std::chrono::system_clock::now(); -    BackgroundTaskState state{}; -    std::thread t([&state, &func] { -        func(); -        state.notify(); -    }); -    t.detach(); +    BackgroundTaskState state{std::forward<decltype(func)>(func)}; +    pthread_t thread; +    if (pthread_create(&thread, NULL, callAndNotify, &state)) { +        std::cerr << "FATAL: could not create background thread." << std::endl; +        return false; +    }      bool success = state.wait(now + delay); +    if (!success) { +        pthread_kill(thread, SIGINT); +    } +    pthread_join(thread, NULL);      return success;  }  |