1 /* simulate `sbrk' with an array in .bss, for `unexec' support for Cygwin;
 2    complete rewrite of xemacs Cygwin `unexec' code
 3 
 4    Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 5 
 6 This file is part of GNU Emacs.
 7 
 8 GNU Emacs is free software: you can redistribute it and/or modify
 9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12 
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
20 
21 #include <config.h>
22 #include <stdio.h>
23 #include <setjmp.h>
24 #include "lisp.h"
25 
26 #include <unistd.h>
27 
28 #define STATIC_HEAP_SIZE        (12 * 1024 * 1024)
29 
30 int debug_sheap = 0;
31 
32 #define BLOCKSIZE 4096
33 
34 char bss_sbrk_buffer[STATIC_HEAP_SIZE];
35 char *bss_sbrk_ptr;
36 int bss_sbrk_did_unexec;
37 
38 void *
39 bss_sbrk (ptrdiff_t request_size)
40 {
41   if (!bss_sbrk_ptr)
42     {
43       bss_sbrk_ptr = bss_sbrk_buffer;
44 #ifdef CYGWIN
45       sbrk (BLOCKSIZE);         /* force space for fork to work */
46 #endif
47     }
48 
49   if (!(int) request_size)
50     {
51       return (bss_sbrk_ptr);
52     }
53   else if (bss_sbrk_ptr + (int) request_size < bss_sbrk_buffer)
54     {
55       printf
56         ("attempt to free too much: avail %d used %d failed request %d\n",
57          STATIC_HEAP_SIZE, bss_sbrk_ptr - bss_sbrk_buffer,
58          (int) request_size);
59       exit (-1);
60       return 0;
61     }
62   else if (bss_sbrk_ptr + (int) request_size >
63            bss_sbrk_buffer + STATIC_HEAP_SIZE)
64     {
65       printf ("static heap exhausted: avail %d used %d failed request %d\n",
66               STATIC_HEAP_SIZE,
67               bss_sbrk_ptr - bss_sbrk_buffer, (int) request_size);
68       exit (-1);
69       return 0;
70     }
71   else if ((int) request_size < 0)
72     {
73       bss_sbrk_ptr += (int) request_size;
74       if (debug_sheap)
75         printf ("freed size %d\n", request_size);
76       return bss_sbrk_ptr;
77     }
78   else
79     {
80       char *ret = bss_sbrk_ptr;
81       if (debug_sheap)
82         printf ("allocated 0x%08x size %d\n", ret, request_size);
83       bss_sbrk_ptr += (int) request_size;
84       return ret;
85     }
86 }
87 
88 void
89 report_sheap_usage (int die_if_pure_storage_exceeded)
90 {
91   char buf[200];
92   sprintf (buf, "Static heap usage: %d of %d bytes",
93            bss_sbrk_ptr - bss_sbrk_buffer, STATIC_HEAP_SIZE);
94   message ("%s", buf);
95 }
96 
97 /* arch-tag: 1bc386e8-71c2-4da4-b8b5-c1674a9cf926
98    (do not change this comment) */