webruby 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webruby/config.rb +4 -9
  3. data/lib/webruby/rake/files.rake +2 -2
  4. data/modules/emscripten/AUTHORS +9 -1
  5. data/modules/emscripten/CONTRIBUTING.markdown +5 -0
  6. data/modules/emscripten/ChangeLog +435 -0
  7. data/modules/emscripten/cmake/Modules/FindOpenAL.cmake +26 -0
  8. data/modules/emscripten/cmake/Platform/Emscripten.cmake +9 -2
  9. data/modules/emscripten/em++ +0 -2
  10. data/modules/emscripten/emcc +92 -32
  11. data/modules/emscripten/emlink.py +16 -13
  12. data/modules/emscripten/emmake +1 -1
  13. data/modules/emscripten/emrun +918 -0
  14. data/modules/emscripten/emrun.bat +2 -0
  15. data/modules/emscripten/emscripten.py +545 -20
  16. data/modules/emscripten/src/analyzer.js +6 -1
  17. data/modules/emscripten/src/compiler.js +25 -16
  18. data/modules/emscripten/src/emrun_postjs.js +20 -0
  19. data/modules/emscripten/{tests → src}/hello_world.js +0 -0
  20. data/modules/emscripten/src/intertyper.js +45 -16
  21. data/modules/emscripten/src/jsifier.js +78 -48
  22. data/modules/emscripten/src/library.js +381 -96
  23. data/modules/emscripten/src/library_browser.js +50 -53
  24. data/modules/emscripten/src/library_egl.js +66 -24
  25. data/modules/emscripten/src/library_fs.js +122 -90
  26. data/modules/emscripten/src/library_gl.js +739 -353
  27. data/modules/emscripten/src/library_glfw.js +9 -3
  28. data/modules/emscripten/src/library_glut.js +10 -5
  29. data/modules/emscripten/src/library_idbfs.js +14 -14
  30. data/modules/emscripten/src/library_memfs.js +65 -41
  31. data/modules/emscripten/src/library_nodefs.js +61 -9
  32. data/modules/emscripten/src/library_openal.js +4 -4
  33. data/modules/emscripten/src/library_path.js +9 -13
  34. data/modules/emscripten/src/library_sdl.js +301 -64
  35. data/modules/emscripten/src/library_sockfs.js +7 -5
  36. data/modules/emscripten/src/modules.js +62 -22
  37. data/modules/emscripten/src/parseTools.js +135 -102
  38. data/modules/emscripten/src/postamble.js +3 -4
  39. data/modules/emscripten/src/preamble.js +49 -29
  40. data/modules/emscripten/src/proxyClient.js +1 -1
  41. data/modules/emscripten/src/proxyWorker.js +10 -10
  42. data/modules/emscripten/src/relooper/Relooper.cpp +15 -4
  43. data/modules/emscripten/src/runtime.js +32 -8
  44. data/modules/emscripten/src/settings.js +25 -8
  45. data/modules/emscripten/src/shell.html +6 -3
  46. data/modules/emscripten/src/shell.js +13 -11
  47. data/modules/emscripten/src/simd.js +602 -432
  48. data/modules/emscripten/src/struct_info.json +22 -2
  49. data/modules/emscripten/src/utility.js +32 -17
  50. data/modules/emscripten/system/include/SDL/SDL_events.h +1 -0
  51. data/modules/emscripten/system/include/compat/ctype.h +17 -0
  52. data/modules/emscripten/system/include/compat/wchar.h +23 -0
  53. data/modules/emscripten/system/include/compat/wctype.h +23 -0
  54. data/modules/emscripten/system/include/emscripten/emmintrin.h +87 -0
  55. data/modules/emscripten/system/include/emscripten/emscripten.h +30 -4
  56. data/modules/emscripten/system/include/emscripten/vector.h +29 -1
  57. data/modules/emscripten/system/include/emscripten/xmmintrin.h +131 -0
  58. data/modules/emscripten/system/include/libcxx/CREDITS.TXT +9 -1
  59. data/modules/emscripten/system/include/libcxx/__bit_reference +8 -8
  60. data/modules/emscripten/system/include/libcxx/__config +95 -17
  61. data/modules/emscripten/system/include/libcxx/__debug +25 -4
  62. data/modules/emscripten/system/include/libcxx/__functional_03 +7 -7
  63. data/modules/emscripten/system/include/libcxx/__functional_base +169 -9
  64. data/modules/emscripten/system/include/libcxx/__functional_base_03 +1 -1
  65. data/modules/emscripten/system/include/libcxx/__hash_table +25 -25
  66. data/modules/emscripten/system/include/libcxx/__locale +21 -19
  67. data/modules/emscripten/system/include/libcxx/__mutex_base +2 -33
  68. data/modules/emscripten/system/include/libcxx/__split_buffer +9 -9
  69. data/modules/emscripten/system/include/libcxx/__std_stream +14 -0
  70. data/modules/emscripten/system/include/libcxx/__tree +35 -26
  71. data/modules/emscripten/system/include/libcxx/__tuple +15 -15
  72. data/modules/emscripten/system/include/libcxx/__tuple_03 +2 -2
  73. data/modules/emscripten/system/include/libcxx/__undef_min_max +8 -0
  74. data/modules/emscripten/system/include/libcxx/algorithm +121 -110
  75. data/modules/emscripten/system/include/libcxx/array +15 -15
  76. data/modules/emscripten/system/include/libcxx/bitset +4 -4
  77. data/modules/emscripten/system/include/libcxx/chrono +51 -17
  78. data/modules/emscripten/system/include/libcxx/cmath +25 -23
  79. data/modules/emscripten/system/include/libcxx/codecvt +21 -18
  80. data/modules/emscripten/system/include/libcxx/complex +48 -7
  81. data/modules/emscripten/system/include/libcxx/cstddef +1 -1
  82. data/modules/emscripten/system/include/libcxx/cstdio +8 -1
  83. data/modules/emscripten/system/include/libcxx/cstdlib +1 -1
  84. data/modules/emscripten/system/include/libcxx/cwchar +1 -1
  85. data/modules/emscripten/system/include/libcxx/deque +26 -12
  86. data/modules/emscripten/system/include/libcxx/dynarray +311 -0
  87. data/modules/emscripten/system/include/libcxx/exception +4 -4
  88. data/modules/emscripten/system/include/libcxx/ext/__hash +3 -3
  89. data/modules/emscripten/system/include/libcxx/ext/hash_map +19 -15
  90. data/modules/emscripten/system/include/libcxx/ext/hash_set +7 -3
  91. data/modules/emscripten/system/include/libcxx/forward_list +33 -7
  92. data/modules/emscripten/system/include/libcxx/fstream +4 -4
  93. data/modules/emscripten/system/include/libcxx/functional +200 -170
  94. data/modules/emscripten/system/include/libcxx/future +83 -39
  95. data/modules/emscripten/system/include/libcxx/initializer_list +24 -11
  96. data/modules/emscripten/system/include/libcxx/iomanip +147 -0
  97. data/modules/emscripten/system/include/libcxx/ios +24 -16
  98. data/modules/emscripten/system/include/libcxx/iosfwd +19 -19
  99. data/modules/emscripten/system/include/libcxx/istream +13 -8
  100. data/modules/emscripten/system/include/libcxx/iterator +108 -417
  101. data/modules/emscripten/system/include/libcxx/limits +8 -4
  102. data/modules/emscripten/system/include/libcxx/list +28 -8
  103. data/modules/emscripten/system/include/libcxx/locale +153 -390
  104. data/modules/emscripten/system/include/libcxx/map +280 -100
  105. data/modules/emscripten/system/include/libcxx/memory +49 -97
  106. data/modules/emscripten/system/include/libcxx/mutex +2 -2
  107. data/modules/emscripten/system/include/libcxx/new +43 -14
  108. data/modules/emscripten/system/include/libcxx/numeric +2 -2
  109. data/modules/emscripten/system/include/libcxx/optional +697 -0
  110. data/modules/emscripten/system/include/libcxx/ostream +17 -8
  111. data/modules/emscripten/system/include/libcxx/queue +5 -5
  112. data/modules/emscripten/system/include/libcxx/random +53 -51
  113. data/modules/emscripten/system/include/libcxx/ratio +11 -11
  114. data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
  115. data/modules/emscripten/system/include/libcxx/regex +23 -20
  116. data/modules/emscripten/system/include/libcxx/scoped_allocator +1 -1
  117. data/modules/emscripten/system/include/libcxx/set +166 -2
  118. data/modules/emscripten/system/include/libcxx/shared_mutex +419 -0
  119. data/modules/emscripten/system/include/libcxx/sstream +4 -4
  120. data/modules/emscripten/system/include/libcxx/stack +3 -3
  121. data/modules/emscripten/system/include/libcxx/streambuf +5 -5
  122. data/modules/emscripten/system/include/libcxx/string +372 -324
  123. data/modules/emscripten/system/include/libcxx/support/ibm/limits.h +99 -0
  124. data/modules/emscripten/system/include/libcxx/support/ibm/support.h +54 -0
  125. data/modules/emscripten/system/include/libcxx/support/ibm/xlocale.h +326 -0
  126. data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +6 -6
  127. data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -15
  128. data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +2 -0
  129. data/modules/emscripten/system/include/libcxx/support/win32/support.h +6 -1
  130. data/modules/emscripten/system/include/libcxx/system_error +14 -8
  131. data/modules/emscripten/system/include/libcxx/thread +7 -8
  132. data/modules/emscripten/system/include/libcxx/tuple +29 -88
  133. data/modules/emscripten/system/include/libcxx/type_traits +253 -209
  134. data/modules/emscripten/system/include/libcxx/typeindex +3 -3
  135. data/modules/emscripten/system/include/libcxx/unordered_map +162 -101
  136. data/modules/emscripten/system/include/libcxx/unordered_set +79 -2
  137. data/modules/emscripten/system/include/libcxx/utility +20 -20
  138. data/modules/emscripten/system/include/libcxx/valarray +23 -23
  139. data/modules/emscripten/system/include/libcxx/vector +114 -91
  140. data/modules/emscripten/system/lib/libc/musl/src/regex/regcomp.c +3352 -0
  141. data/modules/emscripten/system/lib/libc/musl/src/regex/regerror.c +35 -0
  142. data/modules/emscripten/system/lib/libc/musl/src/regex/regexec.c +1011 -0
  143. data/modules/emscripten/system/lib/libc/musl/src/regex/tre-mem.c +158 -0
  144. data/modules/emscripten/system/lib/libc/musl/src/regex/tre.h +231 -0
  145. data/modules/emscripten/system/lib/libcextra.symbols +7 -0
  146. data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +9 -1
  147. data/modules/emscripten/system/lib/libcxx/algorithm.cpp +1 -0
  148. data/modules/emscripten/system/lib/libcxx/debug.cpp +66 -42
  149. data/modules/emscripten/system/lib/libcxx/exception.cpp +88 -16
  150. data/modules/emscripten/system/lib/libcxx/future.cpp +6 -0
  151. data/modules/emscripten/system/lib/libcxx/ios.cpp +7 -2
  152. data/modules/emscripten/system/lib/libcxx/iostream.cpp +8 -8
  153. data/modules/emscripten/system/lib/libcxx/locale.cpp +38 -11
  154. data/modules/emscripten/system/lib/libcxx/mutex.cpp +3 -0
  155. data/modules/emscripten/system/lib/libcxx/new.cpp +44 -10
  156. data/modules/emscripten/system/lib/libcxx/optional.cpp +25 -0
  157. data/modules/emscripten/system/lib/libcxx/random.cpp +26 -0
  158. data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
  159. data/modules/emscripten/system/lib/libcxx/shared_mutex.cpp +101 -0
  160. data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +11 -7
  161. data/modules/emscripten/system/lib/libcxx/string.cpp +3 -1
  162. data/modules/emscripten/system/lib/libcxx/strstream.cpp +7 -7
  163. data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +12 -13
  164. data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +33 -36
  165. data/modules/emscripten/system/lib/libcxx/symbols +187 -168
  166. data/modules/emscripten/system/lib/libcxx/system_error.cpp +1 -0
  167. data/modules/emscripten/system/lib/libcxx/thread.cpp +7 -3
  168. data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +9 -6
  169. data/modules/emscripten/system/lib/libcxx/valarray.cpp +2 -0
  170. data/modules/emscripten/third_party/lzma.js/doit.bat +4 -0
  171. data/modules/emscripten/third_party/lzma.js/doit.sh +9 -2
  172. data/modules/emscripten/tools/cache.py +5 -7
  173. data/modules/emscripten/tools/cache.pyc +0 -0
  174. data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +7 -0
  175. data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +9 -1
  176. data/modules/emscripten/tools/eliminator/eliminator-test-output.js +3 -0
  177. data/modules/emscripten/tools/eliminator/eliminator-test.js +9 -1
  178. data/modules/emscripten/tools/file_packager.py +93 -50
  179. data/modules/emscripten/tools/js-optimizer.js +98 -48
  180. data/modules/emscripten/tools/js_optimizer.py +4 -4
  181. data/modules/emscripten/tools/js_optimizer.pyc +0 -0
  182. data/modules/emscripten/tools/jsrun.py +1 -1
  183. data/modules/emscripten/tools/jsrun.pyc +0 -0
  184. data/modules/emscripten/tools/response_file.py +6 -0
  185. data/modules/emscripten/tools/response_file.pyc +0 -0
  186. data/modules/emscripten/tools/settings_template_readonly.py +2 -0
  187. data/modules/emscripten/tools/shared.py +88 -34
  188. data/modules/emscripten/tools/shared.pyc +0 -0
  189. data/modules/emscripten/tools/split.py +21 -13
  190. data/modules/mruby/build_config.rb +7 -1
  191. data/modules/mruby/doc/compile/README.md +5 -9
  192. data/modules/mruby/include/mrbconf.h +5 -2
  193. data/modules/mruby/include/mruby/array.h +1 -0
  194. data/modules/mruby/include/mruby/compile.h +2 -4
  195. data/modules/mruby/include/mruby/dump.h +7 -16
  196. data/modules/mruby/include/mruby/hash.h +1 -1
  197. data/modules/mruby/include/mruby/irep.h +14 -2
  198. data/modules/mruby/include/mruby/khash.h +8 -7
  199. data/modules/mruby/include/mruby/string.h +1 -0
  200. data/modules/mruby/include/mruby/value.h +5 -2
  201. data/modules/mruby/include/mruby.h +12 -13
  202. data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +16 -6
  203. data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +18 -30
  204. data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +21 -0
  205. data/modules/mruby/mrbgems/mruby-math/src/math.c +1 -1
  206. data/modules/mruby/mrbgems/mruby-random/src/random.c +144 -47
  207. data/modules/mruby/mrbgems/mruby-random/test/random.rb +44 -0
  208. data/modules/mruby/mrbgems/mruby-struct/src/struct.c +5 -5
  209. data/modules/mruby/mrblib/numeric.rb +99 -33
  210. data/modules/mruby/src/array.c +11 -4
  211. data/modules/mruby/src/backtrace.c +2 -2
  212. data/modules/mruby/src/class.c +49 -30
  213. data/modules/mruby/src/codegen.c +131 -79
  214. data/modules/mruby/src/debug.c +1 -1
  215. data/modules/mruby/src/dump.c +213 -163
  216. data/modules/mruby/src/error.c +17 -17
  217. data/modules/mruby/src/error.h +1 -1
  218. data/modules/mruby/src/etc.c +10 -0
  219. data/modules/mruby/src/gc.c +35 -17
  220. data/modules/mruby/src/hash.c +5 -5
  221. data/modules/mruby/src/kernel.c +36 -14
  222. data/modules/mruby/src/load.c +238 -296
  223. data/modules/mruby/src/numeric.c +18 -98
  224. data/modules/mruby/src/object.c +3 -5
  225. data/modules/mruby/src/parse.y +63 -56
  226. data/modules/mruby/src/proc.c +8 -5
  227. data/modules/mruby/src/re.h +0 -1
  228. data/modules/mruby/src/state.c +65 -27
  229. data/modules/mruby/src/string.c +3 -31
  230. data/modules/mruby/src/symbol.c +3 -3
  231. data/modules/mruby/src/variable.c +12 -5
  232. data/modules/mruby/src/vm.c +90 -72
  233. data/modules/mruby/tasks/mruby_build.rake +10 -1
  234. data/modules/mruby/tasks/toolchains/gcc.rake +12 -2
  235. data/modules/mruby/tasks/toolchains/{vs2012.rake → visualcpp.rake} +1 -1
  236. data/modules/mruby/test/driver.c +3 -3
  237. data/modules/mruby/test/t/array.rb +5 -5
  238. data/modules/mruby/test/t/class.rb +14 -1
  239. data/modules/mruby/test/t/kernel.rb +4 -0
  240. data/modules/mruby/test/t/module.rb +4 -4
  241. data/modules/mruby/test/t/nameerror.rb +1 -1
  242. data/modules/mruby/tools/mrbc/mrbc.c +23 -17
  243. data/modules/mruby/travis_config.rb +10 -1
  244. metadata +28 -5
  245. data/modules/mruby/tasks/toolchains/vs2010.rake +0 -3
@@ -0,0 +1,419 @@
1
+ // -*- C++ -*-
2
+ //===------------------------ shared_mutex --------------------------------===//
3
+ //
4
+ // The LLVM Compiler Infrastructure
5
+ //
6
+ // This file is dual licensed under the MIT and the University of Illinois Open
7
+ // Source Licenses. See LICENSE.TXT for details.
8
+ //
9
+ //===----------------------------------------------------------------------===//
10
+
11
+ #ifndef _LIBCPP_SHARED_MUTEX
12
+ #define _LIBCPP_SHARED_MUTEX
13
+
14
+ /*
15
+ shared_mutex synopsis
16
+
17
+ // C++1y
18
+
19
+ namespace std
20
+ {
21
+
22
+ class shared_mutex
23
+ {
24
+ public:
25
+ shared_mutex();
26
+ ~shared_mutex();
27
+
28
+ shared_mutex(const shared_mutex&) = delete;
29
+ shared_mutex& operator=(const shared_mutex&) = delete;
30
+
31
+ // Exclusive ownership
32
+ void lock(); // blocking
33
+ bool try_lock();
34
+ template <class Rep, class Period>
35
+ bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
36
+ template <class Clock, class Duration>
37
+ bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
38
+ void unlock();
39
+
40
+ // Shared ownership
41
+ void lock_shared(); // blocking
42
+ bool try_lock_shared();
43
+ template <class Rep, class Period>
44
+ bool
45
+ try_lock_shared_for(const chrono::duration<Rep, Period>& rel_time);
46
+ template <class Clock, class Duration>
47
+ bool
48
+ try_lock_shared_until(const chrono::time_point<Clock, Duration>& abs_time);
49
+ void unlock_shared();
50
+ };
51
+
52
+ template <class Mutex>
53
+ class shared_lock
54
+ {
55
+ public:
56
+ typedef Mutex mutex_type;
57
+
58
+ // Shared locking
59
+ shared_lock() noexcept;
60
+ explicit shared_lock(mutex_type& m); // blocking
61
+ shared_lock(mutex_type& m, defer_lock_t) noexcept;
62
+ shared_lock(mutex_type& m, try_to_lock_t);
63
+ shared_lock(mutex_type& m, adopt_lock_t);
64
+ template <class Clock, class Duration>
65
+ shared_lock(mutex_type& m,
66
+ const chrono::time_point<Clock, Duration>& abs_time);
67
+ template <class Rep, class Period>
68
+ shared_lock(mutex_type& m,
69
+ const chrono::duration<Rep, Period>& rel_time);
70
+ ~shared_lock();
71
+
72
+ shared_lock(shared_lock const&) = delete;
73
+ shared_lock& operator=(shared_lock const&) = delete;
74
+
75
+ shared_lock(shared_lock&& u) noexcept;
76
+ shared_lock& operator=(shared_lock&& u) noexcept;
77
+
78
+ void lock(); // blocking
79
+ bool try_lock();
80
+ template <class Rep, class Period>
81
+ bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
82
+ template <class Clock, class Duration>
83
+ bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
84
+ void unlock();
85
+
86
+ // Setters
87
+ void swap(shared_lock& u) noexcept;
88
+ mutex_type* release() noexcept;
89
+
90
+ // Getters
91
+ bool owns_lock() const noexcept;
92
+ explicit operator bool () const noexcept;
93
+ mutex_type* mutex() const noexcept;
94
+ };
95
+
96
+ template <class Mutex>
97
+ void swap(shared_lock<Mutex>& x, shared_lock<Mutex>& y) noexcept;
98
+
99
+ } // std
100
+
101
+ */
102
+
103
+ #include <__config>
104
+
105
+ #if _LIBCPP_STD_VER > 11 || defined(_LIBCPP_BUILDING_SHARED_MUTEX)
106
+
107
+ #include <__mutex_base>
108
+
109
+ #include <__undef_min_max>
110
+
111
+ #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
112
+ #pragma GCC system_header
113
+ #endif
114
+
115
+ _LIBCPP_BEGIN_NAMESPACE_STD
116
+
117
+ class _LIBCPP_TYPE_VIS shared_mutex
118
+ {
119
+ mutex __mut_;
120
+ condition_variable __gate1_;
121
+ condition_variable __gate2_;
122
+ unsigned __state_;
123
+
124
+ static const unsigned __write_entered_ = 1U << (sizeof(unsigned)*__CHAR_BIT__ - 1);
125
+ static const unsigned __n_readers_ = ~__write_entered_;
126
+ public:
127
+ shared_mutex();
128
+ _LIBCPP_INLINE_VISIBILITY ~shared_mutex() = default;
129
+
130
+ shared_mutex(const shared_mutex&) = delete;
131
+ shared_mutex& operator=(const shared_mutex&) = delete;
132
+
133
+ // Exclusive ownership
134
+ void lock();
135
+ bool try_lock();
136
+ template <class _Rep, class _Period>
137
+ _LIBCPP_INLINE_VISIBILITY
138
+ bool
139
+ try_lock_for(const chrono::duration<_Rep, _Period>& __rel_time)
140
+ {
141
+ return try_lock_until(chrono::steady_clock::now() + __rel_time);
142
+ }
143
+ template <class _Clock, class _Duration>
144
+ bool
145
+ try_lock_until(const chrono::time_point<_Clock, _Duration>& __abs_time);
146
+ void unlock();
147
+
148
+ // Shared ownership
149
+ void lock_shared();
150
+ bool try_lock_shared();
151
+ template <class _Rep, class _Period>
152
+ _LIBCPP_INLINE_VISIBILITY
153
+ bool
154
+ try_lock_shared_for(const chrono::duration<_Rep, _Period>& __rel_time)
155
+ {
156
+ return try_lock_shared_until(chrono::steady_clock::now() + __rel_time);
157
+ }
158
+ template <class _Clock, class _Duration>
159
+ bool
160
+ try_lock_shared_until(const chrono::time_point<_Clock, _Duration>& __abs_time);
161
+ void unlock_shared();
162
+ };
163
+
164
+ template <class _Clock, class _Duration>
165
+ bool
166
+ shared_mutex::try_lock_until(
167
+ const chrono::time_point<_Clock, _Duration>& __abs_time)
168
+ {
169
+ unique_lock<mutex> __lk(__mut_);
170
+ if (__state_ & __write_entered_)
171
+ {
172
+ while (true)
173
+ {
174
+ cv_status __status = __gate1_.wait_until(__lk, __abs_time);
175
+ if ((__state_ & __write_entered_) == 0)
176
+ break;
177
+ if (__status == cv_status::timeout)
178
+ return false;
179
+ }
180
+ }
181
+ __state_ |= __write_entered_;
182
+ if (__state_ & __n_readers_)
183
+ {
184
+ while (true)
185
+ {
186
+ cv_status __status = __gate2_.wait_until(__lk, __abs_time);
187
+ if ((__state_ & __n_readers_) == 0)
188
+ break;
189
+ if (__status == cv_status::timeout)
190
+ {
191
+ __state_ &= ~__write_entered_;
192
+ return false;
193
+ }
194
+ }
195
+ }
196
+ return true;
197
+ }
198
+
199
+ template <class _Clock, class _Duration>
200
+ bool
201
+ shared_mutex::try_lock_shared_until(
202
+ const chrono::time_point<_Clock, _Duration>& __abs_time)
203
+ {
204
+ unique_lock<mutex> __lk(__mut_);
205
+ if ((__state_ & __write_entered_) || (__state_ & __n_readers_) == __n_readers_)
206
+ {
207
+ while (true)
208
+ {
209
+ cv_status status = __gate1_.wait_until(__lk, __abs_time);
210
+ if ((__state_ & __write_entered_) == 0 &&
211
+ (__state_ & __n_readers_) < __n_readers_)
212
+ break;
213
+ if (status == cv_status::timeout)
214
+ return false;
215
+ }
216
+ }
217
+ unsigned __num_readers = (__state_ & __n_readers_) + 1;
218
+ __state_ &= ~__n_readers_;
219
+ __state_ |= __num_readers;
220
+ return true;
221
+ }
222
+
223
+ template <class _Mutex>
224
+ class shared_lock
225
+ {
226
+ public:
227
+ typedef _Mutex mutex_type;
228
+
229
+ private:
230
+ mutex_type* __m_;
231
+ bool __owns_;
232
+
233
+ public:
234
+ _LIBCPP_INLINE_VISIBILITY
235
+ shared_lock() noexcept
236
+ : __m_(nullptr),
237
+ __owns_(false)
238
+ {}
239
+
240
+ _LIBCPP_INLINE_VISIBILITY
241
+ explicit shared_lock(mutex_type& __m)
242
+ : __m_(&__m),
243
+ __owns_(true)
244
+ {__m_->lock_shared();}
245
+
246
+ _LIBCPP_INLINE_VISIBILITY
247
+ shared_lock(mutex_type& __m, defer_lock_t) noexcept
248
+ : __m_(&__m),
249
+ __owns_(false)
250
+ {}
251
+
252
+ _LIBCPP_INLINE_VISIBILITY
253
+ shared_lock(mutex_type& __m, try_to_lock_t)
254
+ : __m_(&__m),
255
+ __owns_(__m.try_lock_shared())
256
+ {}
257
+
258
+ _LIBCPP_INLINE_VISIBILITY
259
+ shared_lock(mutex_type& __m, adopt_lock_t)
260
+ : __m_(&__m),
261
+ __owns_(true)
262
+ {}
263
+
264
+ template <class _Clock, class _Duration>
265
+ _LIBCPP_INLINE_VISIBILITY
266
+ shared_lock(mutex_type& __m,
267
+ const chrono::time_point<_Clock, _Duration>& __abs_time)
268
+ : __m_(&__m),
269
+ __owns_(__m.try_lock_shared_until(__abs_time))
270
+ {}
271
+
272
+ template <class _Rep, class _Period>
273
+ _LIBCPP_INLINE_VISIBILITY
274
+ shared_lock(mutex_type& __m,
275
+ const chrono::duration<_Rep, _Period>& __rel_time)
276
+ : __m_(&__m),
277
+ __owns_(__m.try_lock_shared_for(__rel_time))
278
+ {}
279
+
280
+ _LIBCPP_INLINE_VISIBILITY
281
+ ~shared_lock()
282
+ {
283
+ if (__owns_)
284
+ __m_->unlock_shared();
285
+ }
286
+
287
+ shared_lock(shared_lock const&) = delete;
288
+ shared_lock& operator=(shared_lock const&) = delete;
289
+
290
+ _LIBCPP_INLINE_VISIBILITY
291
+ shared_lock(shared_lock&& __u) noexcept
292
+ : __m_(__u.__m_),
293
+ __owns_(__u.__owns_)
294
+ {
295
+ __u.__m_ = nullptr;
296
+ __u.__owns_ = false;
297
+ }
298
+
299
+ _LIBCPP_INLINE_VISIBILITY
300
+ shared_lock& operator=(shared_lock&& __u) noexcept
301
+ {
302
+ if (__owns_)
303
+ __m_->unlock_shared();
304
+ __m_ = nullptr;
305
+ __owns_ = false;
306
+ __m_ = __u.__m_;
307
+ __owns_ = __u.__owns_;
308
+ __u.__m_ = nullptr;
309
+ __u.__owns_ = false;
310
+ return *this;
311
+ }
312
+
313
+ void lock();
314
+ bool try_lock();
315
+ template <class Rep, class Period>
316
+ bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
317
+ template <class Clock, class Duration>
318
+ bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
319
+ void unlock();
320
+
321
+ // Setters
322
+ _LIBCPP_INLINE_VISIBILITY
323
+ void swap(shared_lock& __u) noexcept
324
+ {
325
+ _VSTD::swap(__m_, __u.__m_);
326
+ _VSTD::swap(__owns_, __u.__owns_);
327
+ }
328
+
329
+ _LIBCPP_INLINE_VISIBILITY
330
+ mutex_type* release() noexcept
331
+ {
332
+ mutex_type* __m = __m_;
333
+ __m_ = nullptr;
334
+ __owns_ = false;
335
+ return __m;
336
+ }
337
+
338
+ // Getters
339
+ _LIBCPP_INLINE_VISIBILITY
340
+ bool owns_lock() const noexcept {return __owns_;}
341
+
342
+ _LIBCPP_INLINE_VISIBILITY
343
+ explicit operator bool () const noexcept {return __owns_;}
344
+
345
+ _LIBCPP_INLINE_VISIBILITY
346
+ mutex_type* mutex() const noexcept {return __m_;}
347
+ };
348
+
349
+ template <class _Mutex>
350
+ void
351
+ shared_lock<_Mutex>::lock()
352
+ {
353
+ if (__m_ == nullptr)
354
+ __throw_system_error(EPERM, "shared_lock::lock: references null mutex");
355
+ if (__owns_)
356
+ __throw_system_error(EDEADLK, "shared_lock::lock: already locked");
357
+ __m_->lock_shared();
358
+ __owns_ = true;
359
+ }
360
+
361
+ template <class _Mutex>
362
+ bool
363
+ shared_lock<_Mutex>::try_lock()
364
+ {
365
+ if (__m_ == nullptr)
366
+ __throw_system_error(EPERM, "shared_lock::try_lock: references null mutex");
367
+ if (__owns_)
368
+ __throw_system_error(EDEADLK, "shared_lock::try_lock: already locked");
369
+ __owns_ = __m_->try_lock_shared();
370
+ return __owns_;
371
+ }
372
+
373
+ template <class _Mutex>
374
+ template <class _Rep, class _Period>
375
+ bool
376
+ shared_lock<_Mutex>::try_lock_for(const chrono::duration<_Rep, _Period>& __d)
377
+ {
378
+ if (__m_ == nullptr)
379
+ __throw_system_error(EPERM, "shared_lock::try_lock_for: references null mutex");
380
+ if (__owns_)
381
+ __throw_system_error(EDEADLK, "shared_lock::try_lock_for: already locked");
382
+ __owns_ = __m_->try_lock_shared_for(__d);
383
+ return __owns_;
384
+ }
385
+
386
+ template <class _Mutex>
387
+ template <class _Clock, class _Duration>
388
+ bool
389
+ shared_lock<_Mutex>::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t)
390
+ {
391
+ if (__m_ == nullptr)
392
+ __throw_system_error(EPERM, "shared_lock::try_lock_until: references null mutex");
393
+ if (__owns_)
394
+ __throw_system_error(EDEADLK, "shared_lock::try_lock_until: already locked");
395
+ __owns_ = __m_->try_lock_shared_until(__t);
396
+ return __owns_;
397
+ }
398
+
399
+ template <class _Mutex>
400
+ void
401
+ shared_lock<_Mutex>::unlock()
402
+ {
403
+ if (!__owns_)
404
+ __throw_system_error(EPERM, "shared_lock::unlock: not locked");
405
+ __m_->unlock_shared();
406
+ __owns_ = false;
407
+ }
408
+
409
+ template <class _Mutex>
410
+ inline _LIBCPP_INLINE_VISIBILITY
411
+ void
412
+ swap(shared_lock<_Mutex>& __x, shared_lock<_Mutex>& __y) noexcept
413
+ {__x.swap(__y);}
414
+
415
+ _LIBCPP_END_NAMESPACE_STD
416
+
417
+ #endif // _LIBCPP_STD_VER > 11
418
+
419
+ #endif // _LIBCPP_SHARED_MUTEX
@@ -186,7 +186,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
186
186
  // basic_stringbuf
187
187
 
188
188
  template <class _CharT, class _Traits, class _Allocator>
189
- class _LIBCPP_TYPE_VIS basic_stringbuf
189
+ class _LIBCPP_TYPE_VIS_ONLY basic_stringbuf
190
190
  : public basic_streambuf<_CharT, _Traits>
191
191
  {
192
192
  public:
@@ -613,7 +613,7 @@ basic_stringbuf<_CharT, _Traits, _Allocator>::seekpos(pos_type __sp,
613
613
  // basic_istringstream
614
614
 
615
615
  template <class _CharT, class _Traits, class _Allocator>
616
- class _LIBCPP_TYPE_VIS basic_istringstream
616
+ class _LIBCPP_TYPE_VIS_ONLY basic_istringstream
617
617
  : public basic_istream<_CharT, _Traits>
618
618
  {
619
619
  public:
@@ -732,7 +732,7 @@ basic_istringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
732
732
  // basic_ostringstream
733
733
 
734
734
  template <class _CharT, class _Traits, class _Allocator>
735
- class _LIBCPP_TYPE_VIS basic_ostringstream
735
+ class _LIBCPP_TYPE_VIS_ONLY basic_ostringstream
736
736
  : public basic_ostream<_CharT, _Traits>
737
737
  {
738
738
  public:
@@ -851,7 +851,7 @@ basic_ostringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
851
851
  // basic_stringstream
852
852
 
853
853
  template <class _CharT, class _Traits, class _Allocator>
854
- class _LIBCPP_TYPE_VIS basic_stringstream
854
+ class _LIBCPP_TYPE_VIS_ONLY basic_stringstream
855
855
  : public basic_iostream<_CharT, _Traits>
856
856
  {
857
857
  public:
@@ -91,7 +91,7 @@ template <class T, class Container>
91
91
 
92
92
  _LIBCPP_BEGIN_NAMESPACE_STD
93
93
 
94
- template <class _Tp, class _Container> class _LIBCPP_TYPE_VIS stack;
94
+ template <class _Tp, class _Container> class _LIBCPP_TYPE_VIS_ONLY stack;
95
95
 
96
96
  template <class _Tp, class _Container>
97
97
  _LIBCPP_INLINE_VISIBILITY
@@ -104,7 +104,7 @@ bool
104
104
  operator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
105
105
 
106
106
  template <class _Tp, class _Container = deque<_Tp> >
107
- class _LIBCPP_TYPE_VIS stack
107
+ class _LIBCPP_TYPE_VIS_ONLY stack
108
108
  {
109
109
  public:
110
110
  typedef _Container container_type;
@@ -282,7 +282,7 @@ swap(stack<_Tp, _Container>& __x, stack<_Tp, _Container>& __y)
282
282
  }
283
283
 
284
284
  template <class _Tp, class _Container, class _Alloc>
285
- struct _LIBCPP_TYPE_VIS uses_allocator<stack<_Tp, _Container>, _Alloc>
285
+ struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<stack<_Tp, _Container>, _Alloc>
286
286
  : public uses_allocator<_Container, _Alloc>
287
287
  {
288
288
  };
@@ -119,7 +119,7 @@ protected:
119
119
  _LIBCPP_BEGIN_NAMESPACE_STD
120
120
 
121
121
  template <class _CharT, class _Traits>
122
- class _LIBCPP_TYPE_VIS basic_streambuf
122
+ class _LIBCPP_TYPE_VIS_ONLY basic_streambuf
123
123
  {
124
124
  public:
125
125
  // types:
@@ -553,11 +553,11 @@ basic_streambuf<_CharT, _Traits>::overflow(int_type)
553
553
  return traits_type::eof();
554
554
  }
555
555
 
556
- _LIBCPP_EXTERN_TEMPLATE(class basic_streambuf<char>)
557
- _LIBCPP_EXTERN_TEMPLATE(class basic_streambuf<wchar_t>)
556
+ _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_streambuf<char>)
557
+ _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_streambuf<wchar_t>)
558
558
 
559
- _LIBCPP_EXTERN_TEMPLATE(class basic_ios<char>)
560
- _LIBCPP_EXTERN_TEMPLATE(class basic_ios<wchar_t>)
559
+ _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ios<char>)
560
+ _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ios<wchar_t>)
561
561
 
562
562
  _LIBCPP_END_NAMESPACE_STD
563
563