remove Lisp_Free struct type
[bpt/emacs.git] / src / sheap.c
CommitLineData
acebbab3
RS
1/* simulate `sbrk' with an array in .bss, for `unexec' support for Cygwin;
2 complete rewrite of xemacs Cygwin `unexec' code
3e62da95 3
ba318903 4 Copyright (C) 2004-2014 Free Software Foundation, Inc.
3e62da95
SM
5
6This file is part of GNU Emacs.
7
9ec0b715 8GNU Emacs is free software: you can redistribute it and/or modify
3e62da95 9it under the terms of the GNU General Public License as published by
9ec0b715
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
3e62da95
SM
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9ec0b715 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
3e62da95
SM
20
21#include <config.h>
22#include <stdio.h>
0328b6de 23
3e62da95
SM
24#include "lisp.h"
25
26#include <unistd.h>
27
d74647c3 28#ifdef __x86_64__
f747d82e
KB
29#ifdef ENABLE_CHECKING
30#define STATIC_HEAP_SIZE (28 * 1024 * 1024)
31#else
32#define STATIC_HEAP_SIZE (19 * 1024 * 1024)
33#endif
34#else /* x86 */
35#ifdef ENABLE_CHECKING
d74647c3
KB
36#define STATIC_HEAP_SIZE (18 * 1024 * 1024)
37#else
5aef9e9a 38#define STATIC_HEAP_SIZE (13 * 1024 * 1024)
d74647c3 39#endif
f747d82e 40#endif /* x86 */
3e62da95
SM
41
42int debug_sheap = 0;
43
44#define BLOCKSIZE 4096
45
46char bss_sbrk_buffer[STATIC_HEAP_SIZE];
47char *bss_sbrk_ptr;
f747d82e 48char *max_bss_sbrk_ptr;
3e62da95
SM
49int bss_sbrk_did_unexec;
50
51void *
52bss_sbrk (ptrdiff_t request_size)
53{
54 if (!bss_sbrk_ptr)
55 {
f747d82e 56 max_bss_sbrk_ptr = bss_sbrk_ptr = bss_sbrk_buffer;
3e62da95
SM
57#ifdef CYGWIN
58 sbrk (BLOCKSIZE); /* force space for fork to work */
59#endif
60 }
61
62 if (!(int) request_size)
63 {
64 return (bss_sbrk_ptr);
65 }
66 else if (bss_sbrk_ptr + (int) request_size < bss_sbrk_buffer)
67 {
68 printf
69 ("attempt to free too much: avail %d used %d failed request %d\n",
70 STATIC_HEAP_SIZE, bss_sbrk_ptr - bss_sbrk_buffer,
71 (int) request_size);
72 exit (-1);
73 return 0;
74 }
75 else if (bss_sbrk_ptr + (int) request_size >
76 bss_sbrk_buffer + STATIC_HEAP_SIZE)
77 {
78 printf ("static heap exhausted: avail %d used %d failed request %d\n",
79 STATIC_HEAP_SIZE,
80 bss_sbrk_ptr - bss_sbrk_buffer, (int) request_size);
81 exit (-1);
82 return 0;
83 }
84 else if ((int) request_size < 0)
85 {
86 bss_sbrk_ptr += (int) request_size;
87 if (debug_sheap)
88 printf ("freed size %d\n", request_size);
89 return bss_sbrk_ptr;
90 }
91 else
92 {
93 char *ret = bss_sbrk_ptr;
94 if (debug_sheap)
95 printf ("allocated 0x%08x size %d\n", ret, request_size);
96 bss_sbrk_ptr += (int) request_size;
f747d82e
KB
97 if (bss_sbrk_ptr > max_bss_sbrk_ptr)
98 max_bss_sbrk_ptr = bss_sbrk_ptr;
3e62da95
SM
99 return ret;
100 }
101}
102
103void
104report_sheap_usage (int die_if_pure_storage_exceeded)
105{
106 char buf[200];
f747d82e
KB
107 sprintf (buf, "Maximum static heap usage: %d of %d bytes",
108 max_bss_sbrk_ptr - bss_sbrk_buffer, STATIC_HEAP_SIZE);
e11dacb5 109 /* Don't log messages, cause at this point, we're not allowed to create
d69f1120 110 buffers. */
6bcd97a4 111 message1_nolog (buf);
3e62da95 112}