blob: 575558dccfd373df464315d0f1e3d86936e3e4f6 [file] [log] [blame]
Alex Lightbf64a572017-07-05 10:34:49 -07001/* 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
Alex Light46f25032017-07-07 13:43:29 -070034#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
Alex Light8ddfd9f2017-07-05 16:33:46 -070038#include <malloc.h>
Alex Light46f25032017-07-07 13:43:29 -070039#endif
40
Alex Light8ddfd9f2017-07-05 16:33:46 -070041#include <atomic>
42
Alex Lightbf64a572017-07-05 10:34:49 -070043#include "art_jvmti.h"
Alex Lightbf64a572017-07-05 10:34:49 -070044#include "base/enums.h"
Alex Lightbf64a572017-07-05 10:34:49 -070045
46namespace openjdkjvmti {
47
Alex Light8ddfd9f2017-07-05 16:33:46 -070048std::atomic<jlong> AllocUtil::allocated;
49
50jvmtiError 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
Alex Lightbf64a572017-07-05 10:34:49 -070059jvmtiError 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 }
Alex Lightc19cd2f2017-07-06 14:12:13 -070068 *mem_ptr = AllocateImpl(size);
Alex Light8ddfd9f2017-07-05 16:33:46 -070069 if (UNLIKELY(*mem_ptr == nullptr)) {
70 return ERR(OUT_OF_MEMORY);
71 }
Alex Light8ddfd9f2017-07-05 16:33:46 -070072 return OK;
Alex Lightbf64a572017-07-05 10:34:49 -070073}
74
Alex Lightc19cd2f2017-07-06 14:12:13 -070075unsigned 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
Alex Lightbf64a572017-07-05 10:34:49 -070083jvmtiError AllocUtil::Deallocate(jvmtiEnv* env ATTRIBUTE_UNUSED, unsigned char* mem) {
Alex Lightc19cd2f2017-07-06 14:12:13 -070084 DeallocateImpl(mem);
85 return OK;
86}
87
88void AllocUtil::DeallocateImpl(unsigned char* mem) {
Alex Lightbf64a572017-07-05 10:34:49 -070089 if (mem != nullptr) {
Alex Light8ddfd9f2017-07-05 16:33:46 -070090 allocated -= malloc_usable_size(mem);
Alex Lightbf64a572017-07-05 10:34:49 -070091 free(mem);
92 }
Alex Lightbf64a572017-07-05 10:34:49 -070093}
94
95} // namespace openjdkjvmti