check g_free_queue.head == NULL before free_queue_realloc()

pull/10/head
yuqing 2016-06-08 18:30:14 +08:00
parent 45e57c2bb0
commit fb0162d769
2 changed files with 26 additions and 15 deletions

View File

@ -1,10 +1,11 @@
Version 1.28 2016-06-06 Version 1.28 2016-06-08
* id generator support extra bits * id generator support extra bits
* change inet_aton to inet_pton * change inet_aton to inet_pton
* connect by ip and connection pool support ipv6 * connect by ip and connection pool support ipv6
* id generator in php extension support multi instance * id generator in php extension support multi instance
* add function http_parse_url_params * add function http_parse_url_params
* check g_free_queue.head == NULL before free_queue_realloc()
Version 1.27 2016-04-15 Version 1.27 2016-04-15
* add function fd_set_cloexec * add function fd_set_cloexec

View File

@ -410,6 +410,8 @@ static int free_queue_realloc()
struct fast_task_info *free_queue_pop() struct fast_task_info *free_queue_pop()
{ {
struct fast_task_info *pTask; struct fast_task_info *pTask;
int i;
if ((pTask=task_queue_pop(&g_free_queue)) != NULL) if ((pTask=task_queue_pop(&g_free_queue)) != NULL)
{ {
return pTask; return pTask;
@ -420,26 +422,34 @@ struct fast_task_info *free_queue_pop()
return NULL; return NULL;
} }
pthread_mutex_lock(&g_free_queue.lock); for (i=0; i<10; i++)
if (g_free_queue.alloc_connections >= g_free_queue.max_connections)
{ {
if (g_free_queue.head == NULL) pthread_mutex_lock(&g_free_queue.lock);
if (g_free_queue.alloc_connections >= g_free_queue.max_connections)
{ {
pthread_mutex_unlock(&g_free_queue.lock); if (g_free_queue.head == NULL)
return NULL; {
pthread_mutex_unlock(&g_free_queue.lock);
return NULL;
}
} }
} else
else
{
if (free_queue_realloc() != 0)
{ {
pthread_mutex_unlock(&g_free_queue.lock); if (g_free_queue.head == NULL && free_queue_realloc() != 0)
return NULL; {
pthread_mutex_unlock(&g_free_queue.lock);
return NULL;
}
} }
} pthread_mutex_unlock(&g_free_queue.lock);
pthread_mutex_unlock(&g_free_queue.lock);
return task_queue_pop(&g_free_queue); if ((pTask=task_queue_pop(&g_free_queue)) != NULL)
{
return pTask;
}
}
return NULL;
} }
static int _realloc_buffer(struct fast_task_info *pTask, const int new_size, static int _realloc_buffer(struct fast_task_info *pTask, const int new_size,