chiark / gitweb /
debianutils: Update from 4.8.3 to 4.8.4
[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