summaryrefslogtreecommitdiff
path: root/src/sheap.c
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2004-04-13 20:08:53 +0000
committerStefan Monnier <monnier@iro.umontreal.ca>2004-04-13 20:08:53 +0000
commit3e62da9572b75828b3912e55a2eecf3f3e254a0c (patch)
treef7c1fbae48563b82f3c8eec911c44c73497f72ef /src/sheap.c
parentd50e9c52a8756b4d1431a7ff99abdbec30dd06c0 (diff)
downloademacs-3e62da9572b75828b3912e55a2eecf3f3e254a0c.tar.gz
New file.
Diffstat (limited to 'src/sheap.c')
-rw-r--r--src/sheap.c101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/sheap.c b/src/sheap.c
new file mode 100644
index 00000000000..e8ec8a00fd2
--- /dev/null
+++ b/src/sheap.c
@@ -0,0 +1,101 @@
+/* simulate sbrk() with an array in .bss, for unexec() support for Cygwin;
+ complete rewrite of xemacs Cygwin unexec() code
+
+ Copyright (C) 2004
+ Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include <config.h>
+#include <stdio.h>
+#include "lisp.h"
+
+#include <unistd.h>
+
+#ifdef HAVE_X_WINDOWS
+#define STATIC_HEAP_SIZE (7 * 1024 * 1024)
+#else
+#define STATIC_HEAP_SIZE (7 * 1024 * 1024)
+#endif
+
+int debug_sheap = 0;
+
+#define BLOCKSIZE 4096
+
+char bss_sbrk_buffer[STATIC_HEAP_SIZE];
+char *bss_sbrk_ptr;
+int bss_sbrk_did_unexec;
+
+void *
+bss_sbrk (ptrdiff_t request_size)
+{
+ if (!bss_sbrk_ptr)
+ {
+ bss_sbrk_ptr = bss_sbrk_buffer;
+#ifdef CYGWIN
+ sbrk (BLOCKSIZE); /* force space for fork to work */
+#endif
+ }
+
+ if (!(int) request_size)
+ {
+ return (bss_sbrk_ptr);
+ }
+ else if (bss_sbrk_ptr + (int) request_size < bss_sbrk_buffer)
+ {
+ printf
+ ("attempt to free too much: avail %d used %d failed request %d\n",
+ STATIC_HEAP_SIZE, bss_sbrk_ptr - bss_sbrk_buffer,
+ (int) request_size);
+ exit (-1);
+ return 0;
+ }
+ else if (bss_sbrk_ptr + (int) request_size >
+ bss_sbrk_buffer + STATIC_HEAP_SIZE)
+ {
+ printf ("static heap exhausted: avail %d used %d failed request %d\n",
+ STATIC_HEAP_SIZE,
+ bss_sbrk_ptr - bss_sbrk_buffer, (int) request_size);
+ exit (-1);
+ return 0;
+ }
+ else if ((int) request_size < 0)
+ {
+ bss_sbrk_ptr += (int) request_size;
+ if (debug_sheap)
+ printf ("freed size %d\n", request_size);
+ return bss_sbrk_ptr;
+ }
+ else
+ {
+ char *ret = bss_sbrk_ptr;
+ if (debug_sheap)
+ printf ("allocated 0x%08x size %d\n", ret, request_size);
+ bss_sbrk_ptr += (int) request_size;
+ return ret;
+ }
+}
+
+void
+report_sheap_usage (int die_if_pure_storage_exceeded)
+{
+ char buf[200];
+ sprintf (buf, "Static heap usage: %d of %d bytes",
+ bss_sbrk_ptr - bss_sbrk_buffer, STATIC_HEAP_SIZE);
+ message ("%s", buf);
+}