1 diff --git a/std/stdio.d b/std/stdio.d
2 index 0c315026..8b1860d0 100644
4 +++ b/runtime/phobos/std/stdio.d
5 @@ -310,6 +310,45 @@ else version (GENERIC_IO)
6 void funlockfile(FILE*);
9 + version(CRuntime_Bionic)
11 + import core.stdc.wchar_ : mbstate_t;
12 + import core.sys.posix.sys.types : pthread_mutex_t;
14 + extern(C) struct wchar_io_data
16 + mbstate_t wcio_mbstate_in;
17 + mbstate_t wcio_mbstate_out;
18 + wchar_t[1] wcio_ungetwc_buf;
19 + size_t wcio_ungetwc_inbuf;
23 + extern(C) struct __sfileext
26 + wchar_io_data _wcio;
27 + pthread_mutex_t _lock;
30 + void bionic_lock(FILE* foo)
32 + if( foo == stdout._p.handle || foo == stdin._p.handle || foo == stderr._p.handle)
34 + auto ext = cast(__sfileext*) foo._ext._base;
35 + if (ext._lock.value == 0)
37 + // A bionic regression in Android 5.0 leaves
38 + // the mutex for stdout/err/in uninitialized,
39 + // so check for that and initialize it.
40 + printf("lock is zero, initializing...\n");
41 + ext._lock.value = 0x4000;
48 int fputc_unlocked(int c, _iobuf* fp) { return fputc(c, cast(shared) fp); }
49 int fputwc_unlocked(wchar_t c, _iobuf* fp)
51 @@ -328,7 +367,10 @@ else version (GENERIC_IO)
52 alias FGETC = fgetc_unlocked;
53 alias FGETWC = fgetwc_unlocked;
55 - alias FLOCK = flockfile;
56 + version(CRuntime_Bionic)
57 + alias FLOCK = bionic_lock;
59 + alias FLOCK = flockfile;
60 alias FUNLOCK = funlockfile;