syslog() reentrant when compiling with -pthread?
Dan Nelson
dnelson at allantgroup.com
Wed Oct 6 08:07:20 PDT 2004
In the last episode (Oct 06), Dan Nelson said:
> > My question regarding thread-safeness of syslog(): On OpenBSD I
> > used syslog_r() to do thread safe logging (the software in question
> > is a sendmail milter, which runs multithreaded). FreeBSD does not
> > have these functions, but the cc man page states that compiling
> > with "-pthread" links in the thread safe libc_r library instead of
> > libc. As syslog() seems to part of libc on FreeBSD, is it safe to
> > assume that syslog() is indeed thread safe on FreeBSD when
> > compiling with the -pthread switch?
>
> The only unsafe part is openlog(), so set that up before you start
> any threads and you'll be okay. Once the log fd is opened, the
> syslog() call looks to be thread-safe. Everything in there is done
> with local variables and atomic writes.
I just noticed your email address :) smtp-vilter 1.1.5 works just
fine on FreeBSD with plain syslog with this port Makefile addition:
# Use regular syslog instead of openbsd's syslog_r interface.
post-patch:
@${FIND} ${WRKSRC} -name '*.[ch]' | ${XARGS} ${REINPLACE_CMD} \
-e 's/syslog_r(\(.*\), &sdata,/syslog(\1,/' \
-e '/SYSLOG_DATA_INIT/d' \
-e 's/openlog_r(\(.*\),\(.*\),\(.*\),.*)/openlog(\1,\2,\3)/' \
-e 's/closelog_r(.*)/closelog()/'
FreeBSD should probably make syslog completely thread-safe, though.
Just adding a mutex around the open/close operations would be enough.
It looks like that's what Solaris does. The only place you really need
syslog_r afaik is if you want to open multiple log handles at different
facilities or levels at the same time.
--
Dan Nelson
dnelson at allantgroup.com
More information about the freebsd-hackers
mailing list