bionic: fix __get_tls( ) crash issue
When running the stress test of pthread create/destroy, a crash may oocur in __get_tls(). That is caused by the race condition with __set_tls( ): Author: Jack Ren <jack.ren@intel.com> Signed-off-by: Bruce Beare <bruce.j.beare@intel.com>
This commit is contained in:
parent
897815a1fe
commit
31e72bc328
@ -60,6 +60,8 @@ static struct user_desc _tls_desc =
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static pthread_mutex_t _tls_desc_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
struct _thread_area_head {
|
struct _thread_area_head {
|
||||||
void *self;
|
void *self;
|
||||||
};
|
};
|
||||||
@ -71,6 +73,7 @@ int __set_tls(void *ptr)
|
|||||||
{
|
{
|
||||||
int rc, segment;
|
int rc, segment;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&_tls_desc_lock);
|
||||||
_tls_desc.base_addr = (unsigned long)ptr;
|
_tls_desc.base_addr = (unsigned long)ptr;
|
||||||
|
|
||||||
/* We also need to write the location of the tls to ptr[0] */
|
/* We also need to write the location of the tls to ptr[0] */
|
||||||
@ -88,6 +91,8 @@ int __set_tls(void *ptr)
|
|||||||
asm __volatile__ (
|
asm __volatile__ (
|
||||||
" movw %w0, %%gs" :: "q"(segment)
|
" movw %w0, %%gs" :: "q"(segment)
|
||||||
);
|
);
|
||||||
|
pthread_mutex_unlock(&_tls_desc_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user