This source file includes following definitions.
- mbtowc_unlocked
 
- mbtowc_with_lock
 
- __declspec
 
- mbtowc_with_lock
 
- mbtowc_with_lock
 
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 static inline int
  22 mbtowc_unlocked (wchar_t *pwc, const char *p, size_t m)
     
  23 {
  24   
  25 
  26 
  27   mbtowc (NULL, NULL, 0);
  28 
  29   return mbtowc (pwc, p, m);
  30 }
  31 
  32 
  33 #undef gl_get_mbtowc_lock
  34 
  35 #if GNULIB_MBRTOWC_SINGLE_THREAD
  36 
  37 
  38 
  39 static int
  40 mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m)
     
  41 {
  42   return mbtowc_unlocked (pwc, p, m);
  43 }
  44 
  45 #elif defined _WIN32 && !defined __CYGWIN__
  46 
  47 extern __declspec(dllimport) CRITICAL_SECTION *gl_get_mbtowc_lock (void);
     
  48 
  49 static int
  50 mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m)
  51 {
  52   CRITICAL_SECTION *lock = gl_get_mbtowc_lock ();
  53   int ret;
  54 
  55   EnterCriticalSection (lock);
  56   ret = mbtowc_unlocked (pwc, p, m);
  57   LeaveCriticalSection (lock);
  58 
  59   return ret;
  60 }
  61 
  62 #elif HAVE_PTHREAD_API 
  63 
  64 extern
  65 # if defined _WIN32 || defined __CYGWIN__
  66   __declspec(dllimport)
  67 # endif
  68   pthread_mutex_t *gl_get_mbtowc_lock (void);
  69 
  70 # if HAVE_WEAK_SYMBOLS 
  71 
  72    
  73 #  pragma weak pthread_mutex_lock
  74 #  pragma weak pthread_mutex_unlock
  75 
  76    
  77 #  pragma weak pthread_mutexattr_gettype
  78    
  79 #  define pthread_in_use() \
  80      (pthread_mutexattr_gettype != NULL || c11_threads_in_use ())
  81 
  82 # else
  83 #  define pthread_in_use() 1
  84 # endif
  85 
  86 static int
  87 mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m)
     
  88 {
  89   if (pthread_in_use())
  90     {
  91       pthread_mutex_t *lock = gl_get_mbtowc_lock ();
  92       int ret;
  93 
  94       if (pthread_mutex_lock (lock))
  95         abort ();
  96       ret = mbtowc_unlocked (pwc, p, m);
  97       if (pthread_mutex_unlock (lock))
  98         abort ();
  99 
 100       return ret;
 101     }
 102   else
 103     return mbtowc_unlocked (pwc, p, m);
 104 }
 105 
 106 #elif HAVE_THREADS_H
 107 
 108 extern mtx_t *gl_get_mbtowc_lock (void);
 109 
 110 static int
 111 mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m)
     
 112 {
 113   mtx_t *lock = gl_get_mbtowc_lock ();
 114   int ret;
 115 
 116   if (mtx_lock (lock) != thrd_success)
 117     abort ();
 118   ret = mbtowc_unlocked (pwc, p, m);
 119   if (mtx_unlock (lock) != thrd_success)
 120     abort ();
 121 
 122   return ret;
 123 }
 124 
 125 #endif