svn commit: r212838 - head/lib/libthr/thread

David Xu davidxu at FreeBSD.org
Sun Sep 19 05:42:29 UTC 2010


Author: davidxu
Date: Sun Sep 19 05:42:29 2010
New Revision: 212838
URL: http://svn.freebsd.org/changeset/base/212838

Log:
  - _Unwind_Resume function is not used, remove it.
  - Use a store barrier to make sure uwl_forcedunwind is lastest thing
    other threads can see.
  - Add some comments.

Modified:
  head/lib/libthr/thread/thr_exit.c

Modified: head/lib/libthr/thread/thr_exit.c
==============================================================================
--- head/lib/libthr/thread/thr_exit.c	Sun Sep 19 05:19:47 2010	(r212837)
+++ head/lib/libthr/thread/thr_exit.c	Sun Sep 19 05:42:29 2010	(r212838)
@@ -63,7 +63,6 @@ static _Unwind_Reason_Code thread_unwind
 /* unwind library pointers */
 static _Unwind_Reason_Code (*uwl_forcedunwind)(struct _Unwind_Exception *,
 	_Unwind_Stop_Fn, void *);
-static void (*uwl_resume)(struct _Unwind_Exception *exc);
 static _Unwind_Word (*uwl_getcfa)(struct _Unwind_Context *);
 
 static void
@@ -72,22 +71,24 @@ thread_uw_init(void)
 	static int inited = 0;
 	Dl_info dlinfo;
 	void *handle;
-	void *forcedunwind, *resume, *getcfa;
+	void *forcedunwind, *getcfa;
 
 	if (inited)
 	    return;
 	handle = RTLD_DEFAULT;
 	if ((forcedunwind = dlsym(handle, "_Unwind_ForcedUnwind")) != NULL) {
 	    if (dladdr(forcedunwind, &dlinfo)) {
+		/*
+		 * Make sure the address is always valid by holding the library,
+		 * also assume functions are in same library.
+		 */
 		if ((handle = dlopen(dlinfo.dli_fname, RTLD_LAZY)) != NULL) {
 		    forcedunwind = dlsym(handle, "_Unwind_ForcedUnwind");
-		    resume = dlsym(handle, "_Unwind_Resume");
 		    getcfa = dlsym(handle, "_Unwind_GetCFA");
-		    if (forcedunwind != NULL && resume != NULL &&
-			getcfa != NULL) {
-			uwl_forcedunwind = forcedunwind;
-			uwl_resume = resume;
+		    if (forcedunwind != NULL && getcfa != NULL) {
 			uwl_getcfa = getcfa;
+			atomic_store_rel_ptr((volatile void *)&uwl_forcedunwind,
+				(uintptr_t)forcedunwind);
 		    } else {
 			dlclose(handle);
 		    }
@@ -97,12 +98,6 @@ thread_uw_init(void)
 	inited = 1;
 }
 
-void
-_Unwind_Resume(struct _Unwind_Exception *ex)
-{
-	(*uwl_resume)(ex);
-}
- 
 _Unwind_Reason_Code
 _Unwind_ForcedUnwind(struct _Unwind_Exception *ex, _Unwind_Stop_Fn stop_func,
 	void *stop_arg)
@@ -118,7 +113,6 @@ _Unwind_GetCFA(struct _Unwind_Context *c
 #else
 #pragma weak _Unwind_GetCFA
 #pragma weak _Unwind_ForcedUnwind
-#pragma weak _Unwind_Resume
 #endif /* PIC */
 
 static void


More information about the svn-src-all mailing list