[Beignet] [PATCH V2] Fix the bug of multi-thread crash
Zhigang Gong
zhigang.gong at linux.intel.com
Thu Nov 13 01:21:10 PST 2014
LGTM, pushed, thanks!
On Thu, Nov 13, 2014 at 05:40:46PM +0800, junyan.he at inbox.com wrote:
> From: Junyan He <junyan.he at linux.intel.com>
>
> The cl_thread has a potential problem.
> If the threads are created and destroyed very fast,
> while the queue remain avaible, the resource of
> destroyed thread will not be free correctly and will
> be wrongly reused by later created thread.
>
> V2:
> Use a easy way to handle this case. We do not clear
> the resource and just keep it. The later thread will
> not wrongly reuse it. The thread number will not be
> a very huge, so it is reasonable to clear all the
> resource when the command queue is destroyed.
>
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
> src/cl_thread.c | 13 -------------
> 1 file changed, 13 deletions(-)
>
> diff --git a/src/cl_thread.c b/src/cl_thread.c
> index d4de1b3..0d99574 100644
> --- a/src/cl_thread.c
> +++ b/src/cl_thread.c
> @@ -37,7 +37,6 @@ static int thread_array_num = 1;
> static int *thread_slot_map = NULL;
> static int thread_magic_num = 1;
> static pthread_mutex_t thread_queue_map_lock = PTHREAD_MUTEX_INITIALIZER;
> -static pthread_key_t destroy_key;
>
> static __thread int thread_id = -1;
> static __thread int thread_magic = -1;
> @@ -55,13 +54,6 @@ typedef struct _queue_thread_private {
> pthread_mutex_t thread_data_lock;
> } queue_thread_private;
>
> -static void thread_data_destructor(void *dummy) {
> - pthread_mutex_lock(&thread_queue_map_lock);
> - thread_slot_map[thread_id] = 0;
> - pthread_mutex_unlock(&thread_queue_map_lock);
> - free(dummy);
> -}
> -
> static thread_spec_data * __create_thread_spec_data(cl_command_queue queue, int create)
> {
> queue_thread_private *thread_private = ((queue_thread_private *)(queue->thread_data));
> @@ -69,7 +61,6 @@ static thread_spec_data * __create_thread_spec_data(cl_command_queue queue, int
> int i = 0;
>
> if (thread_id == -1) {
> - void * dummy = malloc(sizeof(int));
>
> pthread_mutex_lock(&thread_queue_map_lock);
> for (i = 0; i < thread_array_num; i++) {
> @@ -90,8 +81,6 @@ static thread_spec_data * __create_thread_spec_data(cl_command_queue queue, int
>
> thread_magic = thread_magic_num++;
> pthread_mutex_unlock(&thread_queue_map_lock);
> -
> - pthread_setspecific(destroy_key, dummy);
> }
>
> pthread_mutex_lock(&thread_private->thread_data_lock);
> @@ -129,7 +118,6 @@ void* cl_thread_data_create(void)
> thread_slot_map = calloc(thread_array_num, sizeof(int));
> pthread_mutex_unlock(&thread_queue_map_lock);
>
> - pthread_key_create(&destroy_key, thread_data_destructor);
> }
>
> pthread_mutex_init(&thread_private->thread_data_lock, NULL);
> @@ -238,7 +226,6 @@ void cl_thread_data_destroy(cl_command_queue queue)
> thread_spec_data** threads_data;
>
> pthread_mutex_lock(&thread_private->thread_data_lock);
> - assert(thread_private->threads_data_num == thread_array_num);
> threads_data_num = thread_private->threads_data_num;
> threads_data = thread_private->threads_data;
> thread_private->threads_data_num = 0;
> --
> 1.9.1
>
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list