annotate src/sheap.c @ 85414:f79d3fec6de7

(encoded-kbd-setup-display): Be careful not to remove keymaps that just happen to inherit from one of ours. When setting up our keymap, make sure it won't be accidentally modified by someone else.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Thu, 18 Oct 2007 18:53:28 +0000
parents 922696f363b0
children fc2bcd2a8aad f55f9811f5d7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66663
d74deb025f5a (STATIC_HEAP_SIZE): Increment both definitions.
Richard M. Stallman <rms@gnu.org>
parents: 64770
diff changeset
1 /* simulate `sbrk' with an array in .bss, for `unexec' support for Cygwin;
d74deb025f5a (STATIC_HEAP_SIZE): Increment both definitions.
Richard M. Stallman <rms@gnu.org>
parents: 64770
diff changeset
2 complete rewrite of xemacs Cygwin `unexec' code
54844
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
3
75348
3d45362f1d38 Add 2007 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 69554
diff changeset
4 Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
54844
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
5
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
6 This file is part of GNU Emacs.
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
7
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
8 GNU Emacs is free software; you can redistribute it and/or modify
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
9 it under the terms of the GNU General Public License as published by
78260
922696f363b0 Switch license to GPLv3 or later.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
10 the Free Software Foundation; either version 3, or (at your option)
54844
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
11 any later version.
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
12
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
13 GNU Emacs is distributed in the hope that it will be useful,
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
16 GNU General Public License for more details.
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
17
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
19 along with GNU Emacs; see the file COPYING. If not, write to
64084
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 54858
diff changeset
20 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 54858
diff changeset
21 Boston, MA 02110-1301, USA. */
54844
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
22
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
23 #include <config.h>
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
24 #include <stdio.h>
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
25 #include "lisp.h"
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
26
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
27 #include <unistd.h>
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
28
69554
e6104b603d86 (STATIC_HEAP_SIZE): Enlarge STATIC_HEAP_SIZE to 12MB.
Eli Zaretskii <eliz@gnu.org>
parents: 68651
diff changeset
29 #define STATIC_HEAP_SIZE (12 * 1024 * 1024)
54844
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
30
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
31 int debug_sheap = 0;
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
32
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
33 #define BLOCKSIZE 4096
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
34
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
35 char bss_sbrk_buffer[STATIC_HEAP_SIZE];
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
36 char *bss_sbrk_ptr;
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
37 int bss_sbrk_did_unexec;
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
38
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
39 void *
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
40 bss_sbrk (ptrdiff_t request_size)
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
41 {
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
42 if (!bss_sbrk_ptr)
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
43 {
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
44 bss_sbrk_ptr = bss_sbrk_buffer;
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
45 #ifdef CYGWIN
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
46 sbrk (BLOCKSIZE); /* force space for fork to work */
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
47 #endif
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
48 }
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
49
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
50 if (!(int) request_size)
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
51 {
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
52 return (bss_sbrk_ptr);
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
53 }
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
54 else if (bss_sbrk_ptr + (int) request_size < bss_sbrk_buffer)
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
55 {
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
56 printf
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
57 ("attempt to free too much: avail %d used %d failed request %d\n",
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
58 STATIC_HEAP_SIZE, bss_sbrk_ptr - bss_sbrk_buffer,
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
59 (int) request_size);
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
60 exit (-1);
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
61 return 0;
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
62 }
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
63 else if (bss_sbrk_ptr + (int) request_size >
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
64 bss_sbrk_buffer + STATIC_HEAP_SIZE)
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
65 {
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
66 printf ("static heap exhausted: avail %d used %d failed request %d\n",
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
67 STATIC_HEAP_SIZE,
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
68 bss_sbrk_ptr - bss_sbrk_buffer, (int) request_size);
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
69 exit (-1);
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
70 return 0;
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
71 }
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
72 else if ((int) request_size < 0)
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
73 {
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
74 bss_sbrk_ptr += (int) request_size;
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
75 if (debug_sheap)
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
76 printf ("freed size %d\n", request_size);
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
77 return bss_sbrk_ptr;
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
78 }
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
79 else
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
80 {
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
81 char *ret = bss_sbrk_ptr;
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
82 if (debug_sheap)
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
83 printf ("allocated 0x%08x size %d\n", ret, request_size);
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
84 bss_sbrk_ptr += (int) request_size;
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
85 return ret;
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
86 }
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
87 }
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
88
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
89 void
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
90 report_sheap_usage (int die_if_pure_storage_exceeded)
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
91 {
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
92 char buf[200];
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
93 sprintf (buf, "Static heap usage: %d of %d bytes",
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
94 bss_sbrk_ptr - bss_sbrk_buffer, STATIC_HEAP_SIZE);
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
95 message ("%s", buf);
36dec396c129 New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
96 }
54858
44a3fff23885 Changes from arch/CVS synchronization
Miles Bader <miles@gnu.org>
parents: 54844
diff changeset
97
44a3fff23885 Changes from arch/CVS synchronization
Miles Bader <miles@gnu.org>
parents: 54844
diff changeset
98 /* arch-tag: 1bc386e8-71c2-4da4-b8b5-c1674a9cf926
44a3fff23885 Changes from arch/CVS synchronization
Miles Bader <miles@gnu.org>
parents: 54844
diff changeset
99 (do not change this comment) */