From f5f8c375e650d350eab25680c6aa348229524984 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 26 Oct 2010 07:34:45 -0700 Subject: [PATCH] case: Add support for debugging case reference count leaks. --- src/data/case.c | 23 ++++++++++++++++++++++- src/data/case.h | 14 ++------------ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/data/case.c b/src/data/case.c index dc402926..ffb47fe8 100644 --- a/src/data/case.c +++ b/src/data/case.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2004, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 2004, 2007, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,6 +30,14 @@ #include "minmax.h" #include "xalloc.h" +/* Set this flag to 1 to copy cases instead of ref counting them. + This is sometimes helpful in debugging situations. */ +#define DEBUG_CASEREFS 0 + +#if DEBUG_CASEREFS +#warning "Caseref debug enabled. CASES ARE NOT BEING SHARED!!" +#endif + static size_t case_size (const struct caseproto *); static bool variable_matches_case (const struct ccase *, const struct variable *); @@ -80,6 +88,19 @@ case_clone (const struct ccase *c) return case_unshare (case_ref (c)); } +/* Increments case C's reference count and returns C. Afterward, + case C is shared among its reference count holders. */ +struct ccase * +case_ref (const struct ccase *c_) +{ + struct ccase *c = CONST_CAST (struct ccase *, c_); + c->ref_cnt++; +#if DEBUG_CASEREFS + c = case_unshare__ (c); +#endif + return c; +} + /* Returns an estimate of the number of bytes of memory that would be consumed in creating a case based on PROTO. The estimate includes typical overhead from malloc() in addition diff --git a/src/data/case.h b/src/data/case.h index d00c2ad3..c07b07d2 100644 --- a/src/data/case.h +++ b/src/data/case.h @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2004, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 2004, 2007, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -61,7 +61,7 @@ struct ccase *case_try_create (const struct caseproto *) MALLOC_LIKE; struct ccase *case_clone (const struct ccase *) MALLOC_LIKE; static inline struct ccase *case_unshare (struct ccase *) WARN_UNUSED_RESULT; -static inline struct ccase *case_ref (const struct ccase *); +struct ccase *case_ref (const struct ccase *) WARN_UNUSED_RESULT; static inline void case_unref (struct ccase *); static inline bool case_is_shared (const struct ccase *); @@ -130,16 +130,6 @@ case_unshare (struct ccase *c) return c; } -/* Increments case C's reference count and returns C. Afterward, - case C is shared among its reference count holders. */ -static inline struct ccase * -case_ref (const struct ccase *c_) -{ - struct ccase *c = CONST_CAST (struct ccase *, c_); - c->ref_cnt++; - return c; -} - /* Decrements case C's reference count. Frees C if its reference count drops to 0. -- 2.30.2