1 /* src/mm/codememory.c - code memory management
3 Copyright (C) 1996-2005, 2006, 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
30 #include <sys/mman.h> /* REMOVEME */
32 #include "threads/mutex.hpp"
33 #include "threads/thread.hpp"
35 #include "mm/codememory.h"
36 #include "mm/memory.hpp"
38 #include "vm/global.h"
39 #include "vm/options.h"
42 #if defined(ENABLE_STATISTICS)
43 # include "vm/statistics.h"
47 /* global code memory variables ***********************************************/
49 #define DEFAULT_CODE_MEMORY_SIZE 128 * 1024 /* defaulting to 128kB */
51 #if defined(ENABLE_THREADS)
52 static Mutex *code_memory_mutex = NULL;
54 static void *code_memory = NULL;
55 static int code_memory_size = 0;
56 static int pagesize = 0;
59 /* codememory_init *************************************************************
61 Initialize the code memory subsystem.
63 *******************************************************************************/
65 void codememory_init(void)
67 TRACESUBSYSTEMINITIALIZATION("codememory_init");
69 #if defined(ENABLE_THREADS)
70 /* create mutex for code memory */
72 code_memory_mutex = Mutex_new();
75 /* Get the pagesize of this architecture. */
77 pagesize = os_getpagesize();
81 /* codememory_get **************************************************************
83 Allocates memory from the heap via mmap and make the memory read-,
84 write-, and executeable.
86 *******************************************************************************/
88 void *codememory_get(size_t size)
92 Mutex_lock(code_memory_mutex);
94 size = MEMORY_ALIGN(size, ALIGNSIZE);
96 /* check if enough memory is available */
98 if (size > code_memory_size) {
99 /* set default code size */
101 code_memory_size = DEFAULT_CODE_MEMORY_SIZE;
103 /* do we need more? */
105 if (size > code_memory_size)
106 code_memory_size = size;
108 /* align the size of the memory to be allocated */
110 code_memory_size = MEMORY_ALIGN(code_memory_size, pagesize);
112 #if defined(ENABLE_STATISTICS)
114 codememusage += code_memory_size;
116 if (codememusage > maxcodememusage)
117 maxcodememusage = codememusage;
121 /* allocate the memory */
123 p = os_mmap_anonymous(NULL, code_memory_size,
124 PROT_READ | PROT_WRITE | PROT_EXEC,
127 /* set global code memory pointer */
132 /* get a memory chunk of the allocated memory */
136 code_memory = (void *) ((ptrint) code_memory + size);
137 code_memory_size -= size;
139 Mutex_unlock(code_memory_mutex);
145 /* codememory_release **********************************************************
147 Release the code memory and return it to the code memory
151 p ...... pointer to the code memory
152 size ... size of the code memory
154 *******************************************************************************/
156 void codememory_release(void *p, size_t size)
163 * These are local overrides for various environment variables in Emacs.
164 * Please do not remove this and leave it at the end of the file, where
165 * Emacs will automagically detect them.
166 * ---------------------------------------------------------------------
169 * indent-tabs-mode: t
173 * vim:noexpandtab:sw=4:ts=4: