project_files/frontlib/util/refcounter.h
changeset 7230 240620f46dd7
child 7271 5608ac657362
equal deleted inserted replaced
7227:1c859f572d72 7230:240620f46dd7
       
     1 /**
       
     2  * Helper functions for reference counted structs.
       
     3  *
       
     4  * We don't have enough of them to justify going crazy with macros, but I still prefer
       
     5  * to have the logic in one place.
       
     6  *
       
     7  * In particular, these functions handle counter overflow in a sensible way
       
     8  * (log and leak).
       
     9  */
       
    10 
       
    11 #ifndef REFCOUNTER_H_
       
    12 #define REFCOUNTER_H_
       
    13 
       
    14 #include "logging.h"
       
    15 #include <stdbool.h>
       
    16 
       
    17 static inline void flib_retain(int *referenceCountPtr, const char *objName) {
       
    18 	if(!referenceCountPtr || !objName) {
       
    19 		flib_log_e("null parameter to flib_retain");
       
    20 	} else {
       
    21 		if((*referenceCountPtr)  >= 0) {
       
    22 			(*referenceCountPtr)++;
       
    23 			flib_log_d("retaining %s, now %i references", objName, (*referenceCountPtr));
       
    24 		}
       
    25 		if((*referenceCountPtr) < 0) {
       
    26 			flib_log_e("Memory leak: Reference count overflow in %s object!", objName);
       
    27 		}
       
    28 	}
       
    29 }
       
    30 
       
    31 /**
       
    32  * Returns true if the struct should be freed.
       
    33  */
       
    34 static inline bool flib_release(int *referenceCountPtr, const char *objName) {
       
    35 	bool result = false;
       
    36 	if(!referenceCountPtr) {
       
    37 		flib_log_e("null parameter to flib_release");
       
    38 	} else if((*referenceCountPtr) > 0) {
       
    39 		if(--(*referenceCountPtr) == 0) {
       
    40 			flib_log_d("releasing and destroying %s", objName);
       
    41 			result = true;
       
    42 		} else {
       
    43 			flib_log_d("releasing %s, now %i references", objName, (*referenceCountPtr));
       
    44 		}
       
    45 	} else if((*referenceCountPtr) == 0) {
       
    46 		flib_log_e("Attempt to release a %s with zero references!", objName);
       
    47 	}
       
    48 	return result;
       
    49 }
       
    50 
       
    51 #endif /* REFCOUNTER_H_ */