SkSpinlock.cpp 557 B

12345678910111213141516171819202122
  1. /*
  2. * Copyright 2015 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "include/private/SkSpinlock.h"
  8. #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2
  9. #include <emmintrin.h>
  10. static void pause() { _mm_pause(); }
  11. #else
  12. static void pause() { /*spin*/ }
  13. #endif
  14. void SkSpinlock::contendedAcquire() {
  15. // To act as a mutex, we need an acquire barrier when we acquire the lock.
  16. while (fLocked.exchange(true, std::memory_order_acquire)) {
  17. pause();
  18. }
  19. }