This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc 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: zonefile changes and long running processes.


On Tue, May 13, 2014 at 02:41:31PM -0700, Paul Eggert wrote:
> On 05/13/2014 02:14 PM, OndÅej BÃlka wrote:
> >tzstruct *ptr;
> >void tz_set_internal (tzstruct *set)
> >{
> >   tzstruct *old = atomic_exchange_acq (&ptr, set);
> >   if (old->malloced)
> >     free (old);
> >}
> 
> With this implementation, couldn't a tzset in one thread crash a
> localtime_r running in another thread?  E.g., won't trouble occur if
> the other thread's localtime_r implementation accesses the malloced
> storage at the same time the tzset thread invokes "free (old)"?
> POSIX allows some leeway here, and I presume we want to exploit that
> to improve performance, but does POSIX allow localtime_r to have
> undefined behavior if some other thread is simultaneously invoking
> tzset?

yes, it would as is now.

A simplest solution would be replace mutex there with rwlock so
localtime do not block each other.

A faster solution would be add counter for localtime_r, a tzset would
free previous buffers when a counter is zero, otherwise it would just
add a buffer to list of buffers that should be freed.


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