69 lines
1.6 KiB
C
69 lines
1.6 KiB
C
|
/*
|
||
|
* 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;
|
||
|
}
|