diff options
Diffstat (limited to 'db2/db')
-rw-r--r-- | db2/db/db_auto.c | 8 | ||||
-rw-r--r-- | db2/db/db_dispatch.c | 31 | ||||
-rw-r--r-- | db2/db/db_ret.c | 33 |
3 files changed, 51 insertions, 21 deletions
diff --git a/db2/db/db_auto.c b/db2/db/db_auto.c index d40d964542..88bca7b583 100644 --- a/db2/db/db_auto.c +++ b/db2/db/db_auto.c @@ -122,7 +122,6 @@ int __db_addrem_log(logp, txnid, ret_lsnp, flags, * PUBLIC: int __db_addrem_print * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); */ - int __db_addrem_print(notused1, dbtp, lsnp, notused3, notused4) DB_LOG *notused1; @@ -312,7 +311,6 @@ int __db_split_log(logp, txnid, ret_lsnp, flags, * PUBLIC: int __db_split_print * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); */ - int __db_split_print(notused1, dbtp, lsnp, notused3, notused4) DB_LOG *notused1; @@ -507,7 +505,6 @@ int __db_big_log(logp, txnid, ret_lsnp, flags, * PUBLIC: int __db_big_print * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); */ - int __db_big_print(notused1, dbtp, lsnp, notused3, notused4) DB_LOG *notused1; @@ -678,7 +675,6 @@ int __db_ovref_log(logp, txnid, ret_lsnp, flags, * PUBLIC: int __db_ovref_print * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); */ - int __db_ovref_print(notused1, dbtp, lsnp, notused3, notused4) DB_LOG *notused1; @@ -842,7 +838,6 @@ int __db_relink_log(logp, txnid, ret_lsnp, flags, * PUBLIC: int __db_relink_print * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); */ - int __db_relink_print(notused1, dbtp, lsnp, notused3, notused4) DB_LOG *notused1; @@ -1005,7 +1000,6 @@ int __db_addpage_log(logp, txnid, ret_lsnp, flags, * PUBLIC: int __db_addpage_print * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); */ - int __db_addpage_print(notused1, dbtp, lsnp, notused3, notused4) DB_LOG *notused1; @@ -1180,7 +1174,6 @@ int __db_debug_log(logp, txnid, ret_lsnp, flags, * PUBLIC: int __db_debug_print * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); */ - int __db_debug_print(notused1, dbtp, lsnp, notused3, notused4) DB_LOG *notused1; @@ -1335,7 +1328,6 @@ int __db_noop_log(logp, txnid, ret_lsnp, flags) * PUBLIC: int __db_noop_print * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); */ - int __db_noop_print(notused1, dbtp, lsnp, notused3, notused4) DB_LOG *notused1; diff --git a/db2/db/db_dispatch.c b/db2/db/db_dispatch.c index a4bcdb7628..4f89d2b917 100644 --- a/db2/db/db_dispatch.c +++ b/db2/db/db_dispatch.c @@ -43,7 +43,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)db_dispatch.c 10.6 (Sleepycat) 10/25/97"; +static const char sccsid[] = "@(#)db_dispatch.c 10.7 (Sleepycat) 11/23/97"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -236,8 +236,8 @@ __db_txnlist_find(listp, txnid) void *listp; u_int32_t txnid; { - __db_txnlist *p; __db_txnhead *hp; + __db_txnlist *p; if ((hp = (struct __db_txnhead *)listp) == NULL) return (DB_NOTFOUND); @@ -255,12 +255,16 @@ __db_txnlist_find(listp, txnid) } #ifdef DEBUG +/* + * __db_txnlist_print -- + * Print out the transaction list. + */ void __db_txnlist_print(listp) void *listp; { - __db_txnlist *p; __db_txnhead *hp; + __db_txnlist *p; hp = (struct __db_txnhead *)listp; printf("Maxid: %lu\n", (u_long)hp->maxid); @@ -268,3 +272,24 @@ __db_txnlist_print(listp) printf("TXNID: %lu\n", (u_long)p->txnid); } #endif + +/* + * __db_txnlist_end -- + * Discard transaction linked list. + * + * PUBLIC: void __db_txnlist_end __P((void *)); + */ +void +__db_txnlist_end(listp) + void *listp; +{ + __db_txnhead *hp; + __db_txnlist *p; + + hp = (struct __db_txnhead *)listp; + while ((p = LIST_FIRST(&hp->head)) != LIST_END(&hp->head)) { + LIST_REMOVE(p, links); + __db_free(p); + } + __db_free(listp); +} diff --git a/db2/db/db_ret.c b/db2/db/db_ret.c index bcec308b95..65441aa45a 100644 --- a/db2/db/db_ret.c +++ b/db2/db/db_ret.c @@ -8,7 +8,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)db_ret.c 10.8 (Sleepycat) 10/25/97"; +static const char sccsid[] = "@(#)db_ret.c 10.10 (Sleepycat) 11/28/97"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -116,35 +116,48 @@ __db_retcopy(dbt, data, len, memp, memsize, db_malloc) dbt->size = len; /* - * Allocate any necessary memory. + * Allocate memory to be owned by the application: DB_DBT_MALLOC. * - * XXX: Never allocate 0 bytes. + * !!! + * We always allocate memory, even if we're copying out 0 bytes. This + * guarantees consistency, i.e., the application can always free memory + * without concern as to how many bytes of the record were requested. + * + * XXX + * Never allocate 0 bytes, it's known to make malloc/realloc unhappy. + * + * Use the memory specified by the application: DB_DBT_USERMEM. + * + * !!! + * If the length we're going to copy is 0, the application-supplied + * memory pointer is allowed to be NULL. */ if (F_ISSET(dbt, DB_DBT_MALLOC)) { dbt->data = db_malloc == NULL ? - (void *)__db_malloc(len + 1) : + (void *)__db_malloc(len) : (void *)db_malloc(len + 1); if (dbt->data == NULL) return (ENOMEM); } else if (F_ISSET(dbt, DB_DBT_USERMEM)) { - if (dbt->ulen < len) + if (len != 0 && (dbt->data == NULL || dbt->ulen < len)) return (ENOMEM); } else if (memp == NULL || memsize == NULL) { return (EINVAL); } else { - if (*memsize == 0 || *memsize < len) { + if (len != 0 && (*memsize == 0 || *memsize < len)) { *memp = *memp == NULL ? - (void *)__db_malloc(len + 1) : - (void *)__db_realloc(*memp, len + 1); + (void *)__db_malloc(len) : + (void *)__db_realloc(*memp, len); if (*memp == NULL) { *memsize = 0; return (ENOMEM); } - *memsize = len + 1; + *memsize = len; } dbt->data = *memp; } - memcpy(dbt->data, data, len); + if (len != 0) + memcpy(dbt->data, data, len); return (0); } |