This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
[RFA] More aggressive use of atexit locking
- From: Christopher Faylor <cgf-use-the-mailinglist-please at sourceware dot org>
- To: newlib at sourceware dot org
- Date: Mon, 1 Feb 2010 21:10:54 -0500
- Subject: [RFA] More aggressive use of atexit locking
It seems like we should be locking both the feeder and the emptier for
atexit operations shouldn't we? Otherwise one can be deleting things
while another is adding things. This is especially important for the
__cxa_* functions since the emptier can be called at any time, not just
on process exit.
Ok to commit?
cgf
2010-02-01 Christopher Faylor <me+cygwin@cgf.cx>
* libc/stdlib/__atexit.c (__atexit_lock): Define a global lock for
atexit functions.
(__register_exitproc): Use __atexit_lock rather than a local static
lock.
* libc/stdlib/__call_atexit.c: Ditto.
Index: libc/stdlib/__atexit.c
===================================================================
RCS file: /cvs/uberbaum/newlib/libc/stdlib/__atexit.c,v
retrieving revision 1.5
diff -d -u -p -r1.5 __atexit.c
--- libc/stdlib/__atexit.c 23 Apr 2009 17:54:22 -0000 1.5
+++ libc/stdlib/__atexit.c 2 Feb 2010 02:00:55 -0000
@@ -10,6 +10,7 @@
/* Make this a weak reference to avoid pulling in malloc. */
void * malloc(size_t) _ATTRIBUTE((__weak__));
+__LOCK_INIT(, __atexit_lock);
/*
* Register a function to be performed at exit or on shared library unload.
@@ -27,9 +28,7 @@ _DEFUN (__register_exitproc,
register struct _atexit *p;
#ifndef __SINGLE_THREAD__
- __LOCK_INIT(static, lock);
-
- __lock_acquire(lock);
+ __lock_acquire(__atexit_lock);
#endif
p = _GLOBAL_REENT->_atexit;
@@ -49,7 +48,7 @@ _DEFUN (__register_exitproc,
if (p == NULL)
{
#ifndef __SINGLE_THREAD__
- __lock_release(lock);
+ __lock_release(__atexit_lock);
#endif
return -1;
}
@@ -94,7 +93,7 @@ _DEFUN (__register_exitproc,
}
p->_fns[p->_ind++] = fn;
#ifndef __SINGLE_THREAD__
- __lock_release(lock);
+ __lock_release(__atexit_lock);
#endif
return 0;
}
Index: libc/stdlib/__call_atexit.c
===================================================================
RCS file: /cvs/uberbaum/newlib/libc/stdlib/__call_atexit.c,v
retrieving revision 1.6
diff -d -u -p -r1.6 __call_atexit.c
--- libc/stdlib/__call_atexit.c 23 Apr 2009 17:54:22 -0000 1.6
+++ libc/stdlib/__call_atexit.c 2 Feb 2010 02:00:55 -0000
@@ -10,6 +10,10 @@
/* Make this a weak reference to avoid pulling in free. */
void free(void *) _ATTRIBUTE((__weak__));
+#ifndef __SINGLE_THREAD__
+extern _LOCK_T __atexit_lock;
+#endif
+
/*
* Call registered exit handlers. If D is null then all handlers are called,
* otherwise only the handlers from that DSO are called.
@@ -26,6 +30,11 @@ _DEFUN (__call_exitprocs, (code, d),
int i;
void (*fn) (void);
+
+#ifndef __SINGLE_THREAD__
+ __lock_acquire(__atexit_lock);
+#endif
+
restart:
p = _GLOBAL_REENT->_atexit;
@@ -104,4 +113,8 @@ _DEFUN (__call_exitprocs, (code, d),
}
#endif
}
+#ifndef __SINGLE_THREAD__
+ __lock_release(__atexit_lock);
+#endif
+
}