view src/sheap.c @ 66573:e65b759c6906

Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-630 Merge from gnus--rel--5.10 Patches applied: * gnus--rel--5.10 (patch 149-151) - Merge from emacs--cvs-trunk--0 - Update from CVS 2005-10-27 Reiner Steib <Reiner.Steib@gmx.de> * lisp/gnus/flow-fill.el (fill-flowed-encode-tests): Restore trailing whitespace removed in revision 7.8. Use concatenated string to protect trailing whitespace. 2005-10-27 Jouni K Seppanen <jks@iki.fi> (tiny change) * lisp/gnus/nnimap.el (nnimap-search-uids-not-since-is-evil): Add variable. (nnimap-request-expire-articles): Use it to avoid sending 'UID SEARCH UID ... NOT SINCE' queries, for inefficient servers like Courier IMAP ("some version from 2004"). Mostly based on similar code in the same function. 2005-10-26 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/message.el (message-display-completion-list): New function. (message-expand-group): Use it; make sure the Completions buffer is modifiable.
author Miles Bader <miles@gnu.org>
date Mon, 31 Oct 2005 07:07:28 +0000
parents a0d1312ede66
children d74deb025f5a 2d92f5c9d6ae
line wrap: on
line source

/* simulate sbrk() with an array in .bss, for unexec() support for Cygwin;
   complete rewrite of xemacs Cygwin unexec() code

   Copyright (C) 2004, 2005 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., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, 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);
}

/* arch-tag: 1bc386e8-71c2-4da4-b8b5-c1674a9cf926
   (do not change this comment) */