mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Jens Gustedt <jens.gustedt@inria.fr>
To: musl@lists.openwall.com
Subject: Re: [PATCH] fix atexit when it is called from an atexit handler
Date: Thu, 23 Jul 2015 07:54:03 +0200	[thread overview]
Message-ID: <1437630843.3270.1.camel@inria.fr> (raw)
In-Reply-To: <20150723030719.GB382@port70.net>

[-- Attachment #1: Type: text/plain, Size: 2470 bytes --]

Am Donnerstag, den 23.07.2015, 05:07 +0200 schrieb Szabolcs Nagy:
> * Rich Felker <dalias@libc.org> [2015-07-22 21:18:16 -0400]:
> > On Thu, Jul 23, 2015 at 01:44:06AM +0200, Szabolcs Nagy wrote:
> > >  void __funcs_on_exit()
> > >  {
> > >  	int i;
> > >  	void (*func)(void *), *arg;
> > >  	LOCK(lock);
> > > -	for (; head; head=head->next) for (i=COUNT-1; i>=0; i--) {
> > > -		if (!head->f[i]) continue;
> > > +	for (;;) {
> > > +		i = next();
> > > +		if (i<0) break;
> > >  		func = head->f[i];
> > >  		arg = head->a[i];
> > >  		head->f[i] = 0;
> > 
> > I agree that this change should be made, but I don't like the
> > particulars of the patch. It seems to increase exit handler runtime to
> > O(n²) even in the case where no atexit is happening during exit, and
> > it's not very elegant. I think a simpler solution would be to reset i
> > to COUNT after calling f[i] if either (1) head has changed, or (2)
> > i<COUNT-1 and f[i+1] is nonzero. Does this sound correct/better?
> 
> (2) should be 'f[i] is nonzero'.
> 
> i didnt think about detecting the change of head,
> but it is simpler and better for the common case.

I'd think this could be done even simpler by running the handlers in
batches. Something like

 (a) take the lock and save the head of the current list in a tmp
 variable
 (b) release the lock
 (c) iterate through the list that was saved in tmp
 (d) if now head is non-zero, goto (a)

This is clearly linear in the number of handlers that are ever insert
to the list.

For the current implementation this would need a bit of change in
__cxa_atexit because 0 for head wouldn't mean that it hasn't been
used, yet.

A similar improvement could be done for at_quick_exit. There I think
it makes not much sense accepting new handlers during processing. So
the strategy could just be

  (i) Take the lock and save count in a tmp
  (ii) set count to 32
  (iii) unlock
  (iv) do the processing

But looking at it, I think that one can even be more improved. We
could just use count as atomic, and so we wouldn't need a lock.
I can prepare a patch for that, if you like.

Jens


-- 
:: INRIA Nancy Grand Est ::: Camus ::::::: ICube/ICPS :::
:: ::::::::::::::: office Strasbourg : +33 368854536   ::
:: :::::::::::::::::::::: gsm France : +33 651400183   ::
:: ::::::::::::::: gsm international : +49 15737185122 ::
:: http://icube-icps.unistra.fr/index.php/Jens_Gustedt ::




[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

  reply	other threads:[~2015-07-23  5:54 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-22 23:44 Szabolcs Nagy
2015-07-23  1:18 ` Rich Felker
2015-07-23  3:07   ` Szabolcs Nagy
2015-07-23  5:54     ` Jens Gustedt [this message]
2015-07-23  7:19       ` Jens Gustedt
2015-07-23 19:58         ` Rich Felker
2015-07-23 21:51           ` Jens Gustedt
2015-07-24  0:16             ` Szabolcs Nagy
2015-07-24  6:52               ` Jens Gustedt
2015-07-24 10:53                 ` Szabolcs Nagy
2015-07-24 16:01                 ` Rich Felker
2015-07-24 21:25     ` Rich Felker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1437630843.3270.1.camel@inria.fr \
    --to=jens.gustedt@inria.fr \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).