Home | History | Annotate | Download | only in openjdkjvmti
      1 /* Copyright (C) 2016 The Android Open Source Project
      2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      3  *
      4  * This file implements interfaces from the file jvmti.h. This implementation
      5  * is licensed under the same terms as the file jvmti.h.  The
      6  * copyright and license information for the file jvmti.h follows.
      7  *
      8  * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
      9  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     10  *
     11  * This code is free software; you can redistribute it and/or modify it
     12  * under the terms of the GNU General Public License version 2 only, as
     13  * published by the Free Software Foundation.  Oracle designates this
     14  * particular file as subject to the "Classpath" exception as provided
     15  * by Oracle in the LICENSE file that accompanied this code.
     16  *
     17  * This code is distributed in the hope that it will be useful, but WITHOUT
     18  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     19  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     20  * version 2 for more details (a copy is included in the LICENSE file that
     21  * accompanied this code).
     22  *
     23  * You should have received a copy of the GNU General Public License version
     24  * 2 along with this work; if not, write to the Free Software Foundation,
     25  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     26  *
     27  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     28  * or visit www.oracle.com if you need additional information or have any
     29  * questions.
     30  */
     31 
     32 #include "ti_allocator.h"
     33 
     34 #if defined(__APPLE__)
     35 // Apple doesn't have malloc.h. Just give this function a non-functional definition.
     36 #define malloc_usable_size(P) 0
     37 #else
     38 #include <malloc.h>
     39 #endif
     40 
     41 #include <atomic>
     42 
     43 #include "art_jvmti.h"
     44 #include "base/enums.h"
     45 
     46 namespace openjdkjvmti {
     47 
     48 std::atomic<jlong> AllocUtil::allocated;
     49 
     50 jvmtiError AllocUtil::GetGlobalJvmtiAllocationState(jvmtiEnv* env ATTRIBUTE_UNUSED,
     51                                                     jlong* allocated_ptr) {
     52   if (allocated_ptr == nullptr) {
     53     return ERR(NULL_POINTER);
     54   }
     55   *allocated_ptr = allocated.load();
     56   return OK;
     57 }
     58 
     59 jvmtiError AllocUtil::Allocate(jvmtiEnv* env ATTRIBUTE_UNUSED,
     60                                jlong size,
     61                                unsigned char** mem_ptr) {
     62   if (size < 0) {
     63     return ERR(ILLEGAL_ARGUMENT);
     64   } else if (size == 0) {
     65     *mem_ptr = nullptr;
     66     return OK;
     67   }
     68   *mem_ptr = AllocateImpl(size);
     69   if (UNLIKELY(*mem_ptr == nullptr)) {
     70     return ERR(OUT_OF_MEMORY);
     71   }
     72   return OK;
     73 }
     74 
     75 unsigned char* AllocUtil::AllocateImpl(jlong size) {
     76   unsigned char* ret = size != 0 ? reinterpret_cast<unsigned char*>(malloc(size)) : nullptr;
     77   if (LIKELY(ret != nullptr)) {
     78     allocated += malloc_usable_size(ret);
     79   }
     80   return ret;
     81 }
     82 
     83 jvmtiError AllocUtil::Deallocate(jvmtiEnv* env ATTRIBUTE_UNUSED, unsigned char* mem) {
     84   DeallocateImpl(mem);
     85   return OK;
     86 }
     87 
     88 void AllocUtil::DeallocateImpl(unsigned char* mem) {
     89   if (mem != nullptr) {
     90     allocated -= malloc_usable_size(mem);
     91     free(mem);
     92   }
     93 }
     94 
     95 }  // namespace openjdkjvmti
     96