static int pagebucket; /* bucket for requests a page in size */
static int maxbuck; /* highest bucket receiving allocation request. */
+#ifdef SHELL
+extern int interrupt_immediately;
+extern int signal_is_trapped ();
+#endif
+
#if 0
/* Coalesce two adjacent free blocks off the free list for size NU - 1,
as long as there are at least MIN_COMBINE_FREE free blocks and we
}
static void
+block_signals (setp, osetp)
+ sigset_t *setp, *osetp;
+{
+#ifdef HAVE_POSIX_SIGNALS
+ sigfillset (setp);
+ sigemptyset (osetp);
+ sigprocmask (SIG_BLOCK, setp, osetp);
+#else
+# if defined (HAVE_BSD_SIGNALS)
+ *osetp = sigsetmask (-1);
+# endif
+#endif
+}
+
+static void
+unblock_signals (setp, osetp)
+ sigset_t *setp, *osetp;
+{
+#ifdef HAVE_POSIX_SIGNALS
+ sigprocmask (SIG_SETMASK, osetp, (sigset_t *)NULL);
+#else
+# if defined (HAVE_BSD_SIGNALS)
+ sigsetmask (*osetp);
+# endif
+#endif
+}
+
+static void
morecore (nu) /* ask system for more memory */
register int nu; /* size index to get more of */
{
register int nblks;
register long siz;
long sbrk_amt; /* amount to get via sbrk() */
+ sigset_t set, oset;
+ int blocked_sigs;
/* Block all signals in case we are executed from a signal handler. */
-#if defined (HAVE_BSD_SIGNALS)
- int oldmask;
- oldmask = sigsetmask (-1);
-#else
-# if defined (HAVE_POSIX_SIGNALS)
- sigset_t set, oset;
- sigfillset (&set);
- sigemptyset (&oset);
- sigprocmask (SIG_BLOCK, &set, &oset);
-# endif /* HAVE_POSIX_SIGNALS */
-#endif /* HAVE_BSD_SIGNALS */
+ blocked_sigs = 0;
+#ifdef SHELL
+ if (interrupt_immediately || signal_is_trapped (SIGINT) || signal_is_trapped (SIGCHLD))
+#endif
+ {
+ block_signals (&set, &oset);
+ blocked_sigs = 1;
+ }
siz = 1 << (nu + 3); /* size of desired block for nextf[nu] */
{
bcoalesce (nu);
if (nextf[nu] != 0)
- goto morecore_done;
+ goto morecore_done;
}
#endif
CHAIN (mp) = 0;
morecore_done:
-#if defined (HAVE_BSD_SIGNALS)
- sigsetmask (oldmask);
-#else
-# if defined (HAVE_POSIX_SIGNALS)
- sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
-# else
- ; /* nothing to do, but need a null statement before the brace */
-# endif
-#endif /* HAVE_BSD_SIGNALS */
+ if (blocked_sigs)
+ unblock_signals (&set, &oset);
}
#if defined (MEMSCRAMBLE) || !defined (NO_CALLOC)
pagesz = getpagesize ();
if (pagesz < 1024)
- pagesz = 1024;
+ pagesz = 1024;
/* OK, how much do we need to allocate to make things page-aligned?
- This partial page is wasted space. Once we figure out how much
- to advance the break pointer, go ahead and do it. */
+ This partial page is wasted space. Once we figure out how much
+ to advance the break pointer, go ahead and do it. */
sbrk_needed = pagesz - ((long)sbrk (0) & (pagesz - 1)); /* sbrk(0) % pagesz */
if (sbrk_needed < 0)
- sbrk_needed += pagesz;
+ sbrk_needed += pagesz;
/* Now allocate the wasted space. */
if (sbrk_needed)
- {
+ {
#ifdef MALLOC_STATS
_mstats.nsbrk++;
_mstats.tsbrk += sbrk_needed;
#endif
- if ((long)sbrk (sbrk_needed) == -1)
- return (NULL);
- }
+ if ((long)sbrk (sbrk_needed) == -1)
+ return (NULL);
+ }
nunits = 0;
nbytes = 8;
while (pagesz > nbytes)
- {
- nbytes <<= 1;
- nunits++;
- }
+ {
+ nbytes <<= 1;
+ nunits++;
+ }
pagebucket = nunits;
}
nunits = pagebucket;
amt = pagesz;
while (nbytes > amt)
- {
- amt <<= 1;
- nunits++;
- }
+ {
+ amt <<= 1;
+ nunits++;
+ }
}
/* In case this is reentrant use of malloc from signal handler,
void
print_malloc_stats (s)
+ char *s;
{
_print_malloc_stats (s, stderr);
}
void
trace_malloc_stats (s)
+ char *s;
{
char ibuf[32], *ip;
char fname[64];