/*
 *  cobject.c
 *  Chatter
 *
 *  Created by Curtis Jones on 2009.10.14.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */

#include "cobject.h"
#include "opool.h"
#include "logger.h"

#pragma mark -
#pragma mark structors

/**
 *
 *
 */
inline int
cobject_init (cobject_t *cobject, cobject_destroy_func destroy_func, opool_t *pool)
{
	int error;
	
	if (unlikely(cobject == NULL))
		LOG_ERROR_AND_RETURN(-1, "%s.. null cobject_t\n", __PRETTY_FUNCTION__);
	
	if (unlikely(destroy_func == NULL))
		LOG_ERROR_AND_RETURN(-2, "%s.. null cobject_destroy_func\n", __PRETTY_FUNCTION__);
	
	if (unlikely(0 != (error = memlock_init(&cobject->memlock, (memlock_destroy_func)destroy_func, cobject))))
		LOG_ERROR_AND_RETURN(-101, "%s.. failed to memlock_init, 0x%08X [%d]\n", __PRETTY_FUNCTION__, error, error);
	
	if (pool != NULL)
		cobject->pool = opool_retain(pool);
	
	return 0;
}

/**
 *
 *
 */
inline int
cobject_destroy (cobject_t *cobject)
{
	int error;
	opool_t *pool;
	
	if (unlikely(cobject == NULL))
		LOG_ERROR_AND_RETURN(-1, "%s.. null cobject_t\n", __PRETTY_FUNCTION__);
	
	if (unlikely(0 != (error = memlock_destroy(&cobject->memlock))))
		LOG_ERROR_AND_RETURN(-101, "%s.. failed to memlock_destroy, 0x%08X [%d]\n", __PRETTY_FUNCTION__, error, error);
	
	if (cobject->pool != NULL) {
		pool = cobject->pool;
		cobject->pool = NULL;
		opool_push(pool, cobject);
		opool_release(pool);
	}
	
	return 0;
}





#pragma mark -
#pragma mark cobject stuff

/**
 *
 *
 */
inline cobject_t*
cobject_retain (cobject_t *cobject)
{
	if (unlikely(cobject == NULL))
		LOG_ERROR_AND_RETURN(NULL, "%s.. null cobject_t\n", __PRETTY_FUNCTION__);
	
	memlock_retain(&cobject->memlock);
	
	return cobject;
}

/**
 *
 */
inline void
cobject_release (cobject_t *cobject)
{
	if (unlikely(cobject == NULL))
		LOG_ERROR_AND_RETURN(, "%s.. null cobject_t\n", __PRETTY_FUNCTION__);
	
	memlock_release(&cobject->memlock);
}
