diff options
author | 2017-05-17 18:15:15 -0700 | |
---|---|---|
committer | 2017-05-17 18:27:26 -0700 | |
commit | 5577d39c380c63ad02a5ca2d7cc5f08c3ebee533 (patch) | |
tree | fbe99483740cebb34f35472a53c0fdf033035bfd | |
parent | 5c580eaeb6510fee596825d2435182cf9895ae10 (diff) |
Fix race condition in displayservice.
Also addressed a couple of format nits and added copyright headers.
Note, this race condition wouldn't have occured as is because the
service is only being served on one thread.
Test: no race condition still
Bug: 38311538
Change-Id: I7516c800eb89280a16468934677fa978daa5dcec
4 files changed, 58 insertions, 7 deletions
diff --git a/services/displayservice/DisplayEventReceiver.cpp b/services/displayservice/DisplayEventReceiver.cpp index a7fd3c5cba..5993e443e6 100644 --- a/services/displayservice/DisplayEventReceiver.cpp +++ b/services/displayservice/DisplayEventReceiver.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + #define LOG_TAG "libdisplayservicehidl" #include <displayservice/DisplayEventReceiver.h> @@ -43,12 +44,14 @@ sp<Looper> getLooper() { return looper; } -DisplayEventReceiver::AttachedEvent::AttachedEvent(const sp<IEventCallback> &callback) : mCallback(callback) { +DisplayEventReceiver::AttachedEvent::AttachedEvent(const sp<IEventCallback> &callback) + : mCallback(callback) +{ mLooperAttached = getLooper()->addFd(mFwkReceiver.getFd(), - Looper::POLL_CALLBACK, - Looper::EVENT_INPUT, - this, - nullptr); + Looper::POLL_CALLBACK, + Looper::EVENT_INPUT, + this, + nullptr); } DisplayEventReceiver::AttachedEvent::~AttachedEvent() { @@ -86,7 +89,7 @@ int DisplayEventReceiver::AttachedEvent::handleEvent(int fd, int events, void* / return 1; // keep the callback } - const static size_t SIZE = 1; + constexpr size_t SIZE = 1; ssize_t n; FwkReceiver::Event buf[SIZE]; @@ -149,11 +152,11 @@ Return<Status> DisplayEventReceiver::requestNextVsync() { } Return<Status> DisplayEventReceiver::close() { + std::unique_lock<std::mutex> lock(mMutex); if (mAttached == nullptr) { return Status::BAD_VALUE; } - std::unique_lock<std::mutex> lock(mMutex); bool success = mAttached->detach(); mAttached = nullptr; diff --git a/services/displayservice/DisplayService.cpp b/services/displayservice/DisplayService.cpp index 1699673188..18418fdd4f 100644 --- a/services/displayservice/DisplayService.cpp +++ b/services/displayservice/DisplayService.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include <displayservice/DisplayService.h> #include <displayservice/DisplayEventReceiver.h> diff --git a/services/displayservice/include/displayservice/DisplayEventReceiver.h b/services/displayservice/include/displayservice/DisplayEventReceiver.h index 83c0931c12..5d569b6d53 100644 --- a/services/displayservice/include/displayservice/DisplayEventReceiver.h +++ b/services/displayservice/include/displayservice/DisplayEventReceiver.h @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef ANDROID_FRAMEWORKS_DISPLAYSERVICE_V1_0_DISPLAYEVENTRECEIVER_H #define ANDROID_FRAMEWORKS_DISPLAYSERVICE_V1_0_DISPLAYEVENTRECEIVER_H diff --git a/services/displayservice/include/displayservice/DisplayService.h b/services/displayservice/include/displayservice/DisplayService.h index d92cb62cff..9722e7120d 100644 --- a/services/displayservice/include/displayservice/DisplayService.h +++ b/services/displayservice/include/displayservice/DisplayService.h @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef ANDROID_FRAMEWORKS_DISPLAYSERVICE_V1_0_DISPLAYSERVICE_H #define ANDROID_FRAMEWORKS_DISPLAYSERVICE_V1_0_DISPLAYSERVICE_H |