chiark
/
gitweb
/
~mdw
/
mLib
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
4790f41
)
Add debugging mode which just uses the underlying arena.
author
mdw
<mdw>
Sun, 18 May 2003 15:10:20 +0000
(15:10 +0000)
committer
mdw
<mdw>
Sun, 18 May 2003 15:10:20 +0000
(15:10 +0000)
sub.c
patch
|
blob
|
blame
|
history
diff --git
a/sub.c
b/sub.c
index 45dcac46a5606af1aee313275c35704b39ad5315..ef4307583c887d975dd0089246c1a86716ce4e7a 100644
(file)
--- a/
sub.c
+++ b/
sub.c
@@
-1,6
+1,6
@@
/* -*-c-*-
*
/* -*-c-*-
*
- * $Id: sub.c,v 1.
6 2000/06/17 10:35:51
mdw Exp $
+ * $Id: sub.c,v 1.
7 2003/05/18 15:10:20
mdw Exp $
*
* Allocation of known-size blocks
*
*
* Allocation of known-size blocks
*
@@
-30,6
+30,9
@@
/*----- Revision history --------------------------------------------------*
*
* $Log: sub.c,v $
/*----- Revision history --------------------------------------------------*
*
* $Log: sub.c,v $
+ * Revision 1.7 2003/05/18 15:10:20 mdw
+ * Add debugging mode which just uses the underlying arena.
+ *
* Revision 1.6 2000/06/17 10:35:51 mdw
* Major overhaul for arena support.
*
* Revision 1.6 2000/06/17 10:35:51 mdw
* Major overhaul for arena support.
*
@@
-83,6
+86,7
@@
/* --- ANSI headers --- */
/* --- ANSI headers --- */
+#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@
-93,6
+97,10
@@
#include "exc.h"
#include "sub.h"
#include "exc.h"
#include "sub.h"
+/*----- Configuration tweaks ----------------------------------------------*/
+
+/* #define SUBARENA_TRIVIAL */
+
/*----- Static variables --------------------------------------------------*/
static size_t sizes[SUB_BINS];
/*----- Static variables --------------------------------------------------*/
static size_t sizes[SUB_BINS];
@@
-101,6
+109,16
@@
static size_t sizes[SUB_BINS];
subarena sub_global;
subarena sub_global;
+#ifdef SUBARENA_TRIVIAL
+
+typedef struct sub_link {
+ struct sub_link *next;
+ void *p;
+ size_t sz;
+} sub_link;
+
+#endif
+
/*----- Main code ---------------------------------------------------------*/
/* --- @subarena_create@ --- *
/*----- Main code ---------------------------------------------------------*/
/* --- @subarena_create@ --- *
@@
-116,11
+134,15
@@
subarena sub_global;
void subarena_create(subarena *s, arena *a)
{
void subarena_create(subarena *s, arena *a)
{
+#ifdef SUBARENA_TRIVIAL
+ s->bin[0] = 0;
+#else
size_t i;
if (!sizes[1])
sub_init();
for (i = 0; i < SUB_BINS; i++)
s->bin[i] = 0;
size_t i;
if (!sizes[1])
sub_init();
for (i = 0; i < SUB_BINS; i++)
s->bin[i] = 0;
+#endif
s->a = a;
}
s->a = a;
}
@@
-136,6
+158,19
@@
void subarena_create(subarena *s, arena *a)
void subarena_destroy(subarena *s)
{
void subarena_destroy(subarena *s)
{
+#ifdef SUBARENA_TRIVIAL
+
+ sub_link *l, *ll;
+
+ for (l = s->bin[0]; l; l = ll) {
+ ll = l;
+ a_free(s->a, l->p);
+ a_free(s->a, l);
+ }
+ s->bin[0] = 0;
+
+#else
+
size_t i;
for (i = 0; i < SUB_BINS; i++) {
void *p = s->bin[i];
size_t i;
for (i = 0; i < SUB_BINS; i++) {
void *p = s->bin[i];
@@
-145,6
+180,8
@@
void subarena_destroy(subarena *s)
A_FREE(s->a, q);
}
}
A_FREE(s->a, q);
}
}
+
+#endif
}
/* --- @subarena_alloc@ --- *
}
/* --- @subarena_alloc@ --- *
@@
-161,6
+198,28
@@
void subarena_destroy(subarena *s)
void *subarena_alloc(subarena *s, size_t sz)
{
void *subarena_alloc(subarena *s, size_t sz)
{
+#ifdef SUBARENA_TRIVIAL
+
+ sub_link *l;
+ void *p;
+
+ if (!s->a)
+ subarena_create(s, arena_global);
+
+ if ((l = a_alloc(s->a, sizeof(*l))) == 0)
+ return (0);
+ if ((p = a_alloc(s->a, sz)) == 0) {
+ a_free(s->a, l);
+ return (0);
+ }
+ l->p = p;
+ l->sz = sz;
+ l->next = s->bin[0];
+ s->bin[0] = l;
+ return (p);
+
+#else
+
int bin;
void *p;
int bin;
void *p;
@@
-168,10
+227,10
@@
void *subarena_alloc(subarena *s, size_t sz)
if (!s->a)
subarena_create(s, arena_global);
if (!s->a)
subarena_create(s, arena_global);
- bin = SUB_BIN(sz);
/* --- Handle oversize blocks --- */
/* --- Handle oversize blocks --- */
+ bin = SUB_BIN(sz);
if (bin >= SUB_BINS) {
void *p = A_ALLOC(s->a, sz);
if (!p)
if (bin >= SUB_BINS) {
void *p = A_ALLOC(s->a, sz);
if (!p)
@@
-207,6
+266,8
@@
void *subarena_alloc(subarena *s, size_t sz)
p = s->bin[bin];
s->bin[bin] = *(void **)p;
return (p);
p = s->bin[bin];
s->bin[bin] = *(void **)p;
return (p);
+
+#endif
}
/* --- @subarena_free@ --- *
}
/* --- @subarena_free@ --- *
@@
-222,6
+283,22
@@
void *subarena_alloc(subarena *s, size_t sz)
void subarena_free(subarena *s, void *p, size_t sz)
{
void subarena_free(subarena *s, void *p, size_t sz)
{
+#ifdef SUBARENA_TRIVIAL
+
+ sub_link *lh = s->bin[0], **l, *ll;
+
+ for (l = &lh; *l && (*l)->p != p; l = &(*l)->next)
+ ;
+ ll = *l;
+ assert(ll);
+ assert(ll->sz == sz);
+ *l = ll->next;
+ a_free(s->a, ll);
+ a_free(s->a, p);
+ s->bin[0] = lh;
+
+#else
+
int bin = SUB_BIN(sz);
if (bin >= SUB_BINS)
int bin = SUB_BIN(sz);
if (bin >= SUB_BINS)
@@
-230,6
+307,8
@@
void subarena_free(subarena *s, void *p, size_t sz)
*(void **)p = s->bin[bin];
s->bin[bin] = p;
}
*(void **)p = s->bin[bin];
s->bin[bin] = p;
}
+
+#endif
}
/*----- Compatibility stuff -----------------------------------------------*/
}
/*----- Compatibility stuff -----------------------------------------------*/
@@
-268,6
+347,7
@@
void (sub_free)(void *p, size_t sz) { sub_free(p, sz); }
void sub_init(void)
{
void sub_init(void)
{
+#ifndef SUBARENA_TRIVIAL
int i;
/* --- Initialize the sizes bins --- */
int i;
/* --- Initialize the sizes bins --- */
@@
-276,6
+356,7
@@
void sub_init(void)
sizes[i] = ((SUB_CHUNK + SUB_BINSZ(i) - 1) /
SUB_BINSZ(i) * SUB_BINSZ(i));
}
sizes[i] = ((SUB_CHUNK + SUB_BINSZ(i) - 1) /
SUB_BINSZ(i) * SUB_BINSZ(i));
}
+#endif
}
/*----- Debugging code ----------------------------------------------------*/
}
/*----- Debugging code ----------------------------------------------------*/