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