From ccef92998b36919a2eb3fb46c372a993f67c68d5 Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Wed, 30 Mar 1994 11:26:12 +0000 Subject: [PATCH] *** empty log message *** --- src/libCom/bucketLib.c | 44 ++++++++++++++++++++++++++++++-- src/libCom/bucketLib/bucketLib.c | 44 ++++++++++++++++++++++++++++++-- 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/src/libCom/bucketLib.c b/src/libCom/bucketLib.c index 71ced7d5e..3073b6c02 100644 --- a/src/libCom/bucketLib.c +++ b/src/libCom/bucketLib.c @@ -38,6 +38,7 @@ #include #endif /* vxWorks */ +#include #include #include @@ -48,6 +49,12 @@ #ifndef NBBY #define NBBY 8 #endif /* NBBY */ +#ifndef TRUE +#define TRUE 1 +#endif /* TRUE */ +#ifndef FALSE +#define FALSE 0 +#endif /* FALSE */ #define BUCKET_IX_WIDTH 12 #define BUCKET_IX_N (1<sizeof(BUCKETID)*NBBY){ + printf("%s at %d: Requested index width=%d is to large. max=%d\n" , + __FILE__, + __LINE__, + indexWidth, + sizeof(BUCKETID)*NBBY-1); return NULL; } @@ -164,7 +180,13 @@ unsigned indexWidth; } pb->nextIndexMask = (1<indexShift)-1; pb->nEntries = 1<<(indexWidth-pb->indexShift); - pb->indexMask = (1<indexMask = 0; + pb->indexMask = ~pb->indexMask; + } + else{ + pb->indexMask = (1<pTable = (ITEMPTR *) calloc( pb->nEntries, @@ -214,6 +236,7 @@ BUCKETID id; void *pItem; #endif { + int s; ITEMPTR *pi; /* @@ -224,6 +247,7 @@ void *pItem; } if(prb->indexShift){ + int new; BUCKET *pb; pi = &prb->pTable[id>>prb->indexShift]; @@ -236,12 +260,28 @@ void *pItem; } pi->pBucket = pb; prb->nInUse++; + new = TRUE; } + else{ + new = FALSE; + } - return bucketAddItem( + s = bucketAddItem( pb, id&prb->nextIndexMask, pItem); + /* + * if memory cant be allocated at a lower + * level dont leak everything allocated for this new + * item so far + */ + if(s != BUCKET_SUCCESS && new){ + s = bucketFree(pb); + assert(s == BUCKET_SUCCESS); + pi->pBucket = NULL; + prb->nInUse--; + } + return s; } pi = &prb->pTable[id]; diff --git a/src/libCom/bucketLib/bucketLib.c b/src/libCom/bucketLib/bucketLib.c index 71ced7d5e..3073b6c02 100644 --- a/src/libCom/bucketLib/bucketLib.c +++ b/src/libCom/bucketLib/bucketLib.c @@ -38,6 +38,7 @@ #include #endif /* vxWorks */ +#include #include #include @@ -48,6 +49,12 @@ #ifndef NBBY #define NBBY 8 #endif /* NBBY */ +#ifndef TRUE +#define TRUE 1 +#endif /* TRUE */ +#ifndef FALSE +#define FALSE 0 +#endif /* FALSE */ #define BUCKET_IX_WIDTH 12 #define BUCKET_IX_N (1<sizeof(BUCKETID)*NBBY){ + printf("%s at %d: Requested index width=%d is to large. max=%d\n" , + __FILE__, + __LINE__, + indexWidth, + sizeof(BUCKETID)*NBBY-1); return NULL; } @@ -164,7 +180,13 @@ unsigned indexWidth; } pb->nextIndexMask = (1<indexShift)-1; pb->nEntries = 1<<(indexWidth-pb->indexShift); - pb->indexMask = (1<indexMask = 0; + pb->indexMask = ~pb->indexMask; + } + else{ + pb->indexMask = (1<pTable = (ITEMPTR *) calloc( pb->nEntries, @@ -214,6 +236,7 @@ BUCKETID id; void *pItem; #endif { + int s; ITEMPTR *pi; /* @@ -224,6 +247,7 @@ void *pItem; } if(prb->indexShift){ + int new; BUCKET *pb; pi = &prb->pTable[id>>prb->indexShift]; @@ -236,12 +260,28 @@ void *pItem; } pi->pBucket = pb; prb->nInUse++; + new = TRUE; } + else{ + new = FALSE; + } - return bucketAddItem( + s = bucketAddItem( pb, id&prb->nextIndexMask, pItem); + /* + * if memory cant be allocated at a lower + * level dont leak everything allocated for this new + * item so far + */ + if(s != BUCKET_SUCCESS && new){ + s = bucketFree(pb); + assert(s == BUCKET_SUCCESS); + pi->pBucket = NULL; + prb->nInUse--; + } + return s; } pi = &prb->pTable[id];