webruby 0.2.2 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
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