20 #include <curl/curl.h> 26 struct _ds3_connection_pool{
28 uint16_t num_connections;
30 uint16_t max_connections;
48 pool->max_connections = pool_size;
50 g_mutex_init(&pool->mutex);
51 g_cond_init(&pool->available_connection_notifier);
63 if (already_locked ==
False) {
64 g_mutex_lock(&pool->mutex);
67 for (index = 0; index < pool->num_connections; index++) {
68 if (pool->connections[index] != NULL) {
69 curl_easy_cleanup(pool->connections[index]);
73 g_free(pool->connections);
74 g_free(pool->connection_queue);
75 g_mutex_unlock(&pool->mutex);
76 g_mutex_clear(&pool->mutex);
77 g_cond_clear(&pool->available_connection_notifier);
81 return (index+1) % size;
85 int queue_head = pool->queue_head;
86 return pool->queue_tail == queue_head && pool->connection_queue[queue_head] == NULL;
92 g_mutex_lock(&pool->mutex);
93 while (
_queue_is_empty(pool) && pool->num_connections >= pool->max_connections) {
94 g_cond_wait(&pool->available_connection_notifier, &pool->mutex);
98 connection = curl_easy_init();
100 pool->connections[pool->num_connections] = connection;
101 pool->num_connections++;
103 connection = pool->connection_queue[pool->queue_tail];
104 pool->connection_queue[pool->queue_tail] = NULL;
105 pool->queue_tail =
_queue_inc(pool->queue_tail, pool->max_connections);
108 g_mutex_unlock(&pool->mutex);
114 g_mutex_lock(&pool->mutex);
116 curl_easy_reset(connection);
118 pool->connection_queue[pool->queue_head] = connection;
120 pool->queue_head =
_queue_inc(pool->queue_head, pool->max_connections);
122 g_cond_signal(&pool->available_connection_notifier);
123 g_mutex_unlock(&pool->mutex);
127 g_mutex_lock(&pool->mutex);
129 g_mutex_unlock(&pool->mutex);
133 g_mutex_lock(&pool->mutex);
136 if (pool->ref_count == 0) {
140 g_mutex_unlock(&pool->mutex);
ds3_connection_pool * ds3_connection_pool_init_with_size(uint16_t pool_size)
void ds3_connection_pool_dec_ref(ds3_connection_pool *pool)
ds3_connection_pool * ds3_connection_pool_init(void)
void ds3_connection_pool_inc_ref(ds3_connection_pool *pool)
static int _queue_inc(int index, uint16_t size)
void ds3_connection_pool_clear(ds3_connection_pool *pool, ds3_bool already_locked)
struct _ds3_connection_pool ds3_connection_pool
void ds3_connection_release(ds3_connection_pool *pool, ds3_connection *connection)
static int _queue_is_empty(ds3_connection_pool *pool)
#define DEFAULT_CONNECTION_POOL_SIZE
ds3_connection * ds3_connection_acquire(ds3_connection_pool *pool)