Sophie

Sophie

distrib > Mageia > 3 > i586 > media > core-release-src > by-pkgid > 94657ea61a0b77e594b65d0a903c8ff0 > files > 2

mbuffer-20121111-2.mga3.src.rpm

--- log.c	2012-11-16 11:17:11.000000000 +0100
+++ log.c.oden	2013-01-04 11:44:00.198876548 +0100
@@ -47,20 +47,35 @@ pthread_mutex_t
 	LogMut = PTHREAD_MUTEX_INITIALIZER;
 #endif
 
-
-#ifdef DEBUG
-void logdebug(const char *msg, ...)
+void logwrite(char *buf, size_t b)
 {
-	va_list val;
-	char buf[256];
-	size_t b = PrefixLen;
-
-	va_start(val,msg);
-	(void) memcpy(buf,Prefix,b);
-	b += vsnprintf(buf + b,sizeof(buf)-b,msg,val);
-	assert(b < sizeof(buf));
 #ifdef NEED_IO_INTERLOCK
-	if (b <= PIPE_BUF) {
+	static int lastfd = -1;
+	static size_t pipebuf = 0;
+
+	if (pipebuf == 0 || Log != lastfd) {
+		long p = -1;
+
+#ifdef _PC_PIPE_BUF
+		p = fpathconf(Log,_PC_PIPE_BUF);
+#endif
+		if (p == -1)
+#ifdef PIPE_BUF
+			p = PIPE_BUF;
+#else
+#ifdef _POSIX_PIPE_BUF
+			p = _POSIX_PIPE_BUF;
+#else
+			p = 512;
+#endif
+#endif
+		assert(p >= 0);
+		pipebuf = p;
+		assert(p == (long)pipebuf);
+		lastfd = Log;
+	}
+
+	if (b <= pipebuf) {
 		(void) write(Log,buf,b);
 	} else {
 		int err;
@@ -73,6 +88,20 @@ void logdebug(const char *msg, ...)
 #else
 	(void) write(Log,buf,b);
 #endif
+}
+
+#ifdef DEBUG
+void logdebug(const char *msg, ...)
+{
+	va_list val;
+	char buf[256];
+	size_t b = PrefixLen;
+
+	va_start(val,msg);
+	(void) memcpy(buf,Prefix,b);
+	b += vsnprintf(buf + b,sizeof(buf)-b,msg,val);
+	assert(b < sizeof(buf));
+	logwrite(buf,b);
 	va_end(val);
 }
 #define debugmsg if (Verbose >= 5) logdebug
@@ -93,20 +122,7 @@ void infomsg(const char *msg, ...)
 		b += vsnprintf(b,sizeof(buf)-(b-buf),msg,val);
 		s = b - buf;
 		assert(s < sizeof(buf));
-#ifdef NEED_IO_INTERLOCK
-		if (s <= PIPE_BUF) {
-			(void) write(Log,buf,s);
-		} else {
-			int err;
-			err = pthread_mutex_lock(&LogMut);
-			assert(err == 0);
-			(void) write(Log,buf,s);
-			err = pthread_mutex_unlock(&LogMut);
-			assert(err == 0);
-		}
-#else
-		(void) write(Log,buf,s);
-#endif
+		logwrite(buf,s);
 		va_end(val);
 	}
 }
@@ -126,20 +142,7 @@ void warningmsg(const char *msg, ...)
 		b += vsnprintf(b,sizeof(buf)-(b-buf),msg,val);
 		s = b - buf;
 		assert(s < sizeof(buf));
-#ifdef NEED_IO_INTERLOCK
-		if (s <= PIPE_BUF) {
-			(void) write(Log,buf,s);
-		} else {
-			int err;
-			err = pthread_mutex_lock(&LogMut);
-			assert(err == 0);
-			(void) write(Log,buf,s);
-			err = pthread_mutex_unlock(&LogMut);
-			assert(err == 0);
-		}
-#else
-		(void) write(Log,buf,s);
-#endif
+		logwrite(buf,s);
 		va_end(val);
 	}
 }
@@ -160,20 +163,7 @@ void errormsg(const char *msg, ...)
 		b += vsnprintf(b,sizeof(buf)-(b-buf),msg,val);
 		s = b - buf;
 		assert(s < sizeof(buf));
-#ifdef NEED_IO_INTERLOCK
-		if (s <= PIPE_BUF) {
-			(void) write(Log,buf,s);
-		} else {
-			int err;
-			err = pthread_mutex_lock(&LogMut);
-			assert(err == 0);
-			(void) write(Log,buf,s);
-			err = pthread_mutex_unlock(&LogMut);
-			assert(err == 0);
-		}
-#else
-		(void) write(Log,buf,s);
-#endif
+		logwrite(buf,s);
 		va_end(val);
 	}
 	if (ErrorsFatal) {
@@ -197,20 +187,7 @@ void fatal(const char *msg, ...)
 		b += vsnprintf(b,sizeof(buf)-(b-buf),msg,val);
 		s = b - buf;
 		assert(s < sizeof(buf));
-#ifdef NEED_IO_INTERLOCK
-		if (s <= PIPE_BUF) {
-			(void) write(Log,buf,s);
-		} else {
-			int err;
-			err = pthread_mutex_lock(&LogMut);
-			assert(err == 0);
-			(void) write(Log,buf,s);
-			err = pthread_mutex_unlock(&LogMut);
-			assert(err == 0);
-		}
-#else
-		(void) write(Log,buf,s);
-#endif
+		logwrite(buf,s);
 		va_end(val);
 	}
 	exit(EXIT_FAILURE);