/*
 *  opool.h
 *  Chatter
 *
 *  Created by Curtis Jones on 2009.03.26.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */

#ifndef __O_POOL_H__
#define __O_POOL_H__

#include "cobject.h"
#include "semaphore.h"

//
// opool_item
//
struct opool_item
{
	struct opool_item *next;					// next opool item
};
typedef struct opool_item opool_item_t;

//
// opool_block
//
struct opool_block
{
	struct opool_block *next;					// next opool block
};
typedef struct opool_block opool_block_t;

//
// opool
//
struct opool
{
	cobject_t cobject;								// super class
	
	semaphore_t semaphore;						// semaphore
	
	char name[100];										// object pool name
	uint64_t osize;										// object size (in bytes)
	uint64_t bsize;										// block size (in objects)
	uint64_t bmax;										// max blocks
	
	uint64_t inuse;										// current number of objects in use
	uint64_t high;										// high "water mark" of "inuse"
	uint64_t bcount;									// current number of allocated blocks
	uint64_t ocount;									// current number of allocated objects
	
	opool_block_t *blocks;						// list of opool blocks
	opool_item_t *items;							// list of opool items
	
	int (*init)(struct opool*,void*);
};
typedef struct opool opool_t;

//
// opool_object_init_func
//
typedef int (*opool_object_init_func) (opool_t*, void*);

/**
 * opool, object size, block size (in objects), max blocks, pool name
 */
int opool_init (opool_t*, uint64_t, uint64_t, uint64_t, char*);

/**
 * opool, object size, block size (in objects), max blocks, pool 
 * name, object init function pointer
 */
int opool_init2 (opool_t*, uint64_t, uint64_t, uint64_t, char*, opool_object_init_func);

/**
 * opool
 */
int opool_destroy (opool_t*);

/**
 *
 */
int opool_push (opool_t*, void*);

/**
 *
 */
int opool_pop (opool_t*, void**);

/**
 *
 */
opool_t* opool_retain (opool_t*);

/**
 *
 */
void opool_release (opool_t*);

#endif /* __O_POOL_H__ */

