1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "locks.h" 18 19 #include "base/mutex.h" 20 21 namespace art { 22 23 Mutex* Locks::abort_lock_ = NULL; 24 Mutex* Locks::breakpoint_lock_ = NULL; 25 ReaderWriterMutex* Locks::classlinker_classes_lock_ = NULL; 26 ReaderWriterMutex* Locks::heap_bitmap_lock_ = NULL; 27 Mutex* Locks::logging_lock_ = NULL; 28 ReaderWriterMutex* Locks::mutator_lock_ = NULL; 29 Mutex* Locks::runtime_shutdown_lock_ = NULL; 30 Mutex* Locks::thread_list_lock_ = NULL; 31 Mutex* Locks::thread_suspend_count_lock_ = NULL; 32 Mutex* Locks::trace_lock_ = NULL; 33 Mutex* Locks::unexpected_signal_lock_ = NULL; 34 35 void Locks::Init() { 36 if (logging_lock_ != NULL) { 37 // Already initialized. 38 DCHECK(abort_lock_ != NULL); 39 DCHECK(breakpoint_lock_ != NULL); 40 DCHECK(classlinker_classes_lock_ != NULL); 41 DCHECK(heap_bitmap_lock_ != NULL); 42 DCHECK(logging_lock_ != NULL); 43 DCHECK(mutator_lock_ != NULL); 44 DCHECK(thread_list_lock_ != NULL); 45 DCHECK(thread_suspend_count_lock_ != NULL); 46 DCHECK(trace_lock_ != NULL); 47 DCHECK(unexpected_signal_lock_ != NULL); 48 } else { 49 logging_lock_ = new Mutex("logging lock", kLoggingLock, true); 50 abort_lock_ = new Mutex("abort lock", kAbortLock, true); 51 52 DCHECK(breakpoint_lock_ == NULL); 53 breakpoint_lock_ = new Mutex("breakpoint lock", kBreakpointLock); 54 DCHECK(classlinker_classes_lock_ == NULL); 55 classlinker_classes_lock_ = new ReaderWriterMutex("ClassLinker classes lock", 56 kClassLinkerClassesLock); 57 DCHECK(heap_bitmap_lock_ == NULL); 58 heap_bitmap_lock_ = new ReaderWriterMutex("heap bitmap lock", kHeapBitmapLock); 59 DCHECK(mutator_lock_ == NULL); 60 mutator_lock_ = new ReaderWriterMutex("mutator lock", kMutatorLock); 61 DCHECK(runtime_shutdown_lock_ == NULL); 62 runtime_shutdown_lock_ = new Mutex("runtime shutdown lock", kRuntimeShutdownLock); 63 DCHECK(thread_list_lock_ == NULL); 64 thread_list_lock_ = new Mutex("thread list lock", kThreadListLock); 65 DCHECK(thread_suspend_count_lock_ == NULL); 66 thread_suspend_count_lock_ = new Mutex("thread suspend count lock", kThreadSuspendCountLock); 67 DCHECK(trace_lock_ == NULL); 68 trace_lock_ = new Mutex("trace lock", kTraceLock); 69 DCHECK(unexpected_signal_lock_ == NULL); 70 unexpected_signal_lock_ = new Mutex("unexpected signal lock", kUnexpectedSignalLock, true); 71 } 72 } 73 74 } // namespace art 75