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