Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Mar 2005 03:53:17 GMT
From:      David Xu <davidxu@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 73558 for review
Message-ID:  <200503200353.j2K3rH09068545@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=73558

Change 73558 by davidxu@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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200503200353.j2K3rH09068545>