* Updated header: Added 2006. Changed address of FSF. Changed email
[cacao.git] / src / mm / nogc.c
index b4f4f59be0709cb27e245d1e04fd53e666c31d1e..91071d4f06dd07e3020f2f45d6f65a7708758816 100644 (file)
@@ -1,9 +1,9 @@
 /* src/mm/nogc.c - allocates memory through malloc (no GC)
 
-   Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
-   R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
-   C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
-   Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
+   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
+   J. Wenninger, Institut f. Computersprachen - TU Wien
 
    This file is part of CACAO.
 
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
 
-   Contact: cacao@complang.tuwien.ac.at
+   Contact: cacao@cacaojvm.org
 
    Authors: Christian Thalinger
 
    Changes:
 
-   $Id: nogc.c 2510 2005-05-23 10:19:31Z twisti $
+   $Id: nogc.c 4357 2006-01-22 23:33:38Z twisti $
 
 */
 
 
 #include <stdlib.h>
+#include <sys/mman.h>
+
+#include "config.h"
+#include "vm/types.h"
 
 #include "boehm-gc/include/gc.h"
 
 #include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/loader.h"
-#include "vm/tables.h"
+#include "vm/stringlocal.h"
 
 
-void *heap_alloc_uncollectable(u4 size)
-{
-       void *m;
+/* global stuff ***************************************************************/
 
-       m = calloc(size, 1);
+#define MMAP_HEAPADDRESS    0x10000000  /* try to map the heap to this addr.  */
+#define ALIGNSIZE           8
 
-       if (!m)
-               throw_cacao_exception_exit(string_java_lang_InternalError,
-                                                                  "Out of memory");
-       
-       return m;
-}
+static void *mmapptr = NULL;
+static int mmapsize = 0;
+static void *mmaptop = NULL;
 
 
 void *heap_allocate(u4 size, bool references, methodinfo *finalizer)
 {
        void *m;
 
-       m = calloc(size, 1);
+       mmapptr = (void *) ALIGN((ptrint) mmapptr, ALIGNSIZE);
+       
+       m = mmapptr;
+       mmapptr = (void *) ((ptrint) mmapptr + size);
 
-       if (!m)
+       if (mmapptr > mmaptop)
                throw_cacao_exception_exit(string_java_lang_InternalError,
                                                                   "Out of memory");
-       
+
+       MSET(m, 0, u1, size);
+
        return m;
 }
 
 
-void *heap_reallocate(void *p, u4 size)
+void *heap_alloc_uncollectable(u4 size)
 {
-       void *m;
+       return heap_allocate(size, false, NULL);
+}
 
-       m = realloc(p, size);
 
-       if (!m)
-               throw_cacao_exception_exit(string_java_lang_InternalError,
-                                                                  "Out of memory");
-       
-       return m;
+void *nogc_realloc(void *src, s4 len1, s4 len2)
+{
+       void *p;
+
+       p = heap_allocate(len2, false, NULL);
+
+       MCOPY(p, src, u1, len1);
+
+       return p;
 }
 
 
-static void gc_ignore_warnings(char *msg, GC_word arg)
+void heap_free(void *p)
 {
+       /* nop */
 }
 
 
-void gc_init(u4 heapmaxsize, u4 heapstartsize)
+
+void nogc_init(u4 heapmaxsize, u4 heapstartsize)
 {
-       size_t heapcurrentsize;
+       heapmaxsize = ALIGN(heapmaxsize, ALIGNSIZE);
 
-       GC_INIT();
+       mmapptr = mmap((void *) MMAP_HEAPADDRESS,
+                                  (size_t) heapmaxsize,
+                                  PROT_READ | PROT_WRITE,
+                                  MAP_PRIVATE | MAP_ANONYMOUS,
+                                  -1,
+                                  (off_t) 0);
 
-       /* set the maximal heap size */
-       GC_set_max_heap_size(heapmaxsize);
+       if (mmapptr == MAP_FAILED)
+               throw_cacao_exception_exit(string_java_lang_InternalError,
+                                                                  "Out of memory");
 
-       /* set the initial heap size */
-       heapcurrentsize = GC_get_heap_size();
-       if (heapstartsize > heapcurrentsize) {
-               GC_expand_hp(heapstartsize - heapcurrentsize);
-       }
+       mmapsize = heapmaxsize;
+       mmaptop = (void *) ((ptrint) mmapptr + mmapsize);
+}
 
-       /* define OOM function */
-/*     GC_oom_fn = gc_out_of_memory; */
 
-       /* suppress warnings */
-       GC_set_warn_proc(gc_ignore_warnings);
+void gc_init(u4 heapmaxsize, u4 heapstartsize)
+{
+       /* nop */
 }
 
 
-void gc_call()
+void gc_call(void)
 {
        log_text("GC call: nothing done...");
        /* nop */
 }
 
 
-s8 gc_get_heap_size()
+s8 gc_get_heap_size(void)
 {
        return 0;
 }
 
 
-s8 gc_get_free_bytes()
+s8 gc_get_free_bytes(void)
 {
        return 0;
 }
 
 
-s8 gc_get_max_heap_size()
+s8 gc_get_max_heap_size(void)
 {
        return 0;
 }
 
 
-void gc_invoke_finalizers()
+void gc_invoke_finalizers(void)
 {
        /* nop */
 }
 
 
-void gc_finalize_all()
+void gc_finalize_all(void)
 {
        /* nop */
 }