From: Sebastian Hammer Date: Fri, 17 Mar 1995 10:17:25 +0000 (+0000) Subject: Added memory management. X-Git-Tag: YAZ.1.8~1119 X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=commitdiff_plain;h=892f7f56860a1ee8e8d816eeaec0387c54c1a0a7 Added memory management. --- diff --git a/asn/proto.c b/asn/proto.c index ce6e304..019d144 100644 --- a/asn/proto.c +++ b/asn/proto.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: proto.c,v $ - * Revision 1.10 1995-03-15 11:17:40 quinn + * Revision 1.11 1995-03-17 10:17:25 quinn + * Added memory management. + * + * Revision 1.10 1995/03/15 11:17:40 quinn * Fixed some return-checks from choice.. need better ay to handle those.. * * Revision 1.9 1995/03/15 08:37:06 quinn @@ -164,7 +167,7 @@ int z_DatabaseSpecificUnit(ODR o, Z_DatabaseSpecificUnit **p, int opt) int z_DatabaseSpecific(ODR o, Z_DatabaseSpecific **p, int opt) { if (o->direction == ODR_DECODE) - *p = nalloc(o, sizeof(**p)); + *p = odr_malloc(o, sizeof(**p)); else if (!*p) return opt; @@ -191,7 +194,7 @@ int z_ElementSetNames(ODR o, Z_ElementSetNames **p, int opt) return opt; if (o->direction == ODR_DECODE) - *p = nalloc(o, sizeof(**p)); + *p = odr_malloc(o, sizeof(**p)); if (odr_choice(o, arm, &(*p)->u, &(*p)->which) && odr_constructed_end(o)) @@ -243,7 +246,7 @@ int z_Operator(ODR o, Z_Operator **p, int opt) if (!odr_constructed_begin(o, p, ODR_CONTEXT, 46)) return opt; if (o->direction == ODR_DECODE) - *p = nalloc(o, sizeof(**p)); + *p = odr_malloc(o, sizeof(**p)); else (*p)->u.and = &dummy; @@ -264,7 +267,7 @@ int z_Operand(ODR o, Z_Operand **p, int opt) }; if (o->direction ==ODR_DECODE) - *p = nalloc(o, sizeof(**p)); + *p = odr_malloc(o, sizeof(**p)); else if (!*p) return opt; if (odr_choice(o, arm, &(*p)->u, &(*p)->which)) @@ -296,7 +299,7 @@ int z_RPNStructure(ODR o, Z_RPNStructure **p, int opt) }; if (o->direction == ODR_DECODE) - *p = nalloc(o, sizeof(**p)); + *p = odr_malloc(o, sizeof(**p)); else if (!*p) return opt; if (odr_choice(o, arm, &(*p)->u, &(*p)->which)) @@ -327,7 +330,7 @@ int z_Query(ODR o, Z_Query **p, int opt) }; if (o->direction == ODR_DECODE) - *p = nalloc(o, sizeof(**p)); + *p = odr_malloc(o, sizeof(**p)); else if (!*p) return opt; if (odr_choice(o, arm, &(*p)->u, &(*p)->which)) @@ -410,7 +413,7 @@ int z_NamePlusRecord(ODR o, Z_NamePlusRecord **p, int opt) int z_NamePlusRecordList(ODR o, Z_NamePlusRecordList **p, int opt) { if (o->direction == ODR_DECODE) - *p = nalloc(o, sizeof(**p)); + *p = odr_malloc(o, sizeof(**p)); if (odr_sequence_of(o, z_NamePlusRecord, &(*p)->records, &(*p)->num_records)) return 1; @@ -428,7 +431,7 @@ int z_Records(ODR o, Z_Records **p, int opt) }; if (o->direction == ODR_DECODE) - *p = nalloc(o, sizeof(**p)); + *p = odr_malloc(o, sizeof(**p)); else if (!*p) return opt; if (odr_choice(o, arm, &(*p)->u, &(*p)->which)) @@ -527,7 +530,7 @@ int z_APDU(ODR o, Z_APDU **p, int opt) }; if (o->direction == ODR_DECODE) - *p = nalloc(o, sizeof(**p)); + *p = odr_malloc(o, sizeof(**p)); if (!odr_choice(o, arm, &(*p)->u, &(*p)->which)) { if (o->direction == ODR_DECODE) diff --git a/odr/Makefile b/odr/Makefile index 522f7e2..24a2d47 100644 --- a/odr/Makefile +++ b/odr/Makefile @@ -1,7 +1,7 @@ # Copyright (C) 1994, Index Data I/S # All rights reserved. # Sebastian Hammer, Adam Dickmeiss -# $Id: Makefile,v 1.7 1995-03-14 10:27:34 quinn Exp $ +# $Id: Makefile,v 1.8 1995-03-17 10:17:37 quinn Exp $ SHELL=/bin/sh INCLUDE=-I../include -I. @@ -14,7 +14,7 @@ LIBS=-lodr PO = odr_bool.o ber_bool.o ber_len.o ber_tag.o odr_util.o odr_null.o \ ber_null.o odr_int.o ber_int.o odr_tag.o odr_cons.o odr_seq.o\ odr_oct.o ber_oct.o odr_bit.o ber_bit.o odr_oid.o ber_oid.o odr_use.o \ - odr_choice.o odr_any.o ber_any.o odr.o + odr_choice.o odr_any.o ber_any.o odr.o odr_mem.o CPP=cc -E all: $(LIBDIR) $(LIB) diff --git a/odr/ber_any.c b/odr/ber_any.c index 6492398..2e9a3ce 100644 --- a/odr/ber_any.c +++ b/odr/ber_any.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: ber_any.c,v $ - * Revision 1.6 1995-03-08 12:12:02 quinn + * Revision 1.7 1995-03-17 10:17:39 quinn + * Added memory management. + * + * Revision 1.6 1995/03/08 12:12:02 quinn * Added better error checking. * * Revision 1.5 1995/02/14 20:39:54 quinn @@ -38,7 +41,7 @@ int ber_any(ODR o, Odr_any **p) o->error = OPROTO; return 0; } - (*p)->buf = nalloc(o, res); + (*p)->buf = odr_malloc(o, res); memcpy((*p)->buf, o->bp, res); (*p)->len = (*p)->size = res; o->bp += res; diff --git a/odr/ber_oct.c b/odr/ber_oct.c index 2169842..9c8eda4 100644 --- a/odr/ber_oct.c +++ b/odr/ber_oct.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: ber_oct.c,v $ - * Revision 1.5 1995-03-08 12:12:10 quinn + * Revision 1.6 1995-03-17 10:17:41 quinn + * Added memory management. + * + * Revision 1.5 1995/03/08 12:12:10 quinn * Added better error checking. * * Revision 1.4 1995/02/10 15:55:28 quinn @@ -54,7 +57,7 @@ int ber_octetstring(ODR o, Odr_oct *p, int cons) } if (len + 1 > p->size - p->len) { - c = nalloc(o, p->size += len + 1); + c = odr_malloc(o, p->size += len + 1); if (p->len) memcpy(c, p->buf, p->len); p->buf = c; diff --git a/odr/odr.c b/odr/odr.c index bfa8334..24b15b3 100644 --- a/odr/odr.c +++ b/odr/odr.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: odr.c,v $ - * Revision 1.7 1995-03-10 11:44:41 quinn + * Revision 1.8 1995-03-17 10:17:43 quinn + * Added memory management. + * + * Revision 1.7 1995/03/10 11:44:41 quinn * Fixed serious stack-bug in odr_cons_begin * * Revision 1.6 1995/03/08 12:12:15 quinn @@ -72,6 +75,7 @@ ODR odr_createmem(int direction) r->print = stdout; r->buf = 0; r->buflen = 0; + r->mem = 0; odr_reset(r); return r; } @@ -85,10 +89,13 @@ void odr_reset(ODR o) o->t_tag = -1; o->indent = 0; o->stackp = -1; + odr_release_mem(o->mem); + o->mem = 0; } void odr_destroy(ODR o) { + odr_release_mem(o->mem); free(o); } diff --git a/odr/odr_any.c b/odr/odr_any.c index bb9effd..cfbff27 100644 --- a/odr/odr_any.c +++ b/odr/odr_any.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: odr_any.c,v $ - * Revision 1.2 1995-03-08 12:12:18 quinn + * Revision 1.3 1995-03-17 10:17:46 quinn + * Added memory management. + * + * Revision 1.2 1995/03/08 12:12:18 quinn * Added better error checking. * * Revision 1.1 1995/02/09 15:51:47 quinn @@ -30,7 +33,7 @@ int odr_any(ODR o, Odr_any **p, int opt) return 1; } if (o->direction == ODR_DECODE) - *p = nalloc(o, sizeof(**p)); + *p = odr_malloc(o, sizeof(**p)); if (ber_any(o, p)) return 1; *p = 0; diff --git a/odr/odr_bit.c b/odr/odr_bit.c index 25edfa0..46d7e2e 100644 --- a/odr/odr_bit.c +++ b/odr/odr_bit.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: odr_bit.c,v $ - * Revision 1.6 1995-03-08 12:12:19 quinn + * Revision 1.7 1995-03-17 10:17:48 quinn + * Added memory management. + * + * Revision 1.6 1995/03/08 12:12:19 quinn * Added better error checking. * * Revision 1.5 1995/02/10 18:57:25 quinn @@ -55,7 +58,7 @@ int odr_bitstring(ODR o, Odr_bitmask **p, int opt) } if (o->direction == ODR_DECODE) { - *p = nalloc(o, sizeof(Odr_bitmask)); + *p = odr_malloc(o, sizeof(Odr_bitmask)); memset((*p)->bits, 0, ODR_BITMASK_SIZE); (*p)->top = -1; } diff --git a/odr/odr_bool.c b/odr/odr_bool.c index 13c2d3a..5279ae2 100644 --- a/odr/odr_bool.c +++ b/odr/odr_bool.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: odr_bool.c,v $ - * Revision 1.4 1995-03-08 12:12:20 quinn + * Revision 1.5 1995-03-17 10:17:49 quinn + * Added memory management. + * + * Revision 1.4 1995/03/08 12:12:20 quinn * Added better error checking. * * Revision 1.3 1995/02/10 18:57:25 quinn @@ -48,6 +51,6 @@ int odr_bool(ODR o, int **p, int opt) if (cons) return 0; if (o->direction == ODR_DECODE) - *p = nalloc(o, sizeof(int)); + *p = odr_malloc(o, sizeof(int)); return ber_boolean(o, *p); } diff --git a/odr/odr_int.c b/odr/odr_int.c index 686aa63..c5ba969 100644 --- a/odr/odr_int.c +++ b/odr/odr_int.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: odr_int.c,v $ - * Revision 1.5 1995-03-08 12:12:25 quinn + * Revision 1.6 1995-03-17 10:17:51 quinn + * Added memory management. + * + * Revision 1.5 1995/03/08 12:12:25 quinn * Added better error checking. * * Revision 1.4 1995/02/10 18:57:25 quinn @@ -53,6 +56,6 @@ int odr_integer(ODR o, int **p, int opt) return 0; } if (o->direction == ODR_DECODE) - *p = nalloc(o, sizeof(int)); + *p = odr_malloc(o, sizeof(int)); return ber_integer(o, *p); } diff --git a/odr/odr_mem.c b/odr/odr_mem.c index 4d6bf6d..e57730a 100644 --- a/odr/odr_mem.c +++ b/odr/odr_mem.c @@ -4,18 +4,92 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: odr_mem.c,v $ - * Revision 1.1 1995-03-14 10:27:40 quinn + * Revision 1.2 1995-03-17 10:17:52 quinn + * Added memory management. + * + * Revision 1.1 1995/03/14 10:27:40 quinn * Modified makefile to use common lib * Beginning to add memory management to odr * - * */ #include - #include -char *odr_malloc(ODR o, int size) +#define ODR_MEM_CHUNK (10*1024) + +typedef struct odr_memblock +{ + char *buf; + int size; + int top; + struct odr_memblock *next; +} odr_memblock; + +static odr_memblock *freelist = 0; + +static void free_block(odr_memblock *p) +{ + p->next = freelist; + freelist = p; +} + +static odr_memblock *get_block(int size) { - return malloc(size); /* REPLACE WITH NIBBLE MALLOC!! */ + odr_memblock *r, *l; + + for (r = freelist, l = 0; r; l = r, r = r->next) + if (r->size >= size) + break; + if (r) + if (l) + l->next = r->next; + else + freelist = r->next; + else + { + int get = ODR_MEM_CHUNK; + + if (get < size) + get = size; + if (!(r = malloc(sizeof(*r)))) + return 0; + if (!(r->buf = malloc(r->size = get))) + return 0; + } + r->top = 0; + return r; +} + +void odr_release_mem(odr_memblock *p) +{ + odr_memblock *t; + + while (p) + { + t = p; + p = p->next; + free_block(t); + } +} + +void *odr_malloc(ODR o, int size) +{ + struct odr_memblock *p = o->mem; + char *r; + + if (!p || p->size - p->top < size) + if (!(p = get_block(size))) + { + o->error = OMEMORY; + return 0; + } + else + { + p->next = o->mem; + o->mem = p; + } + r = p->buf + p->top; + p->top += (size + (sizeof(long) - 1)) & ~(sizeof(long) - 1); + return r; } diff --git a/odr/odr_oct.c b/odr/odr_oct.c index ba38619..fe2ffc5 100644 --- a/odr/odr_oct.c +++ b/odr/odr_oct.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: odr_oct.c,v $ - * Revision 1.7 1995-03-08 12:12:27 quinn + * Revision 1.8 1995-03-17 10:17:54 quinn + * Added memory management. + * + * Revision 1.7 1995/03/08 12:12:27 quinn * Added better error checking. * * Revision 1.6 1995/02/10 18:57:26 quinn @@ -55,7 +58,7 @@ int odr_octetstring(ODR o, Odr_oct **p, int opt) } if (o->direction == ODR_DECODE) { - *p = nalloc(o, sizeof(Odr_oct)); + *p = odr_malloc(o, sizeof(Odr_oct)); (*p)->size= 0; (*p)->len = 0; (*p)->buf = 0; @@ -90,7 +93,7 @@ int odr_cstring(ODR o, char **p, int opt) fprintf(o->print, "%s'%s'\n", odr_indent(o), *p); return 1; } - t = nalloc(o, sizeof(Odr_oct)); /* wrapper for octstring */ + t = odr_malloc(o, sizeof(Odr_oct)); /* wrapper for octstring */ if (o->direction == ODR_ENCODE) { t->buf = (unsigned char *) *p; diff --git a/odr/odr_oid.c b/odr/odr_oid.c index 633101b..d12226f 100644 --- a/odr/odr_oid.c +++ b/odr/odr_oid.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: odr_oid.c,v $ - * Revision 1.7 1995-03-08 12:12:29 quinn + * Revision 1.8 1995-03-17 10:17:55 quinn + * Added memory management. + * + * Revision 1.7 1995/03/08 12:12:29 quinn * Added better error checking. * * Revision 1.6 1995/03/01 08:40:56 quinn @@ -65,6 +68,6 @@ int odr_oid(ODR o, Odr_oid **p, int opt) return 1; } if (o->direction == ODR_DECODE) - *p = nalloc(o, ODR_OID_SIZE * sizeof(**p)); + *p = odr_malloc(o, ODR_OID_SIZE * sizeof(**p)); return ber_oidc(o, *p); } diff --git a/odr/odr_seq.c b/odr/odr_seq.c index cb3d703..4f6646b 100644 --- a/odr/odr_seq.c +++ b/odr/odr_seq.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: odr_seq.c,v $ - * Revision 1.8 1995-03-15 11:18:05 quinn + * Revision 1.9 1995-03-17 10:17:57 quinn + * Added memory management. + * + * Revision 1.8 1995/03/15 11:18:05 quinn * Fixed serious bug in odr_cons * * Revision 1.7 1995/03/08 12:12:30 quinn @@ -49,7 +52,7 @@ int odr_sequence_begin(ODR o, void *p, int size) if (odr_constructed_begin(o, p, o->t_class, o->t_tag)) { if (o->direction == ODR_DECODE && size) - *pp = nalloc(o, size); + *pp = odr_malloc(o, size); if (o->direction == ODR_PRINT) { fprintf(o->print, "%s{\n", odr_indent(o)); @@ -97,7 +100,7 @@ int odr_sequence_of(ODR o, Odr_fun type, void *p, int *num) if (*num * sizeof(void*) >= size) { /* double the buffer size */ - tmp = nalloc(o, sizeof(void*) * (size += size ? size : + tmp = odr_malloc(o, sizeof(void*) * (size += size ? size : 128)); if (*num) { diff --git a/odr/odr_util.c b/odr/odr_util.c index 16dc984..fb4c7c0 100644 --- a/odr/odr_util.c +++ b/odr/odr_util.c @@ -1,8 +1,6 @@ #include #include -void *nalloc(ODR o, int size) { return malloc(size); } - char *odr_indent(ODR o) { static char buf[512]; diff --git a/odr/test.c b/odr/test.c index 77506f9..854f89b 100644 --- a/odr/test.c +++ b/odr/test.c @@ -70,7 +70,7 @@ int f_A(ODR o, struct A **p, int opt) }; if (o->direction == ODR_DECODE && !*p) - *p = nalloc(o, sizeof(**p)); + *p = odr_malloc(o, sizeof(**p)); res = odr_choice(o, arm, &(*p)->u, &(*p)->which); if (!res) { diff --git a/server/seshigh.c b/server/seshigh.c index e314918..0f806ed 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: seshigh.c,v $ - * Revision 1.3 1995-03-16 17:42:39 quinn + * Revision 1.4 1995-03-17 10:18:08 quinn + * Added memory management. + * + * Revision 1.3 1995/03/16 17:42:39 quinn * Little changes * * Revision 1.2 1995/03/16 13:29:01 quinn @@ -91,6 +94,8 @@ void destroy_association(association *h) odr_destroy(h->decode); odr_destroy(h->encode); free(h->encode_buffer); + if (h->input_buffer) + free(h->input_buffer); free(h); } @@ -176,6 +181,7 @@ static int process_apdu(IOCHAN chan) fprintf(stderr, "Bad APDU\n"); return -1; } + odr_reset(assoc->decode); return res; } @@ -220,7 +226,7 @@ static int process_initRequest(IOCHAN client, Z_InitRequest *req) resp.result = &result; resp.implementationId = "YAZ"; resp.implementationName = "YAZ/Simple asynchronous test server"; - resp.implementationVersion = "$Revision: 1.3 $"; + resp.implementationVersion = "$Revision: 1.4 $"; resp.userInformationField = 0; if (!z_APDU(assoc->encode, &apdup, 0)) { @@ -228,6 +234,7 @@ static int process_initRequest(IOCHAN client, Z_InitRequest *req) return -1; } odr_getbuf(assoc->encode, &assoc->encoded_len); + odr_reset(assoc->encode); iochan_setflags(client, EVENT_OUTPUT | EVENT_EXCEPT); return 0; } @@ -293,6 +300,7 @@ static int process_searchRequest(IOCHAN client, Z_SearchRequest *req) return -1; } odr_getbuf(assoc->encode, &assoc->encoded_len); + odr_reset(assoc->encode); iochan_setflags(client, EVENT_OUTPUT | EVENT_EXCEPT); return 0; } @@ -322,6 +330,7 @@ static int process_presentRequest(IOCHAN client, Z_PresentRequest *req) return -1; } odr_getbuf(assoc->encode, &assoc->encoded_len); + odr_reset(assoc->encode); iochan_setflags(client, EVENT_OUTPUT | EVENT_EXCEPT); return 0; }