Home | History | Annotate | Download | only in surfaceflinger
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <stdlib.h>
     18 #include <stdint.h>
     19 #include <sys/types.h>
     20 
     21 #include <utils/Errors.h>
     22 
     23 #include "SurfaceFlinger.h"
     24 #include "SurfaceTextureLayer.h"
     25 
     26 namespace android {
     27 // ---------------------------------------------------------------------------
     28 
     29 
     30 SurfaceTextureLayer::SurfaceTextureLayer(const sp<SurfaceFlinger>& flinger)
     31     : BufferQueue(), flinger(flinger) {
     32 }
     33 
     34 SurfaceTextureLayer::~SurfaceTextureLayer() {
     35     // remove ourselves from SurfaceFlinger's list. We do this asynchronously
     36     // because we don't know where this dtor is called from, it could be
     37     // called with the mStateLock held, leading to a dead-lock (it actually
     38     // happens).
     39     class MessageCleanUpList : public MessageBase {
     40         sp<SurfaceFlinger> flinger;
     41         wp<IBinder> gbp;
     42     public:
     43         MessageCleanUpList(const sp<SurfaceFlinger>& flinger, const wp<IBinder>& gbp)
     44             : flinger(flinger), gbp(gbp) { }
     45         virtual bool handler() {
     46             Mutex::Autolock _l(flinger->mStateLock);
     47             flinger->mGraphicBufferProducerList.remove(gbp);
     48             return true;
     49         }
     50     };
     51     flinger->postMessageAsync(
     52             new MessageCleanUpList(flinger, static_cast<BnGraphicBufferProducer*>(this)) );
     53 }
     54 
     55 // ---------------------------------------------------------------------------
     56 }; // namespace android
     57