packages/: Add ADNS and some of my packages.
[termux-packages] / packages / ldc / ldc-phobos.patch.beforehostbuild
1 diff --git a/std/stdio.d b/std/stdio.d
2 index 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