| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // The purpose of this file is to supply the macro definintions necessary |
| // to make third_party/dmg_fp/dtoa.cc threadsafe. |
| #include "base/lazy_instance.h" |
| #include "base/logging.h" |
| #include "base/synchronization/lock.h" |
| |
| // We need two locks because they're sometimes grabbed at the same time. |
| // A single lock would lead to an attempted recursive grab. |
| static base::LazyInstance<base::Lock>::Leaky |
| dtoa_lock_0 = LAZY_INSTANCE_INITIALIZER; |
| static base::LazyInstance<base::Lock>::Leaky |
| dtoa_lock_1 = LAZY_INSTANCE_INITIALIZER; |
| |
| /* |
| * This define and the code below is to trigger thread-safe behavior |
| * in dtoa.cc, per this comment from the file: |
| * |
| * #define MULTIPLE_THREADS if the system offers preemptively scheduled |
| * multiple threads. In this case, you must provide (or suitably |
| * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed |
| * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed |
| * in pow5mult, ensures lazy evaluation of only one copy of high |
| * powers of 5; omitting this lock would introduce a small |
| * probability of wasting memory, but would otherwise be harmless.) |
| * You must also invoke freedtoa(s) to free the value s returned by |
| * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined. |
| */ |
| #define MULTIPLE_THREADS |
| |
| inline static void ACQUIRE_DTOA_LOCK(size_t n) { |
| DCHECK(n < 2); |
| base::Lock* lock = n == 0 ? dtoa_lock_0.Pointer() : dtoa_lock_1.Pointer(); |
| lock->Acquire(); |
| } |
| |
| inline static void FREE_DTOA_LOCK(size_t n) { |
| DCHECK(n < 2); |
| base::Lock* lock = n == 0 ? dtoa_lock_0.Pointer() : dtoa_lock_1.Pointer(); |
| lock->Release(); |
| } |
| |
| #include "base/third_party/dmg_fp/dtoa.cc" |