15d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall/* 25d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * Copyright (C) 2014 The Android Open Source Project 35d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * 45d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * Licensed under the Apache License, Version 2.0 (the "License"); 55d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * you may not use this file except in compliance with the License. 65d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * You may obtain a copy of the License at 75d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * 85d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * http://www.apache.org/licenses/LICENSE-2.0 95d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * 105d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * Unless required by applicable law or agreed to in writing, software 115d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * distributed under the License is distributed on an "AS IS" BASIS, 125d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * See the License for the specific language governing permissions and 145d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall * limitations under the License. 155d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall */ 165d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall 1712f608f3d2089439a108788a1908941eea4277b9Puneet Lallpackage com.android.camera.one.v2.sharedimagereader.util; 185d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall 199c94ab32a69a1ad3642a0f1e38e68bcfd97d3511Puneet Lallimport com.android.camera.one.v2.camera2proxy.ForwardingImageProxy; 205d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lallimport com.android.camera.one.v2.camera2proxy.ImageProxy; 2112f608f3d2089439a108788a1908941eea4277b9Puneet Lallimport com.android.camera.one.v2.sharedimagereader.ticketpool.Ticket; 225d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall 2348fbf15e2c8806fc518f4c881ab17b1b548887d9Puneet Lallimport java.util.concurrent.atomic.AtomicBoolean; 2448fbf15e2c8806fc518f4c881ab17b1b548887d9Puneet Lall 251738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lallimport javax.annotation.concurrent.ThreadSafe; 261738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall 275d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall/** 2812f608f3d2089439a108788a1908941eea4277b9Puneet Lall * Combines an {@link ImageProxy} with a {@link Ticket}. 295d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall */ 301738db31add0aea5a6a6f2c137ca6fc476a10237Puneet Lall@ThreadSafe 3112f608f3d2089439a108788a1908941eea4277b9Puneet Lallpublic class TicketImageProxy extends ForwardingImageProxy { 3212f608f3d2089439a108788a1908941eea4277b9Puneet Lall private final Ticket mTicket; 3348fbf15e2c8806fc518f4c881ab17b1b548887d9Puneet Lall private final AtomicBoolean mClosed; 345d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall 3512f608f3d2089439a108788a1908941eea4277b9Puneet Lall public TicketImageProxy(ImageProxy image, Ticket ticket) { 365d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall super(image); 3712f608f3d2089439a108788a1908941eea4277b9Puneet Lall mTicket = ticket; 3848fbf15e2c8806fc518f4c881ab17b1b548887d9Puneet Lall mClosed = new AtomicBoolean(false); 395d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall } 405d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall 415d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall @Override 425d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall public void close() { 4348fbf15e2c8806fc518f4c881ab17b1b548887d9Puneet Lall if (mClosed.getAndSet(true)) { 4448fbf15e2c8806fc518f4c881ab17b1b548887d9Puneet Lall return; 4548fbf15e2c8806fc518f4c881ab17b1b548887d9Puneet Lall } 4612f608f3d2089439a108788a1908941eea4277b9Puneet Lall // The ticket must be closed *after* the image is closed to avoid a race 4712f608f3d2089439a108788a1908941eea4277b9Puneet Lall // condition here in which another image is reserved before this one is 4812f608f3d2089439a108788a1908941eea4277b9Puneet Lall // actually released. 4912f608f3d2089439a108788a1908941eea4277b9Puneet Lall super.close(); 5012f608f3d2089439a108788a1908941eea4277b9Puneet Lall mTicket.close(); 515d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall } 525d4fb6accab3bcbe737d52747c328de5cc092d02Puneet Lall} 53