Home | History | Annotate | Download | only in space
      1 /*
      2  * Copyright (C) 2013 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 #ifndef ART_RUNTIME_GC_SPACE_ROSALLOC_SPACE_INL_H_
     18 #define ART_RUNTIME_GC_SPACE_ROSALLOC_SPACE_INL_H_
     19 
     20 #include "rosalloc_space.h"
     21 
     22 #include "base/memory_tool.h"
     23 #include "gc/allocator/rosalloc-inl.h"
     24 #include "gc/space/memory_tool_settings.h"
     25 #include "thread.h"
     26 
     27 namespace art {
     28 namespace gc {
     29 namespace space {
     30 
     31 template<bool kThreadSafe>
     32 inline mirror::Object* RosAllocSpace::AllocCommon(Thread* self, size_t num_bytes,
     33                                                   size_t* bytes_allocated, size_t* usable_size,
     34                                                   size_t* bytes_tl_bulk_allocated) {
     35   size_t rosalloc_bytes_allocated = 0;
     36   size_t rosalloc_usable_size = 0;
     37   size_t rosalloc_bytes_tl_bulk_allocated = 0;
     38   if (!kThreadSafe) {
     39     Locks::mutator_lock_->AssertExclusiveHeld(self);
     40   }
     41   mirror::Object* result = reinterpret_cast<mirror::Object*>(
     42       rosalloc_->Alloc<kThreadSafe>(self, num_bytes, &rosalloc_bytes_allocated,
     43                                     &rosalloc_usable_size,
     44                                     &rosalloc_bytes_tl_bulk_allocated));
     45   if (LIKELY(result != nullptr)) {
     46     if (kDebugSpaces) {
     47       CHECK(Contains(result)) << "Allocation (" << reinterpret_cast<void*>(result)
     48             << ") not in bounds of allocation space " << *this;
     49     }
     50     DCHECK(bytes_allocated != nullptr);
     51     *bytes_allocated = rosalloc_bytes_allocated;
     52     DCHECK_EQ(rosalloc_usable_size, rosalloc_->UsableSize(result));
     53     if (usable_size != nullptr) {
     54       *usable_size = rosalloc_usable_size;
     55     }
     56     DCHECK(bytes_tl_bulk_allocated != nullptr);
     57     *bytes_tl_bulk_allocated = rosalloc_bytes_tl_bulk_allocated;
     58   }
     59   return result;
     60 }
     61 
     62 inline bool RosAllocSpace::CanAllocThreadLocal(Thread* self, size_t num_bytes) {
     63   return rosalloc_->CanAllocFromThreadLocalRun(self, num_bytes);
     64 }
     65 
     66 inline mirror::Object* RosAllocSpace::AllocThreadLocal(Thread* self, size_t num_bytes,
     67                                                        size_t* bytes_allocated) {
     68   DCHECK(bytes_allocated != nullptr);
     69   return reinterpret_cast<mirror::Object*>(
     70       rosalloc_->AllocFromThreadLocalRun(self, num_bytes, bytes_allocated));
     71 }
     72 
     73 inline size_t RosAllocSpace::MaxBytesBulkAllocatedForNonvirtual(size_t num_bytes) {
     74   return rosalloc_->MaxBytesBulkAllocatedFor(num_bytes);
     75 }
     76 
     77 }  // namespace space
     78 }  // namespace gc
     79 }  // namespace art
     80 
     81 #endif  // ART_RUNTIME_GC_SPACE_ROSALLOC_SPACE_INL_H_
     82