Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Thu, 4 Jul 2013 13:10:54 +0200
From: Szabolcs Nagy <nsz@...t70.net>
To: musl@...ts.openwall.com
Subject: Re: Use of size_t and ssize_t in mseek

* Rich Felker <dalias@...ifal.cx> [2013-07-04 04:12:45 -0400]:
> On Thu, Jul 04, 2013 at 09:11:29AM +0200, Jens Gustedt wrote:
> > > qsort_s can store the comparison function and context in TLS, and then
> > > pass to qsort a comparison function that grabs these from TLS and
> > > calls the original comparison function with the context pointer. This
> > > is valid assuming qsort does not run the comparisons in new threads.
> > 
> > sure, but for an execution of qsort_s this would have a lot of
> > indirections and a call to TLS for every comparison. For performance
> > sensible functions like this, this doesn't sound very attractive.
> 
> If it's inside musl, the TLS dereference is very cheap on most archs:
> it's just a constant offset from the thread pointer. Same if the code
> were static linked in the main program. Otherwise, if it's a dynamic
> library, then yes it would be fairly costly, like you say.

it seems to me that if a qsort_s call sets the tls and then before
the callee reads that pointer a signal interrupts with a handler that
calls qsort_s again then the tls is overwritten by another pointer

so you lose signal-safety with the tls design

> > (In P99 I do that with inlining and gcc shows to be able to expand all
> > comparisons in place and to optimize that smoothly.)
> 
> Nice. I'll have to take a look -- I've always wanted to see a fully
> inlined qsort that could be compared to the C++ template-based sorts
> to demonstrate that inline functions in C can do just as good or
> better, inlining the comparison callback... :)

* Jens Gustedt <jens.gustedt@...ia.fr> [2013-07-04 10:45:47 +0200]:
> http://gustedt.wordpress.com/2012/12/04/inline-functions-as-good-as-templates/

good to know that this works now..

it's not clear from the article how the compiler knew that the
last arg for qsort_s is supposed to be passed to the comparision
function: was it lto+static linking or was the internal of
qsort_s visible in the same translation unit?

a few years ago i did similar experiments but those failed back then:
https://groups.google.com/d/msg/comp.lang.c/sO2oYdZGdd8/bqFZ4i81P7AJ

(P.S. google seems to broke its usenet archives, if anyone
knows a good one that works without javascript enabled i'm
interested, meanwhile you can just replace /d/ with /forum/print/
in the url and get a reasonable rendering without js)

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.