project_files/frontlib/util/refcounter.c
changeset 7271 5608ac657362
child 7314 6171f0bad318
equal deleted inserted replaced
7269:5b0aeef8ba2a 7271:5608ac657362
       
     1 #include "refcounter.h"
       
     2 
       
     3 #include "logging.h"
       
     4 
       
     5 void flib_retain(int *referenceCountPtr, const char *objName) {
       
     6 	if(!referenceCountPtr || !objName) {
       
     7 		flib_log_e("null parameter to flib_retain");
       
     8 	} else {
       
     9 		if((*referenceCountPtr)  >= 0) {
       
    10 			(*referenceCountPtr)++;
       
    11 			flib_log_d("retaining %s, now %i references", objName, (*referenceCountPtr));
       
    12 		}
       
    13 		if((*referenceCountPtr) < 0) {
       
    14 			flib_log_e("Memory leak: Reference count overflow in %s object!", objName);
       
    15 		}
       
    16 	}
       
    17 }
       
    18 
       
    19 /**
       
    20  * Returns true if the struct should be freed.
       
    21  */
       
    22 bool flib_release(int *referenceCountPtr, const char *objName) {
       
    23 	bool result = false;
       
    24 	if(!referenceCountPtr) {
       
    25 		flib_log_e("null parameter to flib_release");
       
    26 	} else if((*referenceCountPtr) > 0) {
       
    27 		if(--(*referenceCountPtr) == 0) {
       
    28 			flib_log_d("releasing and destroying %s", objName);
       
    29 			result = true;
       
    30 		} else {
       
    31 			flib_log_d("releasing %s, now %i references", objName, (*referenceCountPtr));
       
    32 		}
       
    33 	} else if((*referenceCountPtr) == 0) {
       
    34 		flib_log_e("Attempt to release a %s with zero references!", objName);
       
    35 	}
       
    36 	return result;
       
    37 }