On Mon, Mar 07, 2011 at 03:06:18PM +0800, Daniel Veillard wrote:
On Fri, Mar 04, 2011 at 08:53:55AM -0700, Eric Blake wrote:
> On 03/04/2011 03:30 AM, Daniel Veillard wrote:
> > virLogEmergencyDumpAll() allows to dump the content of the
> > debug buffer from within a signal handler. It saves to all
> > log file or stderr if none is found
> > * src/util/logging.h src/util/logging.c: add the new API
> > and cleanup the old virLogDump code
> > * src/libvirt_private.syms: exports it as a private symbol
>
> >
> > +void
> > +virLogEmergencyDumpAll(int signum) {
> > + int ret = 0, len;
> > + char buf[100];
> > +
> > + if (virLogLen == 0)
> > + return;
> >
> > - if ((virLogLen == 0) || (f == NULL))
> > - return 0;
> > virLogLock();
>
> Is virLogLock async-signal-safe?
I could not find, I'm afraid it's implementation dependant. I would
expect the lock to be done in user space using an atomic test and set
op and hence being safe at least on i386 and x86_64.
The problem is that if we drop the lock we can crash if used on USR2
while another thread is legitimately running.
Even if the impl was robust there is an architectural problem
with mixing of mutexes and signals. If a thread is running
virLogMessage(), it will be holding the log mutex. If a signal
is processed, and it calls into this new log code, it will
likely deadlock.
Is there a way we can somehow make the global log buffer into
something that can be lockless for readers. ie although our
main log funcs would still need to use the mutex in general
when writing to the buffer, we could read the log buffer
without any locks.
It would probably suffice to make sure we use atomic integer
arithmetic on virLogLen, virLogStart and virLogEnd, and update
them in a specific order to avoid a reader seeing garbage.
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|