|  | // 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" | 
|  |  | 
|  | #undef Bias  // Avoid windows jumbo build breakage. | 
|  | #undef Long  // To avoid breaking jni code in jumbo builds |