work on docs
[pspp] / src / libpspp / pool.c
index 7a8a591da58a7e84ebaf6952f784cec17f7571d0..5309c729efa77c2f5ce66cf1e9521a64fc16489d 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2000, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2010, 2011, 2012 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -26,6 +26,7 @@
 #include "libpspp/temp-file.h"
 #include "libpspp/str.h"
 
+#include "gl/xalloc-oversized.h"
 #include "gl/xalloc.h"
 
 /* Fast, low-overhead memory block suballocator. */
@@ -96,10 +97,16 @@ union align
     void (*fp) (void);
     long l;
     double d;
+
+    /* glibc jmp_buf on ia64 requires 16-byte alignment.  This ensures it. */
+    size_t s[2];
   };
 
 /* This should be the alignment size used by malloc().  The size of
-   the union above is correct, if not optimal, in all known cases. */
+   the union above is correct, if not optimal, in all known cases.
+
+   This is normally 8 bytes for 32-bit architectures and 16 bytes for 64-bit
+   architectures. */
 #define ALIGN_SIZE sizeof (union align)
 
 /* DISCRETE_BLOCKS may be declared as nonzero to prevent
@@ -299,7 +306,8 @@ pool_alloc (struct pool *pool, size_t amt)
 void *
 pool_alloc_unaligned (struct pool *pool, size_t amt)
 {
-  assert (pool != NULL);
+  if (pool == NULL)
+    return xmalloc (amt);
 
 #ifndef DISCRETE_BLOCKS
   /* Strings need not be aligned on any boundary, but some