Home | History | Annotate | Download | only in ports
      1 /* libs/graphics/ports/SkThread_none.cpp
      2 **
      3 ** Copyright 2008, The Android Open Source Project
      4 **
      5 ** Licensed under the Apache License, Version 2.0 (the "License");
      6 ** you may not use this file except in compliance with the License.
      7 ** You may obtain a copy of the License at
      8 **
      9 **     http://www.apache.org/licenses/LICENSE-2.0
     10 **
     11 ** Unless required by applicable law or agreed to in writing, software
     12 ** distributed under the License is distributed on an "AS IS" BASIS,
     13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 ** See the License for the specific language governing permissions and
     15 ** limitations under the License.
     16 */
     17 
     18 #include <windows.h>
     19 #include "SkThread.h"
     20 
     21 namespace {
     22 
     23 template <bool>
     24 struct CompileAssert {
     25 };
     26 
     27 }  // namespace
     28 
     29 #define COMPILE_ASSERT(expr, msg) \
     30   typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]
     31 
     32 int32_t sk_atomic_inc(int32_t* addr)
     33 {
     34     // InterlockedIncrement returns the new value, we want to return the old.
     35     return InterlockedIncrement(reinterpret_cast<LONG*>(addr)) - 1;
     36 }
     37 
     38 int32_t sk_atomic_dec(int32_t* addr)
     39 {
     40     return InterlockedDecrement(reinterpret_cast<LONG*>(addr)) + 1;
     41 }
     42 
     43 SkMutex::SkMutex(bool /* isGlobal */)
     44 {
     45     COMPILE_ASSERT(sizeof(fStorage) > sizeof(CRITICAL_SECTION),
     46                    NotEnoughSizeForCriticalSection);
     47     InitializeCriticalSection(reinterpret_cast<CRITICAL_SECTION*>(&fStorage));
     48 }
     49 
     50 SkMutex::~SkMutex()
     51 {
     52     DeleteCriticalSection(reinterpret_cast<CRITICAL_SECTION*>(&fStorage));
     53 }
     54 
     55 void SkMutex::acquire()
     56 {
     57     EnterCriticalSection(reinterpret_cast<CRITICAL_SECTION*>(&fStorage));
     58 }
     59 
     60 void SkMutex::release()
     61 {
     62     LeaveCriticalSection(reinterpret_cast<CRITICAL_SECTION*>(&fStorage));
     63 }
     64 
     65