Răsfoiți Sursa

remove invalid skip of locking in ungetwc

aside from being invalid, the early check only optimized the error
case, and likely pessimized the common case by separating the
two branches on isascii(c) at opposite ends of the function.
Rich Felker 10 ani în urmă
părinte
comite
7e816a6487
1 a modificat fișierele cu 3 adăugiri și 6 ștergeri
  1. 3 6
      src/stdio/ungetwc.c

+ 3 - 6
src/stdio/ungetwc.c

@@ -11,18 +11,15 @@ wint_t ungetwc(wint_t c, FILE *f)
 
 	if (c == WEOF) return c;
 
-	/* Try conversion early so we can fail without locking if invalid */
-	if (!isascii(c) && (l = wctomb((void *)mbc, c)) < 0)
-		return WEOF;
-
 	FLOCK(f);
 
 	f->mode |= f->mode+1;
 
 	if (!f->rpos) __toread(f);
-	if (!f->rpos || f->rpos < f->buf - UNGET + l) {
+	if (!f->rpos || f->rpos < f->buf - UNGET + l ||
+	    (!isascii(c) && (l = wctomb((void *)mbc, c)) < 0)) {
 		FUNLOCK(f);
-		return EOF;
+		return WEOF;
 	}
 
 	if (isascii(c)) *--f->rpos = c;