82 lines
1.9 KiB
C
Executable File
82 lines
1.9 KiB
C
Executable File
/*
|
|
* rpc_sessionpool.c
|
|
*
|
|
* Created on: 2011-3-23
|
|
* Author: yanghu
|
|
*/
|
|
#include "rpc_sessionpool.h"
|
|
#include "rpc_queue.h"
|
|
#include <assert.h>
|
|
|
|
#define POOLCAPACITY 1000
|
|
|
|
struct _rpc_sessionpool {
|
|
pthread_mutex_t mutex;
|
|
pointer *data;
|
|
int size;
|
|
};
|
|
|
|
rpc_sessionpool* rpc_sessionpool_new() {
|
|
rpc_sessionpool *pool = rpc_new(rpc_sessionpool,1);
|
|
pthread_mutex_init(&pool->mutex, NULL);
|
|
pool->data = rpc_new0(pointer,POOLCAPACITY);
|
|
pool->size = POOLCAPACITY;
|
|
return pool;
|
|
}
|
|
|
|
int rpc_sessionpool_insert(rpc_sessionpool *pool, pointer data) {
|
|
pthread_mutex_lock(&pool->mutex);
|
|
int i;
|
|
for (i = 0; i < pool->size; ++i) {
|
|
if (!pool->data[i]) {
|
|
pool->data[i] = data;
|
|
pthread_mutex_unlock(&pool->mutex);
|
|
return i;
|
|
}
|
|
}
|
|
int old_size = pool->size;
|
|
int new_size = old_size * 2;
|
|
pointer new_data = rpc_realloc(pool->data, sizeof(pointer) * new_size);
|
|
if (!new_data) {
|
|
fprintf(stderr,"insert session pool error!\n");
|
|
return -1;
|
|
}
|
|
pool->data = new_data;
|
|
pool->data[old_size] = data;
|
|
pool->size = new_size;
|
|
pthread_mutex_unlock(&pool->mutex);
|
|
return old_size;
|
|
}
|
|
|
|
pointer rpc_sessionpool_get(rpc_sessionpool *pool, int index) {
|
|
assert(index >= 0);
|
|
assert(index<pool->size);
|
|
pointer data;
|
|
pthread_mutex_lock(&pool->mutex);
|
|
data = pool->data[index];
|
|
pthread_mutex_unlock(&pool->mutex);
|
|
return data;
|
|
}
|
|
|
|
boolean rpc_sessionpool_remove(rpc_sessionpool *pool, int index) {
|
|
pthread_mutex_lock(&pool->mutex);
|
|
if (pool->data[index] != NULL) {
|
|
pool->data[index] = NULL;
|
|
}
|
|
pthread_mutex_unlock(&pool->mutex);
|
|
return TRUE;
|
|
}
|
|
|
|
boolean rpc_sessionpool_free(rpc_sessionpool *pool) {
|
|
if(pool){
|
|
pthread_mutex_lock(&pool->mutex);
|
|
rpc_free(pool->data);
|
|
pool->size = 0;
|
|
pthread_mutex_unlock(&pool->mutex);
|
|
pthread_mutex_destroy(&pool->mutex);
|
|
rpc_free(pool);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|