Implement __fsetlocking.

The old __isthreaded hack was never very useful on Android because all user
code runs in a VM where there are lots of threads running. But __fsetlocking
lets a caller say "I'll worry about the locking for this FILE*", which is
useful for the normal case where you don't share a FILE* between threads
so you don't need any locking.

Bug: 17154740
Bug: 18593728
Change-Id: I2a8dddc29d3edff39a3d7d793387f2253608a68d
diff --git a/libc/stdio/fileext.h b/libc/stdio/fileext.h
index 25b7bda..75230cd 100644
--- a/libc/stdio/fileext.h
+++ b/libc/stdio/fileext.h
@@ -33,6 +33,7 @@
 #define _FILEEXT_H_
 
 #include <pthread.h>
+#include <stdbool.h>
 
 __BEGIN_DECLS
 
@@ -40,9 +41,10 @@
  * file extension
  */
 struct __sfileext {
-	struct	__sbuf _ub; /* ungetc buffer */
+	struct	__sbuf _ub;		/* ungetc buffer */
 	struct wchar_io_data _wcio;	/* wide char io status */
-	pthread_mutex_t _lock; /* file lock */
+	pthread_mutex_t _lock;		/* file lock */
+	bool _stdio_handles_locking;	/* __fsetlocking support */
 };
 
 #define _EXT(fp) ((struct __sfileext *)((fp)->_ext._base))
@@ -54,7 +56,8 @@
 	_UB(fp)._base = NULL; \
 	_UB(fp)._size = 0; \
 	WCIO_INIT(fp); \
-        _FLOCK(fp).value = __PTHREAD_RECURSIVE_MUTEX_INIT_VALUE; \
+	_FLOCK(fp).value = __PTHREAD_RECURSIVE_MUTEX_INIT_VALUE; \
+	_EXT(fp)->_stdio_handles_locking = true; \
 } while (0)
 
 #define _FILEEXT_SETUP(f, fext) \