11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkThread_DEFINED
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkThread_DEFINED
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypes.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkThread_platform.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/****** SkThread_platform needs to define the following...
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint32_t sk_atomic_inc(int32_t*);
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint32_t sk_atomic_dec(int32_t*);
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkMutex {
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkMutex();
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ~SkMutex();
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void    acquire();
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void    release();
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project****************/
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAutoMutexAcquire : SkNoncopyable {
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
344f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    explicit SkAutoMutexAcquire(SkBaseMutex& mutex) : fMutex(&mutex)
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(fMutex != NULL);
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        mutex.acquire();
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** If the mutex has not been release, release it now.
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ~SkAutoMutexAcquire()
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (fMutex)
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fMutex->release();
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** If the mutex has not been release, release it now.
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void release()
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (fMutex)
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        {
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fMutex->release();
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fMutex = NULL;
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
584f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    SkBaseMutex* fMutex;
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
62