On Fri, Jun 23, 2017 at 12:56:10PM +0100, Daniel P. Berrange wrote:
On Fri, Jun 23, 2017 at 01:51:41PM +0200, Martin Kletzander wrote:
> On Fri, Jun 23, 2017 at 10:45:30AM +0100, Daniel P. Berrange wrote:
> > On Fri, Jun 23, 2017 at 11:42:01AM +0200, Martin Kletzander wrote:
> > > On Fri, Jun 23, 2017 at 09:32:07AM +0100, Daniel P. Berrange wrote:
> > > > On Fri, Jun 23, 2017 at 10:21:32AM +0200, Martin Kletzander wrote:
> > > > > On Thu, Jun 22, 2017 at 03:49:03PM +0200, Peter Krempa wrote:
> > > > > > On Thu, Jun 22, 2017 at 14:36:53 +0200, Martin Kletzander
wrote:
> > > > > > > Signed-off-by: Martin Kletzander
<mkletzan(a)redhat.com>
> > > > > > > ---
> > > > > > > src/util/virstring.c | 96
++++++++++++++++++++++++++++++++--------------------
> > > > > > > 1 file changed, 60 insertions(+), 36 deletions(-)
> > > > > > >
> > > > > > > diff --git a/src/util/virstring.c
b/src/util/virstring.c
> > > > > > > index feea5be05198..6125725364f3 100644
> > > > > > > --- a/src/util/virstring.c
> > > > > > > +++ b/src/util/virstring.c
> > > > > > > @@ -522,6 +522,7 @@ virStrToLong_ullp(char const *s,
char **end_ptr, int base,
> > > > > > > #if HAVE_NEWLOCALE
> > > > > > >
> > > > > > > static locale_t virLocale;
> > > > > > > +static locale_t virLocaleOld;
> > > > > >
> > > > > > This is not a thread local variable ...
> > > > > >
> > > > >
> > > > > Oh. shoot, you're right. So we need to wrap it in our struct
that will
> > > > > be defined conditionally as well, or allocate it on the heap,
copy it
> > > > > there and set a pointer to it as one additional parameter or make
thread
> > > > > local variable, but that one will need to be a pointer to the
locale, so
> > > > > we'll need to allocate it on the heap as well. I don't
like the way
> > > > > this is going. Anyone else feel free to continue on this if you
want to
> > > > > clean this up, but I like the few small conditional blocks
better,
> > > > > especially since we have them in only two functions.
> > > >
> > > > Just have virLocaleSet() return the original locale to the caller,
and
> > > > it can pass it back in when it reverts, avoiding any global
variables.
> > > >
> > >
> > > You cannot do that when you don't have 'locale_t', hence the
> > > complications. Or is the existence of locale_t somehow guaranteed by
> > > gnulib? If it is, then that's solved.
> >
> > Just wrap it in a typedef so we don't directly expose it in headers:
> >
> > #if HAVE_LOCALE_T
> > typedef virLocale locale_t
> > #else
> > typedef virLocale void
> > #endif
> >
>
> That's what I was talking about. We need this, but also a possibility
> to return error, so this needs to be an argument... And it's way more
> code that is there right now. I'm not saying NO to the change, I just
> that I like it like it's now (until more things need this treatment).
> So for others, feel free to propose changes as you like :)
But the current code you've proposed isn't thread safe, so it has to
change in some way surely ?
No, this proposed patch isn't thread-safe. Current master is OK, this
is only about "prettifying" the code.