Module Name: src Committed By: martin Date: Sun Jan 27 18:25:52 UTC 2019
Modified Files: src/lib/libc/gen [netbsd-8]: popen.c Log Message: Pull up following revision(s) (requested by christos in ticket #1170): lib/libc/gen/popen.c: revision 1.36 PR/53904: Jintao Zhu: Use a mutex instead of an rwlock to assure thread safety To generate a diff of this commit: cvs rdiff -u -r1.35 -r1.35.8.1 src/lib/libc/gen/popen.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/gen/popen.c diff -u src/lib/libc/gen/popen.c:1.35 src/lib/libc/gen/popen.c:1.35.8.1 --- src/lib/libc/gen/popen.c:1.35 Mon Feb 2 22:07:05 2015 +++ src/lib/libc/gen/popen.c Sun Jan 27 18:25:52 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: popen.c,v 1.35 2015/02/02 22:07:05 christos Exp $ */ +/* $NetBSD: popen.c,v 1.35.8.1 2019/01/27 18:25:52 martin Exp $ */ /* * Copyright (c) 1988, 1993 @@ -37,7 +37,7 @@ #if 0 static char sccsid[] = "@(#)popen.c 8.3 (Berkeley) 5/3/95"; #else -__RCSID("$NetBSD: popen.c,v 1.35 2015/02/02 22:07:05 christos Exp $"); +__RCSID("$NetBSD: popen.c,v 1.35.8.1 2019/01/27 18:25:52 martin Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -73,7 +73,20 @@ static struct pid { } *pidlist; #ifdef _REENTRANT -static rwlock_t pidlist_lock = RWLOCK_INITIALIZER; +static mutex_t pidlist_mutex = MUTEX_INITIALIZER; +# define MUTEX_LOCK() \ + do { \ + if (__isthreaded) \ + mutex_lock(&pidlist_mutex); \ + } while (/*CONSTCOND*/0) +# define MUTEX_UNLOCK() \ + do { \ + if (__isthreaded) \ + mutex_unlock(&pidlist_mutex); \ + } while (/*CONSTCOND*/0) +#else +# define MUTEX_LOCK() __nothing +# define MUTEX_UNLOCK() __nothing #endif static struct pid * @@ -183,17 +196,13 @@ popen(const char *cmd, const char *type) if ((cur = pdes_get(pdes, &type)) == NULL) return NULL; -#ifdef _REENTRANT - (void)rwlock_rdlock(&pidlist_lock); -#endif + MUTEX_LOCK(); (void)__readlockenv(); switch (pid = vfork()) { case -1: /* Error. */ serrno = errno; (void)__unlockenv(); -#ifdef _REENTRANT - (void)rwlock_unlock(&pidlist_lock); -#endif + MUTEX_UNLOCK(); pdes_error(pdes, cur); errno = serrno; return NULL; @@ -208,9 +217,7 @@ popen(const char *cmd, const char *type) pdes_parent(pdes, cur, pid, type); -#ifdef _REENTRANT - (void)rwlock_unlock(&pidlist_lock); -#endif + MUTEX_UNLOCK(); return cur->fp; } @@ -228,15 +235,11 @@ popenve(const char *cmd, char *const *ar if ((cur = pdes_get(pdes, &type)) == NULL) return NULL; -#ifdef _REENTRANT - (void)rwlock_rdlock(&pidlist_lock); -#endif + MUTEX_LOCK(); switch (pid = vfork()) { case -1: /* Error. */ serrno = errno; -#ifdef _REENTRANT - (void)rwlock_unlock(&pidlist_lock); -#endif + MUTEX_UNLOCK(); pdes_error(pdes, cur); errno = serrno; return NULL; @@ -250,9 +253,7 @@ popenve(const char *cmd, char *const *ar pdes_parent(pdes, cur, pid, type); -#ifdef _REENTRANT - (void)rwlock_unlock(&pidlist_lock); -#endif + MUTEX_UNLOCK(); return cur->fp; } @@ -271,18 +272,14 @@ pclose(FILE *iop) _DIAGASSERT(iop != NULL); -#ifdef _REENTRANT - rwlock_wrlock(&pidlist_lock); -#endif + MUTEX_LOCK(); /* Find the appropriate file pointer. */ for (last = NULL, cur = pidlist; cur; last = cur, cur = cur->next) if (cur->fp == iop) break; if (cur == NULL) { -#ifdef _REENTRANT - (void)rwlock_unlock(&pidlist_lock); -#endif + MUTEX_UNLOCK(); errno = ESRCH; return -1; } @@ -295,9 +292,7 @@ pclose(FILE *iop) else last->next = cur->next; -#ifdef _REENTRANT - (void)rwlock_unlock(&pidlist_lock); -#endif + MUTEX_UNLOCK(); do { pid = waitpid(cur->pid, &pstat, 0);