This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA] More aggressive use of atexit locking


On 01/02/10 09:10 PM, Christopher Faylor wrote:
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?


Yes, go ahead.


-- Jeff J.

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
+
  }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]