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