PERFORCE change 73558 for review
David Xu
davidxu at FreeBSD.org
Sat Mar 19 19:53:18 PST 2005
http://perforce.freebsd.org/chv.cgi?CH=73558
Change 73558 by davidxu at davidxu_alona on 2005/03/20 03:52:51
Add missing lock code for tls.
Affected files ...
.. //depot/projects/davidxu_thread/src/libexec/rtld-elf/rtld.c#4 edit
Differences ...
==== //depot/projects/davidxu_thread/src/libexec/rtld-elf/rtld.c#4 (text+ko) ====
@@ -2486,12 +2486,14 @@
tls_get_addr_common(Elf_Addr** dtvp, int index, size_t offset)
{
Elf_Addr* dtv = *dtvp;
+ int lockstate;
/* Check dtv generation in case new modules have arrived */
if (dtv[0] != tls_dtv_generation) {
Elf_Addr* newdtv;
int to_copy;
+ lockstate = wlock_acquire(rtld_bind_lock);
newdtv = calloc(1, (tls_max_index + 2) * sizeof(Elf_Addr));
to_copy = dtv[1];
if (to_copy > tls_max_index)
@@ -2500,13 +2502,17 @@
newdtv[0] = tls_dtv_generation;
newdtv[1] = tls_max_index;
free(dtv);
+ wlock_release(rtld_bind_lock, lockstate);
*dtvp = newdtv;
}
/* Dynamically allocate module TLS if necessary */
- if (!dtv[index + 1])
- dtv[index + 1] = (Elf_Addr)allocate_module_tls(index);
-
+ if (!dtv[index + 1]) {
+ lockstate = wlock_acquire(rtld_bind_lock);
+ if (!dtv[index + 1])
+ dtv[index + 1] = (Elf_Addr)allocate_module_tls(index);
+ wlock_release(rtld_bind_lock, lockstate);
+ }
return (void*) (dtv[index + 1] + offset);
}
@@ -2796,11 +2802,21 @@
void *
_rtld_allocate_tls(void *oldtls, size_t tcbsize, size_t tcbalign)
{
- return allocate_tls(obj_list, oldtls, tcbsize, tcbalign);
+ void *ret;
+ int lockstate;
+
+ lockstate = wlock_acquire(rtld_bind_lock);
+ ret = allocate_tls(obj_list, oldtls, tcbsize, tcbalign);
+ wlock_release(rtld_bind_lock, lockstate);
+ return (ret);
}
void
_rtld_free_tls(void *tcb, size_t tcbsize, size_t tcbalign)
{
+ int lockstate;
+
+ lockstate = wlock_acquire(rtld_bind_lock);
free_tls(tcb, tcbsize, tcbalign);
+ wlock_release(rtld_bind_lock, lockstate);
}
More information about the p4-projects
mailing list