allocation.inline.hpp revision 3465:d2a62e0f25eb
1/*
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_VM_MEMORY_ALLOCATION_INLINE_HPP
26#define SHARE_VM_MEMORY_ALLOCATION_INLINE_HPP
27
28#include "runtime/os.hpp"
29
30// Explicit C-heap memory management
31
32void trace_heap_malloc(size_t size, const char* name, void *p);
33void trace_heap_free(void *p);
34
35#ifndef PRODUCT
36// Increments unsigned long value for statistics (not atomic on MP).
37inline void inc_stat_counter(volatile julong* dest, julong add_value) {
38#if defined(SPARC) || defined(X86)
39  // Sparc and X86 have atomic jlong (8 bytes) instructions
40  julong value = Atomic::load((volatile jlong*)dest);
41  value += add_value;
42  Atomic::store((jlong)value, (volatile jlong*)dest);
43#else
44  // possible word-tearing during load/store
45  *dest += add_value;
46#endif
47}
48#endif
49
50// allocate using malloc; will fail if no memory available
51inline char* AllocateHeap(size_t size, MEMFLAGS flags, address pc = 0) {
52  if (pc == 0) {
53    pc = CURRENT_PC;
54  }
55  char* p = (char*) os::malloc(size, flags, pc);
56  #ifdef ASSERT
57  if (PrintMallocFree) trace_heap_malloc(size, "AllocateHeap", p);
58  #endif
59  if (p == NULL) vm_exit_out_of_memory(size, "AllocateHeap");
60  return p;
61}
62
63inline char* ReallocateHeap(char *old, size_t size, MEMFLAGS flags) {
64  char* p = (char*) os::realloc(old, size, flags, CURRENT_PC);
65  #ifdef ASSERT
66  if (PrintMallocFree) trace_heap_malloc(size, "ReallocateHeap", p);
67  #endif
68  if (p == NULL) vm_exit_out_of_memory(size, "ReallocateHeap");
69  return p;
70}
71
72inline void FreeHeap(void* p, MEMFLAGS memflags = mtInternal) {
73  #ifdef ASSERT
74  if (PrintMallocFree) trace_heap_free(p);
75  #endif
76  os::free(p, memflags);
77}
78
79
80template <MEMFLAGS F> void* CHeapObj<F>::operator new(size_t size,
81      address caller_pc){
82#ifdef ASSERT
83    void* p = (void*)AllocateHeap(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC));
84    if (PrintMallocFree) trace_heap_malloc(size, "CHeapObj-new", p);
85    return p;
86#else
87    return (void *) AllocateHeap(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC));
88#endif
89  }
90
91template <MEMFLAGS F> void* CHeapObj<F>::operator new (size_t size,
92  const std::nothrow_t&  nothrow_constant, address caller_pc) {
93#ifdef ASSERT
94    void* p = os::malloc(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC));
95    if (PrintMallocFree) trace_heap_malloc(size, "CHeapObj-new", p);
96    return p;
97#else
98    return os::malloc(size, F, (caller_pc != 0 ? caller_pc : CALLER_PC));
99#endif
100}
101
102template <MEMFLAGS F> void CHeapObj<F>::operator delete(void* p){
103   FreeHeap(p, F);
104}
105
106
107#endif // SHARE_VM_MEMORY_ALLOCATION_INLINE_HPP
108