* nscd/mem.c (MAX_STACK_USE): Remove definition here.
(gc): Initialize stack_used based on allocation in prune_cache.
* nscd/cache.c (prune_cache): Use heap for mark array if necessary.
Clear array bfore use.
* nscd/aicache.c (addhstaiX): Update statistics counter in case
memory allocate failed.
+2007-11-25 Ulrich Drepper <drepper@redhat.com>
+
+ * nscd/nscd.h (MAX_STACK_USE): Define.
+ * nscd/mem.c (MAX_STACK_USE): Remove definition here.
+ (gc): Initialize stack_used based on allocation in prune_cache.
+ * nscd/cache.c (prune_cache): Use heap for mark array if necessary.
+ Clear array bfore use.
+
+ * nscd/aicache.c (addhstaiX): Update statistics counter in case
+ memory allocate failed.
+
2007-11-23 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/powerpc/powerpc64/syscalls.list: Add open
= (struct dataset *) mempool_alloc (db,
total
+ req->key_len);
- if (newp != NULL)
+ if (__builtin_expect (newp != NULL, 1))
{
/* Adjust pointer into the memory block. */
key_copy = (char *) newp + (key_copy
total + req->key_len);
alloca_used = false;
}
+ else
+ ++db->head->addfailed;
/* Mark the old record as obsolete. */
dh->usable = false;
#include "dbg_log.h"
+/* Wrapper functions with error checking for standard functions. */
+extern void *xcalloc (size_t n, size_t s);
+
+
/* Number of times a value is reloaded without being used. UINT_MAX
means unlimited. */
unsigned int reload_count = DEFAULT_RELOAD_LIMIT;
we don't need to get any lock. It is at all timed assured that the
linked lists are set up correctly and that no second thread prunes
the cache. */
- bool mark[cnt];
+ bool *mark;
+ size_t memory_needed = cnt * sizeof (bool);
+ bool mark_use_alloca;
+ if (__builtin_expect (memory_needed <= MAX_STACK_USE, 1))
+ {
+ mark = alloca (cnt * sizeof (bool));
+ memset (mark, '\0', memory_needed);
+ mark_use_alloca = true;
+ }
+ else
+ {
+ mark = xcalloc (1, memory_needed);
+ mark_use_alloca = false;
+ }
size_t first = cnt + 1;
size_t last = 0;
char *const data = table->data;
}
}
+ if (__builtin_expect (mark_use_alloca, 0))
+ free (mark);
+
/* Run garbage collection if any entry has been removed or replaced. */
if (any)
gc (table);
#define ALLBITS ((((BITMAP_T) 1) << BITS) - 1)
#define HIGHBIT (((BITMAP_T) 1) << (BITS - 1))
-/* Maximum size of stack frames we allow the thread to use. We use
- 80% of the thread stack size. */
-#define MAX_STACK_USE ((8 * NSCD_THREAD_STACKSIZE) / 10)
-
static void
markrange (BITMAP_T *mark, ref_t start, size_t len)
BITMAP_T *mark;
bool mark_use_malloc;
- size_t stack_used = 0;
+ /* In prune_cache we are also using a dynamically allocated array.
+ If the array in the caller is too large we have malloc'ed it. */
+ size_t stack_used = sizeof (bool) * db->head->module;
+ if (__builtin_expect (stack_used > MAX_STACK_USE, 0))
+ stack_used = 0;
size_t memory_needed = ((db->head->first_free / BLOCK_ALIGN + BITS - 1)
/ BITS) * sizeof (BITMAP_T);
if (memory_needed <= MAX_STACK_USE)
/* Stack size for worker threads. */
#define NSCD_THREAD_STACKSIZE 1024 * 1024 * (sizeof (void *) / 4)
+/* Maximum size of stack frames we allow the thread to use. We use
+ 80% of the thread stack size. */
+#define MAX_STACK_USE ((8 * NSCD_THREAD_STACKSIZE) / 10)
+
/* Structure describing dynamic part of one database. */
struct database_dyn