OSDN Git Service

Fix race condition in displayservice.
authorSteven Moreland <smoreland@google.com>
Thu, 18 May 2017 01:15:15 +0000 (18:15 -0700)
committerSteven Moreland <smoreland@google.com>
Thu, 18 May 2017 01:27:26 +0000 (18:27 -0700)
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

services/displayservice/DisplayEventReceiver.cpp
services/displayservice/DisplayService.cpp
services/displayservice/include/displayservice/DisplayEventReceiver.h
services/displayservice/include/displayservice/DisplayService.h

index a7fd3c5..5993e44 100644 (file)
@@ -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;
 
index 1699673..18418fd 100644 (file)
@@ -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>
 
index 83c0931..5d569b6 100644 (file)
@@ -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
 
index d92cb62..9722e71 100644 (file)
@@ -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