erlang: Update from 20.3.2 to 20.3.4
[termux-packages] / packages / ldc / ldc-phobos.patch.beforehostbuild
CommitLineData
89304c98 1diff --git a/std/stdio.d b/std/stdio.d
2index 0c315026..8b1860d0 100644
3--- a/std/stdio.d
4+++ b/runtime/phobos/std/stdio.d
5@@ -310,6 +310,45 @@ else version (GENERIC_IO)
6 void funlockfile(FILE*);
7 }
8
9+ version(CRuntime_Bionic)
10+ {
11+ import core.stdc.wchar_ : mbstate_t;
12+ import core.sys.posix.sys.types : pthread_mutex_t;
13+
14+ extern(C) struct wchar_io_data
15+ {
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;
20+ int wcio_mode;
21+ }
22+
23+ extern(C) struct __sfileext
24+ {
25+ __sbuf _ub;
26+ wchar_io_data _wcio;
27+ pthread_mutex_t _lock;
28+ }
29+
30+ void bionic_lock(FILE* foo)
31+ {
32+ if( foo == stdout._p.handle || foo == stdin._p.handle || foo == stderr._p.handle)
33+ {
34+ auto ext = cast(__sfileext*) foo._ext._base;
35+ if (ext._lock.value == 0)
36+ {
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;
42+ }
43+ }
44+ flockfile(foo);
45+ }
46+ }
47+
48 int fputc_unlocked(int c, _iobuf* fp) { return fputc(c, cast(shared) fp); }
49 int fputwc_unlocked(wchar_t c, _iobuf* fp)
50 {
51@@ -328,7 +367,10 @@ else version (GENERIC_IO)
52 alias FGETC = fgetc_unlocked;
53 alias FGETWC = fgetwc_unlocked;
54
55- alias FLOCK = flockfile;
56+ version(CRuntime_Bionic)
57+ alias FLOCK = bionic_lock;
58+ else
59+ alias FLOCK = flockfile;
60 alias FUNLOCK = funlockfile;
61 }
62 else