4aab543b6cf160543b5ef6503c39970c5017eeba
[WebKit-https.git] / Source / WTF / ChangeLog
1 2016-11-05  Yusuke Suzuki  <utatane.tea@gmail.com>
2
3         [JSCOnly] RunLoopGeneric should adopt MonotonicTime / WallTime change
4         https://bugs.webkit.org/show_bug.cgi?id=164447
5
6         Reviewed by Csaba Osztrogon√°c.
7
8         Build fix for JSCOnly.
9
10         * wtf/generic/RunLoopGeneric.cpp:
11         (WTF::RunLoop::TimerBase::ScheduledTask::create):
12         (WTF::RunLoop::TimerBase::ScheduledTask::ScheduledTask):
13         (WTF::RunLoop::TimerBase::ScheduledTask::scheduledTimePoint):
14         (WTF::RunLoop::TimerBase::ScheduledTask::updateReadyTime):
15         (WTF::RunLoop::populateTasks):
16         (WTF::RunLoop::dispatchAfter):
17         (WTF::RunLoop::TimerBase::start):
18
19 2016-11-04  Filip Pizlo  <fpizlo@apple.com>
20
21         WTF::ParkingLot should stop using std::chrono because std::chrono::duration casts are prone to overflows
22         https://bugs.webkit.org/show_bug.cgi?id=152045
23
24         Reviewed by Andy Estes.
25         
26         We used to use 'double' for all time measurements. Sometimes it was milliseconds,
27         sometimes it was seconds. Sometimes we measured a span of time, sometimes we spoke of time
28         since some epoch. When we spoke of time since epoch, we either used a monotonic clock or
29         a wall clock. The type - always 'double' - never told us what kind of time we had, even
30         though there were roughly six of them (sec interval, ms interval, sec since epoch on wall,
31         ms since epoch on wall, sec since epoch monotonic, ms since epoch monotonic).
32         
33         At some point, we thought that it would be a good idea to replace these doubles with
34         std::chrono. But since replacing some things with std::chrono, we found it to be terribly
35         inconvenient:
36         
37         - Outrageous API. I never want to say std::chrono::milliseconds(blah). I never want to say
38           std::chrono::steady_clock::timepoint. The syntax for duration_cast is ugly, and ideally
39           duration_cast would not even be a thing.
40         
41         - No overflow protection. std::chrono uses integers by default and using anything else is
42           clumsy. But the integer math is done without regard for the rough edges of integer math,
43           so any cast between std::chrono types risks overflow. Any comparison risks overflow
44           because it may do conversions silently. We have even found bugs where some C++
45           implementations had more overflows than others, which ends up being a special kind of
46           hell. In many cases, the overflow also has nasal demons.
47         
48         It's an error to represent time using integers. It would have been excusable back when
49         floating point math was not guaranteed to be supported on all platforms, but that would
50         have been a long time ago. Time is a continuous, infinite concept and it's a perfect fit
51         for floating point:
52         
53         - Floating point preserves precision under multiplication in all but extreme cases, so
54           using floating point for time means that unit conversions are almost completely
55           lossless. This means that we don't have to think very hard about what units to use. In
56           this patch, we use seconds almost everywhere. We only convert at boundaries, like an API
57           boundary that wants something other than seconds.
58         
59         - Floating point makes it easy to reason about infinity, which is something that time code
60           wants to do a lot. Example: when would you like to timeout? Infinity please! This is the
61           most elegant way of having an API support both a timeout variant and a no-timeout
62           variant.
63
64         - Floating point does well-understood things when math goes wrong, and these things are
65           pretty well optimized to match what a mathematician would do when computing with real
66           numbers represented using scientific notation with a finite number of significant
67           digits. This means that time math under floating point looks like normal math. On the
68           other hand, std::chrono time math looks like garbage because you have to always check
69           for multiple possible UB corners whenever you touch large integers. Integers that
70           represent time are very likely to be large and you don't have to do much to overflow
71           them. At this time, based on the number of bugs we have already seen due to chrono
72           overflows, I am not certain that we even understand what are all of the corner cases
73           that we should even check for.
74         
75         This patch introduces a new set of timekeeping classes that are all based on double, and
76         all internally use seconds. These classes support algebraic typing. The classes are:
77         
78         - Seconds: this is for measuring a duration.
79         - WallTime: time since epoch according to a wall clock (aka real time clock).
80         - MonotonicTime: time since epoch according to a monotonic clock.
81         - ClockType: enum that says either Wall or Monotonic.
82         - TimeWithDynamicClockType: a tuple of double and ClockType, which represents either a
83           wall time or a monotonic time.
84         
85         All of these classes behave like C++ values and are cheap to copy around since they are
86         very nearly POD. This supports comprehensive conversions between the various time types.
87         Most of this is by way of algebra. Here are just some of the rules we recognize:
88         
89         WallTime = WallTime + Seconds
90         Seconds = WallTime - WallTime
91         MonotonicTime = MonotonicTime + Seconds
92         etc...
93         
94         We support negative, infinite, and NaN times because math.
95         
96         We support conversions between MonotonicTime and WallTime, like:
97         
98         WallTime wt = mt.approximateWallTime()
99         
100         This is called this "approximate" because the only way to do it is to get the current time
101         on both clocks and convert relative to that.
102         
103         Many of our APIs would be happy using whatever notion of time the user wanted to use. For
104         those APIs, which includes Condition and ParkingLot, we have TimeWithDynamicClockType. You
105         can automatically convert WallTime or MonotonicTime to TimeWithDynamicClockType. This
106         means that if you use a WallTime with Condition::waitUntil, then Condition's internal
107         logic for when it should wake up makes its decision based on the current WallTime - but if
108         you use MonotonicTime then waitUntil will make its decision based on current
109         MonotonicTime. This is a greater level of flexibility than chrono allowed, since chrono
110         did not have the concept of a dynamic clock type.
111         
112         This patch does not include conversions between std::chrono and these new time classes,
113         because past experience shows that we're quite bad at getting conversions between
114         std::chrono and anything else right. Also, I didn't need such conversion code because this
115         patch only converts code that transitively touches ParkingLot and Condition. It was easy
116         to get all of that code onto the new time classes.
117
118         * WTF.xcodeproj/project.pbxproj:
119         * wtf/AutomaticThread.cpp:
120         (WTF::AutomaticThread::start):
121         * wtf/CMakeLists.txt:
122         * wtf/ClockType.cpp: Added.
123         (WTF::printInternal):
124         * wtf/ClockType.h: Added.
125         * wtf/Condition.h:
126         (WTF::ConditionBase::waitUntil):
127         (WTF::ConditionBase::waitFor):
128         (WTF::ConditionBase::wait):
129         (WTF::ConditionBase::waitUntilWallClockSeconds): Deleted.
130         (WTF::ConditionBase::waitUntilMonotonicClockSeconds): Deleted.
131         (WTF::ConditionBase::waitForSeconds): Deleted.
132         (WTF::ConditionBase::waitForSecondsImpl): Deleted.
133         (WTF::ConditionBase::waitForImpl): Deleted.
134         (WTF::ConditionBase::absoluteFromRelative): Deleted.
135         * wtf/CrossThreadQueue.h:
136         (WTF::CrossThreadQueue<DataType>::waitForMessage):
137         * wtf/CurrentTime.cpp:
138         (WTF::sleep):
139         * wtf/MessageQueue.h:
140         (WTF::MessageQueue::infiniteTime): Deleted.
141         * wtf/MonotonicTime.cpp: Added.
142         (WTF::MonotonicTime::now):
143         (WTF::MonotonicTime::approximateWallTime):
144         (WTF::MonotonicTime::dump):
145         (WTF::MonotonicTime::sleep):
146         * wtf/MonotonicTime.h: Added.
147         (WTF::MonotonicTime::MonotonicTime):
148         (WTF::MonotonicTime::fromRawDouble):
149         (WTF::MonotonicTime::infinity):
150         (WTF::MonotonicTime::secondsSinceEpoch):
151         (WTF::MonotonicTime::approximateMonotonicTime):
152         (WTF::MonotonicTime::operator bool):
153         (WTF::MonotonicTime::operator+):
154         (WTF::MonotonicTime::operator-):
155         (WTF::MonotonicTime::operator+=):
156         (WTF::MonotonicTime::operator-=):
157         (WTF::MonotonicTime::operator==):
158         (WTF::MonotonicTime::operator!=):
159         (WTF::MonotonicTime::operator<):
160         (WTF::MonotonicTime::operator>):
161         (WTF::MonotonicTime::operator<=):
162         (WTF::MonotonicTime::operator>=):
163         * wtf/ParkingLot.cpp:
164         (WTF::ParkingLot::parkConditionallyImpl):
165         (WTF::ParkingLot::unparkOne):
166         (WTF::ParkingLot::unparkOneImpl):
167         (WTF::ParkingLot::unparkCount):
168         * wtf/ParkingLot.h:
169         (WTF::ParkingLot::parkConditionally):
170         (WTF::ParkingLot::compareAndPark):
171         * wtf/Seconds.cpp: Added.
172         (WTF::Seconds::operator+):
173         (WTF::Seconds::operator-):
174         (WTF::Seconds::dump):
175         (WTF::Seconds::sleep):
176         * wtf/Seconds.h: Added.
177         (WTF::Seconds::Seconds):
178         (WTF::Seconds::value):
179         (WTF::Seconds::seconds):
180         (WTF::Seconds::milliseconds):
181         (WTF::Seconds::microseconds):
182         (WTF::Seconds::nanoseconds):
183         (WTF::Seconds::fromMilliseconds):
184         (WTF::Seconds::fromMicroseconds):
185         (WTF::Seconds::fromNanoseconds):
186         (WTF::Seconds::infinity):
187         (WTF::Seconds::operator bool):
188         (WTF::Seconds::operator+):
189         (WTF::Seconds::operator-):
190         (WTF::Seconds::operator*):
191         (WTF::Seconds::operator/):
192         (WTF::Seconds::operator+=):
193         (WTF::Seconds::operator-=):
194         (WTF::Seconds::operator*=):
195         (WTF::Seconds::operator/=):
196         (WTF::Seconds::operator==):
197         (WTF::Seconds::operator!=):
198         (WTF::Seconds::operator<):
199         (WTF::Seconds::operator>):
200         (WTF::Seconds::operator<=):
201         (WTF::Seconds::operator>=):
202         * wtf/TimeWithDynamicClockType.cpp: Added.
203         (WTF::TimeWithDynamicClockType::now):
204         (WTF::TimeWithDynamicClockType::nowWithSameClock):
205         (WTF::TimeWithDynamicClockType::wallTime):
206         (WTF::TimeWithDynamicClockType::monotonicTime):
207         (WTF::TimeWithDynamicClockType::approximateWallTime):
208         (WTF::TimeWithDynamicClockType::approximateMonotonicTime):
209         (WTF::TimeWithDynamicClockType::operator-):
210         (WTF::TimeWithDynamicClockType::operator<):
211         (WTF::TimeWithDynamicClockType::operator>):
212         (WTF::TimeWithDynamicClockType::operator<=):
213         (WTF::TimeWithDynamicClockType::operator>=):
214         (WTF::TimeWithDynamicClockType::dump):
215         (WTF::TimeWithDynamicClockType::sleep):
216         * wtf/TimeWithDynamicClockType.h: Added.
217         (WTF::TimeWithDynamicClockType::TimeWithDynamicClockType):
218         (WTF::TimeWithDynamicClockType::fromRawDouble):
219         (WTF::TimeWithDynamicClockType::secondsSinceEpoch):
220         (WTF::TimeWithDynamicClockType::clockType):
221         (WTF::TimeWithDynamicClockType::withSameClockAndRawDouble):
222         (WTF::TimeWithDynamicClockType::operator bool):
223         (WTF::TimeWithDynamicClockType::operator+):
224         (WTF::TimeWithDynamicClockType::operator-):
225         (WTF::TimeWithDynamicClockType::operator+=):
226         (WTF::TimeWithDynamicClockType::operator-=):
227         (WTF::TimeWithDynamicClockType::operator==):
228         (WTF::TimeWithDynamicClockType::operator!=):
229         * wtf/WallTime.cpp: Added.
230         (WTF::WallTime::now):
231         (WTF::WallTime::approximateMonotonicTime):
232         (WTF::WallTime::dump):
233         (WTF::WallTime::sleep):
234         * wtf/WallTime.h: Added.
235         (WTF::WallTime::WallTime):
236         (WTF::WallTime::fromRawDouble):
237         (WTF::WallTime::infinity):
238         (WTF::WallTime::secondsSinceEpoch):
239         (WTF::WallTime::approximateWallTime):
240         (WTF::WallTime::operator bool):
241         (WTF::WallTime::operator+):
242         (WTF::WallTime::operator-):
243         (WTF::WallTime::operator+=):
244         (WTF::WallTime::operator-=):
245         (WTF::WallTime::operator==):
246         (WTF::WallTime::operator!=):
247         (WTF::WallTime::operator<):
248         (WTF::WallTime::operator>):
249         (WTF::WallTime::operator<=):
250         (WTF::WallTime::operator>=):
251         * wtf/threads/BinarySemaphore.cpp:
252         (WTF::BinarySemaphore::wait):
253         * wtf/threads/BinarySemaphore.h:
254
255 2016-11-03  Filip Pizlo  <fpizlo@apple.com>
256
257         DFG plays fast and loose with the shadow values of a Phi
258         https://bugs.webkit.org/show_bug.cgi?id=164309
259
260         Reviewed by Saam Barati.
261         
262         Made this API use size rather than maxIndex as its initialization parameter, because that's
263         less confusing.
264
265         * wtf/IndexSparseSet.h:
266         (WTF::IndexSparseSet<OverflowHandler>::IndexSparseSet):
267
268 2016-11-03  Commit Queue  <commit-queue@webkit.org>
269
270         Unreviewed, rolling out r208364.
271         https://bugs.webkit.org/show_bug.cgi?id=164402
272
273         broke the build (Requested by smfr on #webkit).
274
275         Reverted changeset:
276
277         "DFG plays fast and loose with the shadow values of a Phi"
278         https://bugs.webkit.org/show_bug.cgi?id=164309
279         http://trac.webkit.org/changeset/208364
280
281 2016-11-03  Filip Pizlo  <fpizlo@apple.com>
282
283         DFG plays fast and loose with the shadow values of a Phi
284         https://bugs.webkit.org/show_bug.cgi?id=164309
285
286         Reviewed by Saam Barati.
287         
288         Made this API use size rather than maxIndex as its initialization parameter, because that's
289         less confusing.
290
291         * wtf/IndexSparseSet.h:
292         (WTF::IndexSparseSet<OverflowHandler>::IndexSparseSet):
293
294 2016-11-03  Konstantin Tokarev  <annulen@yandex.ru>
295
296         Fixes to build JSCOnly on macOS
297         https://bugs.webkit.org/show_bug.cgi?id=164379
298
299         Reviewed by Michael Catanzaro.
300
301         * wtf/Platform.h: JSCOnly port should not provide any PLATFORM() macro
302
303 2016-11-03  Brady Eidson  <beidson@apple.com>
304
305         IndexedDB 2.0: Support binary keys.
306         <rdar://problem/28806927> and https://bugs.webkit.org/show_bug.cgi?id=164359
307
308         Reviewed by Alex Christensen.
309
310         * wtf/Hasher.h:
311         (WTF::StringHasher::hashMemory): Teach hashMemory() to handle buffers with odd lengths.
312
313 2016-11-02  Filip Pizlo  <fpizlo@apple.com>
314
315         The GC should be in a thread
316         https://bugs.webkit.org/show_bug.cgi?id=163562
317
318         Reviewed by Geoffrey Garen and Andreas Kling.
319         
320         This fixes some bugs and adds a few features.
321
322         * wtf/Atomics.h: The GC may do work on behalf of the JIT. If it does, the main thread needs to execute a cross-modifying code fence. This is cpuid on x86 and I believe it's isb on ARM. It would have been an isync on PPC and I think that isb is the ARM equivalent.
323         (WTF::arm_isb):
324         (WTF::crossModifyingCodeFence):
325         (WTF::x86_ortop):
326         (WTF::x86_cpuid):
327         * wtf/AutomaticThread.cpp: I accidentally had AutomaticThreadCondition inherit from ThreadSafeRefCounted<AutomaticThread> [sic]. This never crashed before because all of our prior AutomaticThreadConditions were immortal.
328         (WTF::AutomaticThread::AutomaticThread):
329         (WTF::AutomaticThread::~AutomaticThread):
330         (WTF::AutomaticThread::start):
331         * wtf/AutomaticThread.h:
332         * wtf/MainThread.cpp: Need to allow initializeGCThreads() to be called separately because it's now more than just a debugging thing.
333         (WTF::initializeGCThreads):
334
335 2016-11-02  Carlos Alberto Lopez Perez  <clopez@igalia.com>
336
337         Clean wrong comment about compositing on the UI process.
338         https://bugs.webkit.org/show_bug.cgi?id=164339
339
340         Reviewed by Michael Catanzaro.
341
342         * wtf/Platform.h: The comment about compositing on the UI process
343         was added on r109302 but was not removed properly when the Qt port
344         was removed from trunk.
345         USE_PROTECTION_SPACE_AUTH_CALLBACK has nothing to do with it.
346
347 2016-11-02  Alex Christensen  <achristensen@webkit.org>
348
349         Remove Battery Status API from the tree
350         https://bugs.webkit.org/show_bug.cgi?id=164213
351
352         Reviewed by Sam Weinig.
353
354         * wtf/FeatureDefines.h:
355
356 2016-11-02  Romain Bellessort  <romain.bellessort@crf.canon.fr>
357
358         [Readable Streams API] Enable creation of ReadableByteStreamController
359         https://bugs.webkit.org/show_bug.cgi?id=164014
360
361         Reviewed by Youenn Fablet.
362
363         Added flag for the byte stream part of Readable Streams API.
364
365         * wtf/FeatureDefines.h:
366
367 2016-11-02  Per Arne Vollan  <pvollan@apple.com>
368
369         [Win] Copy build results to AAS 'Program Files' folder.
370         https://bugs.webkit.org/show_bug.cgi?id=164273
371
372         Reviewed by Brent Fulgham.
373
374         The preferred location for the binaries is the AAS 'Program Files' folder.
375
376         * WTF.vcxproj/WTF.proj:
377
378 2016-10-29  Filip Pizlo  <fpizlo@apple.com>
379
380         JSC should support SharedArrayBuffer
381         https://bugs.webkit.org/show_bug.cgi?id=163986
382
383         Reviewed by Keith Miller.
384         
385         Adds some small things we need for SharedArrayBuffer.
386         
387         * wtf/Atomics.h:
388         (WTF::Atomic::compareExchangeWeakRelaxed):
389         (WTF::Atomic::exchangeAdd):
390         (WTF::Atomic::exchangeAnd):
391         (WTF::Atomic::exchangeOr):
392         (WTF::Atomic::exchangeSub):
393         (WTF::Atomic::exchangeXor):
394         (WTF::atomicLoad):
395         (WTF::atomicStore):
396         (WTF::atomicCompareExchangeWeak):
397         (WTF::atomicCompareExchangeWeakRelaxed):
398         (WTF::atomicCompareExchangeStrong):
399         (WTF::atomicExchangeAdd):
400         (WTF::atomicExchangeAnd):
401         (WTF::atomicExchangeOr):
402         (WTF::atomicExchangeSub):
403         (WTF::atomicExchangeXor):
404         (WTF::atomicExchange):
405         (WTF::Atomic::exchangeAndAdd): Deleted.
406         (WTF::weakCompareAndSwap): Deleted.
407         We need to be able to do atomics operations on naked pointers. We also need to be able to do
408         all of the things that std::atomic does. This adds those things and renames
409         weakCompareAndSwap to atomicCompareExchangeWeakRelaxed so that we're using consistent
410         terminology.
411         
412         * wtf/Bitmap.h:
413         (WTF::WordType>::concurrentTestAndSet): Renamed weakCompareAndSwap.
414         (WTF::WordType>::concurrentTestAndClear): Renamed weakCompareAndSwap.
415         * wtf/FastBitVector.h:
416         (WTF::FastBitVector::atomicSetAndCheck): Renamed weakCompareAndSwap.
417         * wtf/ParkingLot.cpp:
418         (WTF::ParkingLot::unparkOne):
419         (WTF::ParkingLot::unparkCount):
420         * wtf/ParkingLot.h:
421         Added unparkCount(), which lets you unpark some bounded number of threads and returns the
422         number of threads unparked. This is just a modest extension of unparkAll(). unparkAll() now
423         just calls unparkCount(ptr, UINT_MAX).
424
425 2016-10-30  Frederic Wang  <fwang@igalia.com>
426
427         Use HarfBuzz ot-math API to parse the OpenType MATH table
428         https://bugs.webkit.org/show_bug.cgi?id=162671
429
430         Reviewed by Michael Catanzaro.
431
432         * wtf/Platform.h: By default, do not enable internal OpenType MATH parsing on GTK.
433
434 2016-10-25  Mark Lam  <mark.lam@apple.com>
435
436         String.prototype.replace() should throw an OutOfMemoryError when using too much memory.
437         https://bugs.webkit.org/show_bug.cgi?id=163996
438         <rdar://problem/28263117>
439
440         Reviewed by Geoffrey Garen.
441
442         * wtf/Vector.h:
443         (WTF::minCapacity>::tryConstructAndAppend):
444         (WTF::minCapacity>::tryConstructAndAppendSlowCase):
445         - Added try versions of constructAndAppend() so that we can handle the failure
446           to allocate more gracefully.
447
448 2016-10-25  Konstantin Tokarev  <annulen@yandex.ru>
449
450         Non-specialized version of deleteObject should not have template argument
451         https://bugs.webkit.org/show_bug.cgi?id=163943
452
453         Reviewed by Anders Carlsson.
454
455         Fixes compilation of GDIObject.h with MinGW
456
457         * wtf/win/GDIObject.h:
458         (WTF::deleteObject):
459
460 2016-10-24  Per Arne Vollan  <pvollan@apple.com>
461
462         [Win] CMake build type is not set.
463         https://bugs.webkit.org/show_bug.cgi?id=163917
464
465         Reviewed by Alex Christensen.
466
467         The CMAKE_BUILD_TYPE variable should be set to Debug or Release.
468
469         * WTF.vcxproj/WTF.proj:
470
471 2016-10-23  Yusuke Suzuki  <utatane.tea@gmail.com>
472
473         [DOMJIT] Add a way for DOMJIT::Patchpoint to express effects
474         https://bugs.webkit.org/show_bug.cgi?id=163657
475
476         Reviewed by Saam Barati.
477
478         Simplify nonEmptyRangesOverlap.
479
480         * wtf/MathExtras.h:
481         (WTF::nonEmptyRangesOverlap):
482
483 2016-10-23  Chris Dumez  <cdumez@apple.com>
484
485         Another unreviewed attempt to fix the WatchOS / TvOS build after r207585.
486         <rdar://problem/28902292>
487
488         Disable USE_CFURLCONNECTION on newer WatchOS / TvOS.
489
490         * wtf/Platform.h:
491
492 2016-10-20  Keith Miller  <keith_miller@apple.com>
493
494         Add support for WASM calls
495         https://bugs.webkit.org/show_bug.cgi?id=161727
496
497         Reviewed by Filip Pizlo and Michael Saboff.
498
499         Added a new decodeUInt64. Also, added WTF::LEBDecoder namespace.
500
501         * wtf/LEBDecoder.h:
502         (WTF::LEBDecoder::decodeUInt):
503         (WTF::LEBDecoder::decodeUInt32):
504         (WTF::LEBDecoder::decodeUInt64):
505         (WTF::LEBDecoder::decodeInt32):
506         (decodeUInt32): Deleted.
507         (decodeInt32): Deleted.
508
509 2016-10-20  Filip Pizlo  <fpizlo@apple.com>
510
511         The tracking of the coarse-grain Heap state (allocating or not, collector or not, eden vs full) should respect the orthogonality between allocating and collecting
512         https://bugs.webkit.org/show_bug.cgi?id=163738
513
514         Reviewed by Geoffrey Garen.
515         
516         There will soon be different kinds of GC threads, and WTF's "are you a GC thread" thing
517         should know about this.
518
519         * wtf/MainThread.cpp:
520         (WTF::initializeGCThreads):
521         (WTF::registerGCThread):
522         (WTF::mayBeGCThread):
523         * wtf/MainThread.h:
524
525 2016-10-19  Sam Weinig  <sam@webkit.org>
526
527         Add convenience function that combines WTF::visit(...) with WTF::makeVisitor(...)
528         https://bugs.webkit.org/show_bug.cgi?id=163713
529
530         Reviewed by Dan Bernstein.
531
532         - Add WTF::switchOn which merges WTF::visit with WTF::makeVisitor in the following
533           way:
534                 WTF::visit(WTF::makeVisitor(...), variant)
535
536         * wtf/Variant.h:
537         (WTF::switchOn):
538
539 2016-10-19  Alex Christensen  <achristensen@webkit.org>
540
541         Revert r207151
542         https://bugs.webkit.org/show_bug.cgi?id=163675
543
544         Reviewed by Brent Fulgham.
545
546         * wtf/Platform.h:
547         * wtf/SchedulePair.h:
548         * wtf/SchedulePairMac.mm:
549
550 2016-10-19  Filip Pizlo  <fpizlo@apple.com>
551
552         REGRESSION (r207480): 3 Dromaeo tests failing
553         https://bugs.webkit.org/show_bug.cgi?id=163633
554
555         Reviewed by Mark Lam.
556         
557         It's a ParkingLot bug: if we timeout and get unparked at the same time, then the unparking
558         thread will clear our address eventually - but not immediately. This causes a nasty
559         assertion failure. The tricky thing is that when we detect this, we need to wait until that
560         unparking thread does the deed. Otherwise, they will still do it at some later time.
561         
562         Alternatively, we could use some kind of versioning to detect this - increment the version
563         when you park, so that unparking threads will know if they are time travelers. That seems
564         more yucky.
565         
566         I don't think it matters too much what we do here, so long as it's simple and correct, since
567         this requires a race that is rare enough that it didn't happen once in my testing, and I was
568         pretty thorough. For example, it didn't happen once in 15 runs of JetStream. The race is
569         rare because it requires the timeout to happen right as someone else is unparking. Since
570         it's so rare, its probably OK that the unparked thread waits just a tiny moment until the
571         unparking thread is done.
572
573         * wtf/ParkingLot.cpp:
574         (WTF::ParkingLot::parkConditionallyImpl):
575         (WTF::ParkingLot::unparkOneImpl):
576
577 2016-10-19  Filip Pizlo  <fpizlo@apple.com>
578
579         Baseline JIT should use AutomaticThread
580         https://bugs.webkit.org/show_bug.cgi?id=163686
581
582         Reviewed by Geoffrey Garen.
583         
584         Added a AutomaticThreadCondition::wait() method, so that if you really want to use one
585         common condition for your thread and something else, you can do it. This trivially works
586         if you only use notifyAll(), and behaves as you'd expect for notifyOne() (i.e. it's
587         dangerous, since you don't know who will wake up).
588         
589         The Baseline JIT used the one-true-Condition idiom because it used notifyAll() in an
590         optimal way: there are just two threads talking to each other, so it wakes up at most one
591         thread and that thread is exactly the one you want woken up. Adding wait() means that I did
592         not have to change that code.
593
594         * wtf/AutomaticThread.cpp:
595         (WTF::AutomaticThreadCondition::wait):
596         * wtf/AutomaticThread.h:
597
598 2016-10-18  Filip Pizlo  <fpizlo@apple.com>
599
600         DFG worklist should use AutomaticThread
601         https://bugs.webkit.org/show_bug.cgi?id=163615
602
603         Reviewed by Mark Lam.
604         
605         This adds new functionality to AutomaticThread to support DFG::Worklist:
606         
607         - AutomaticThread::threadDidStart/threadWillStop virtual methods called at the start and end
608           of a thread's lifetime. This allows Worklist to tie some resources to the life of the
609           thread, and also means that now those resources will naturally free up when the Worklist is
610           not in use.
611         
612         - AutomaticThreadCondition::notifyOne(). This required changes to Condition::notifyOne(). We
613           need to know if the Condition woke up anyone. If it didn't, then we need to launch one of
614           our threads.
615
616         * wtf/AutomaticThread.cpp:
617         (WTF::AutomaticThreadCondition::notifyOne):
618         (WTF::AutomaticThread::ThreadScope::ThreadScope):
619         (WTF::AutomaticThread::ThreadScope::~ThreadScope):
620         (WTF::AutomaticThread::start):
621         (WTF::AutomaticThread::threadDidStart):
622         (WTF::AutomaticThread::threadWillStop):
623         * wtf/AutomaticThread.h:
624         * wtf/Condition.h:
625         (WTF::ConditionBase::notifyOne):
626
627 2016-10-18  Sam Weinig  <sam@webkit.org>
628
629         Replace std::experimental::variant with WTF::Variant (or similar)
630         https://bugs.webkit.org/show_bug.cgi?id=163626
631
632         Reviewed by Chris Dumez.
633
634         Rename std::experimental::variant, Variant. Move helpers get/holds_alternative/etc.
635         into the WTF namespace.
636
637         * wtf/Forward.h:
638         * wtf/Variant.h:
639
640 2016-10-18  Filip Pizlo  <fpizlo@apple.com>
641
642         WTF should make it easier to create threads that die automatically after inactivity
643         https://bugs.webkit.org/show_bug.cgi?id=163576
644
645         Reviewed by Andreas Kling.
646         
647         For a long time now, I've been adding threads to WTF/JSC and each time I do this, I feel
648         guilty because those threads don't shut down when they are inactive. For example, in bug
649         163562, I need to add a new GC thread. There will be one of them per VM. This means that a
650         JSC API client that starts a lot of VMs will have a lot of threads. I don't think that's
651         good.
652         
653         A common pattern for all of these threads is that they have some well-defined trigger that
654         causes them to run. This trigger has a lock, a condition variable, some logic that determines
655         if there is work to do, and then of course the logic for the thread's actual work. The thread
656         bodies usually look like this:
657         
658         void Thingy::runThread()
659         {
660             for (;;) {
661                 Work work;
662                 {
663                     LockHolder locker(m_lock);
664                     while (!hasWork())
665                         m_cond.wait(m_lock);
666                     work = takeWork();
667                 }
668                 doWork(work);
669             }
670         }
671         
672         If you look at ParallelHelperPool (the GC's threads) and DFG::Worklist (some of the JIT's
673         threads), you will see this pattern.
674         
675         This change adds a new kind of thread, called AutomaticThread, that lets you write threads to
676         this pattern while getting automatic thread shutdown for free: instead of just waiting on a
677         condition variable, AutomaticThread will have a timeout that causes the thread to die. The
678         condition variable associated with AutomaticThread, called AutomaticThreadCondition, is smart
679         enough to restart any threads that have decided to stop due to inactivity. The inactivity
680         threshold is current just 1 second.
681         
682         In this patch I only adopt AutomaticThread for ParallelHelperPool. I plan to adopt it in more
683         places soon.
684
685         * WTF.xcodeproj/project.pbxproj:
686         * wtf/AutomaticThread.cpp: Added.
687         (WTF::AutomaticThreadCondition::create):
688         (WTF::AutomaticThreadCondition::AutomaticThreadCondition):
689         (WTF::AutomaticThreadCondition::~AutomaticThreadCondition):
690         (WTF::AutomaticThreadCondition::notifyAll):
691         (WTF::AutomaticThreadCondition::add):
692         (WTF::AutomaticThreadCondition::remove):
693         (WTF::AutomaticThreadCondition::contains):
694         (WTF::AutomaticThread::AutomaticThread):
695         (WTF::AutomaticThread::~AutomaticThread):
696         (WTF::AutomaticThread::join):
697         (WTF::AutomaticThread::start):
698         * wtf/AutomaticThread.h: Added.
699         * wtf/CMakeLists.txt:
700         * wtf/ParallelHelperPool.cpp:
701         (WTF::ParallelHelperClient::ParallelHelperClient):
702         (WTF::ParallelHelperClient::~ParallelHelperClient):
703         (WTF::ParallelHelperClient::setTask):
704         (WTF::ParallelHelperClient::finish):
705         (WTF::ParallelHelperClient::doSomeHelping):
706         (WTF::ParallelHelperClient::runTask):
707         (WTF::ParallelHelperPool::ParallelHelperPool):
708         (WTF::ParallelHelperPool::~ParallelHelperPool):
709         (WTF::ParallelHelperPool::ensureThreads):
710         (WTF::ParallelHelperPool::doSomeHelping):
711         (WTF::ParallelHelperPool::Thread::Thread):
712         (WTF::ParallelHelperPool::didMakeWorkAvailable):
713         (WTF::ParallelHelperPool::helperThreadBody): Deleted.
714         (WTF::ParallelHelperPool::waitForClientWithTask): Deleted.
715         * wtf/ParallelHelperPool.h:
716
717 2016-10-18  Said Abou-Hallawa  <sabouhallawa@apple.com>
718
719         SVGCSSParser: m_implicitShorthand value is not reset after adding the shorthand property
720         https://bugs.webkit.org/show_bug.cgi?id=116470
721
722         Reviewed by Simon Fraser.
723
724         * wtf/TemporaryChange.h:
725         (WTF::TemporaryChange::TemporaryChange):
726         Add a new constructor to make TemporaryChange work as a restorer. The
727         temporary change will happen after we construct the object.
728
729 2016-10-17  Simon Fraser  <simon.fraser@apple.com>
730
731         Implement DOMRect/DOMRectReadOnly
732         https://bugs.webkit.org/show_bug.cgi?id=163464
733
734         Reviewed by Darin Adler.
735         
736         Implement min()/max() in a way that follows Math.min/Math.max, which return
737         NaN if either argument is NaN.
738
739         * wtf/MathExtras.h:
740         (WTF::nanPropagatingMin):
741         (WTF::nanPropagatingMax):
742
743 2016-10-15  Sam Weinig  <sam@webkit.org>
744
745         MessageEvent's source property should be a (DOMWindow or MessagePort)? rather than a EventTarget?
746         https://bugs.webkit.org/show_bug.cgi?id=163475
747
748         Reviewed by Simon Fraser.
749
750         * wtf/Variant.h:
751         Add missing return statement that was tripping up some compilers.
752
753 2016-10-12  Ryan Haddad  <ryanhaddad@apple.com>
754
755         Unreviewed, rolling out r207225.
756
757         This change causes debug tests to exit early with crashes.
758
759         Reverted changeset:
760
761         "Optional's move-constructor and move-assignment operator
762         don't disengage the value being moved from"
763         https://bugs.webkit.org/show_bug.cgi?id=163309
764         http://trac.webkit.org/changeset/207225
765
766 2016-10-11  Sam Weinig  <sam@webkit.org>
767
768         Optional's move-constructor and move-assignment operator don't disengage the value being moved from
769         https://bugs.webkit.org/show_bug.cgi?id=163309
770
771         Reviewed by Anders Carlsson.
772
773         * wtf/Optional.h:
774         (WTF::Optional::Optional):
775         (WTF::Optional::operator=):
776         Disengage 'other' on move-construction and move-assignment.
777
778 2016-10-08  Filip Pizlo  <fpizlo@apple.com>
779
780         MarkedBlock should know what objects are live during marking
781         https://bugs.webkit.org/show_bug.cgi?id=162309
782
783         Reviewed by Geoffrey Garen.
784         
785         This removes the atomicity mode, because it's not really used: it only affects the
786         concurrentBlah methods, but their only users turn on atomicity. This was useful because
787         previously, some binary Bitmap methods (like merge(const Bitmap&)) couldn't be used
788         effectively in the GC because some of the GC's bitmaps set the atomic mode and some didn't.
789         Removing this useless mode is the best solution.
790         
791         Also added some new binary Bitmap methods: mergeAndClear(Bitmap& other) and
792         setAndClear(Bitmap& other). They perform their action on 'this' (either merge or set,
793         respectively) while also clearing the contents of 'other'. This is great for one of the GC
794         hot paths.
795
796         * wtf/Bitmap.h:
797         (WTF::WordType>::Bitmap):
798         (WTF::WordType>::get):
799         (WTF::WordType>::set):
800         (WTF::WordType>::testAndSet):
801         (WTF::WordType>::testAndClear):
802         (WTF::WordType>::concurrentTestAndSet):
803         (WTF::WordType>::concurrentTestAndClear):
804         (WTF::WordType>::clear):
805         (WTF::WordType>::clearAll):
806         (WTF::WordType>::nextPossiblyUnset):
807         (WTF::WordType>::findRunOfZeros):
808         (WTF::WordType>::count):
809         (WTF::WordType>::isEmpty):
810         (WTF::WordType>::isFull):
811         (WTF::WordType>::merge):
812         (WTF::WordType>::filter):
813         (WTF::WordType>::exclude):
814         (WTF::WordType>::forEachSetBit):
815         (WTF::WordType>::mergeAndClear):
816         (WTF::WordType>::setAndClear):
817         (WTF::=):
818         (WTF::WordType>::hash):
819
820 2016-10-11  Said Abou-Hallawa  <sabouhallawa@apple.com>
821
822         Add SynchronizedFixedQueue class
823         https://bugs.webkit.org/show_bug.cgi?id=162478
824
825         Reviewed by Geoffrey Garen.
826
827         This class represents a simple producer/consumer worker. It facilitates
828         synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses
829         a single lock and a single condition to synchronize all its members among
830         the working threads. This means a single thread is active at any time and
831         and the other threads are blocked waiting for the lock to be released. Or
832         they are sleeping waiting for the condition to be satisfied.
833
834         * WTF.xcodeproj/project.pbxproj:
835         * wtf/SynchronizedFixedQueue.h: Added.
836         (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue):
837         (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state.
838         (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state.
839         (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items?
840         (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue.
841         (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue.
842
843 2016-10-11  Alex Christensen  <achristensen@webkit.org>
844
845         Remove dead networking code
846         https://bugs.webkit.org/show_bug.cgi?id=163263
847
848         Reviewed by Daniel Bates.
849
850         * wtf/Platform.h:
851         * wtf/SchedulePair.h:
852         * wtf/SchedulePairMac.mm:
853
854 2016-10-10  Zan Dobersek  <zdobersek@igalia.com>
855
856         Add ENABLE_ENCRYPTED_MEDIA configuration option
857         https://bugs.webkit.org/show_bug.cgi?id=163219
858
859         Reviewed by Darin Adler.
860
861         * wtf/FeatureDefines.h:
862         If undefined, define the ENABLE_ENCRYPTED_MEDIA option to 0.
863
864 2016-10-10  Yusuke Suzuki  <utatane.tea@gmail.com>
865
866         [DOMJIT] Implement Node accessors in DOMJIT
867         https://bugs.webkit.org/show_bug.cgi?id=163005
868
869         Reviewed by Filip Pizlo.
870
871         Add CAST_OFFSET. It is not necessary for JSCell thingy
872         since we don't use virtual member functions. However, it
873         is not true for WebCore DOM wrapped objects.
874
875         * wtf/StdLibExtras.h:
876
877 2016-10-07  Chris Dumez  <cdumez@apple.com>
878
879         window.navigator.language incorrectly returns all lowercase string
880         https://bugs.webkit.org/show_bug.cgi?id=163096
881
882         Reviewed by Darin Adler.
883
884         Update platformUserPreferredLanguages() so that it no longer lowercases
885         the string it returns. On Mac, we rely on CFLocale which returns
886         BCP-47 language tags as per:
887         - https://developer.apple.com/reference/corefoundation/1666963-cflocale?language=objc
888
889         * wtf/PlatformUserPreferredLanguagesMac.mm:
890         (WTF::httpStyleLanguageCode):
891         * wtf/PlatformUserPreferredLanguagesUnix.cpp:
892         (WTF::platformLanguage):
893
894 2016-10-06  Brent Fulgham  <bfulgham@apple.com>
895
896         [Win][Direct2D] Add Direct2D CMake rules
897         https://bugs.webkit.org/show_bug.cgi?id=162925
898
899         Reviewed by Brent Fulgham.
900
901         * wtf/Platform.h: Don't USE(CA) or USE(CG) if building
902         with Direct2D.
903
904 2016-10-05  Yusuke Suzuki  <utatane.tea@gmail.com>
905
906         [DOMJIT] Add initial CheckDOM and CallDOM implementations
907         https://bugs.webkit.org/show_bug.cgi?id=162941
908
909         Reviewed by Filip Pizlo.
910
911         * wtf/Box.h:
912         (WTF::Box::Box):
913
914 2016-10-05  Zan Dobersek  <zdobersek@igalia.com>
915
916         Rename ENABLE_ENCRYPTED_MEDIA_V2 to ENABLE_LEGACY_ENCRYPTED_MEDIA
917         https://bugs.webkit.org/show_bug.cgi?id=162903
918
919         Reviewed by Alex Christensen.
920
921         Rename build guards for the remaining implementation of the legacy EME API
922         to ENABLE_LEGACY_ENCRYPTED_MEDIA. This will allow for the future implementation
923         of the near-finished API to be guarded with the simple ENABLE_ENCRYPTED_MEDIA guards.
924
925         * wtf/FeatureDefines.h:
926
927 2016-10-04  Saam Barati  <sbarati@apple.com>
928
929         String.prototype.toLowerCase should be a DFG/FTL intrinsic
930         https://bugs.webkit.org/show_bug.cgi?id=162887
931
932         Reviewed by Filip Pizlo and Yusuke Suzuki.
933
934         This patch exposes a new StringImpl function called convertToLowercaseWithoutLocaleStartingAtFailingIndex8Bit
935         which extracts slow path for the 8-bit part of convertToLowercaseWithoutLocale
936         into a helper function. I decided to extract this into its own function because
937         it may be the case that JSCs JITs will want to continue the operation
938         after it has already ensured that part of an 8-bit string is lower case.
939
940         * wtf/text/StringImpl.cpp:
941         (WTF::StringImpl::convertToLowercaseWithoutLocale):
942         (WTF::StringImpl::convertToLowercaseWithoutLocaleStartingAtFailingIndex8Bit):
943         * wtf/text/StringImpl.h:
944         * wtf/text/WTFString.cpp:
945         (WTF::String::convertToLowercaseWithoutLocaleStartingAtFailingIndex8Bit):
946         * wtf/text/WTFString.h:
947
948 2016-10-04  Chris Dumez  <cdumez@apple.com>
949
950         Implement KeyboardEvent.code from the UI Event spec
951         https://bugs.webkit.org/show_bug.cgi?id=149584
952
953         Reviewed by Darin Adler.
954
955         Add build time flag to toggle support for the code attribute on
956         KeyboardEvent and only enable it on Mac for now, given that the
957         implementation is missing on other platforms.
958
959         * wtf/FeatureDefines.h:
960
961 2016-10-03  Chris Dumez  <cdumez@apple.com>
962
963         Add support for KeyboardEvent.key attribute
964         https://bugs.webkit.org/show_bug.cgi?id=36267
965
966         Reviewed by Darin Adler.
967
968         Add compile time flag for the key attribute on KeyboardEvent and enable
969         it on Cocoa only.
970
971         * wtf/FeatureDefines.h:
972
973 2016-09-29  Sam Weinig  <sam@webkit.org>
974
975         Add initial support for IDL union conversion
976         https://bugs.webkit.org/show_bug.cgi?id=161576
977
978         Reviewed by Chris Dumez.
979
980         * WTF.xcodeproj/project.pbxproj:
981         * wtf/CMakeLists.txt:
982         Add Brigand.h
983
984         * wtf/Brigand.h: Added.
985         Import a standalone copy of Edouard Alligand and Joel Falcou's 
986         Brigand library for help with for help with list based meta programming
987
988         * wtf/StdLibExtras.h:
989         Add a new three new type traits, IsTemplate, IsBaseOfTemplate and RemoveCVAndReference.
990         - IsTemplate acts like std::is_class, but works with a generic base.
991         - IsBaseOfTemplate acts like std::is_base_of, but works with a generic base.
992         - RemoveCVAndReference combines std::remove_cv and std::remove_reference.
993
994 2016-09-30  Filip Pizlo  <fpizlo@apple.com>
995
996         B3::moveConstants should be able to edit code to minimize the number of constants
997         https://bugs.webkit.org/show_bug.cgi?id=162764
998
999         Reviewed by Saam Barati.
1000         
1001         I thought it would be a good idea to document the fact that dominator traversal happens in a
1002         particular order for a reason.
1003
1004         * wtf/Dominators.h:
1005
1006 2016-09-29  Filip Pizlo  <fpizlo@apple.com>
1007
1008         Air should have a way of expressing additional instruction flags
1009         https://bugs.webkit.org/show_bug.cgi?id=162699
1010
1011         Reviewed by Mark Lam.
1012
1013         * wtf/CommaPrinter.h:
1014         (WTF::CommaPrinter::CommaPrinter):
1015         (WTF::CommaPrinter::dump):
1016         (WTF::CommaPrinter::didPrint):
1017
1018 2016-09-30  Youenn Fablet  <youenn@apple.com>
1019
1020         Add a way to go from a RefPtr<T> to Ref<const T>
1021         https://bugs.webkit.org/show_bug.cgi?id=162683
1022
1023         Reviewed by Alex Christensen.
1024
1025         * wtf/RefPtr.h:
1026         (WTF::RefPtr::releaseConstNonNull): Added.
1027
1028 2016-09-29  Mark Lam  <mark.lam@apple.com>
1029
1030         Re-enable StringView life-cycle checking.
1031         https://bugs.webkit.org/show_bug.cgi?id=160384
1032         <rdar://problem/28479434>
1033
1034         Reviewed by Saam Barati.
1035
1036         Re-landing after slow running tests have been resolved.
1037
1038         * wtf/text/StringView.h:
1039
1040 2016-09-29  Commit Queue  <commit-queue@webkit.org>
1041
1042         Unreviewed, rolling out r206563.
1043         https://bugs.webkit.org/show_bug.cgi?id=162732
1044
1045         Caused stress/op_*.js.ftl-no-cjit tests to time out (Requested
1046         by ryanhaddad on #webkit).
1047
1048         Reverted changeset:
1049
1050         "Re-enable StringView life-cycle checking."
1051         https://bugs.webkit.org/show_bug.cgi?id=160384
1052         http://trac.webkit.org/changeset/206563
1053
1054 2016-09-29  Fujii Hironori  <Hironori.Fujii@sony.com>
1055
1056         Clang 3.9 reports a compilation warning about ENABLE_EXCEPTION_SCOPE_VERIFICATION
1057         https://bugs.webkit.org/show_bug.cgi?id=162718
1058
1059         Reviewed by Alex Christensen.
1060
1061         Clang 3.9 reports a following compilation warning:
1062           Source/JavaScriptCore/runtime/VM.h:656:5: warning: macro expansion producing 'defined' has undefined behavior [-Wexpansion-to-defined]
1063
1064         * wtf/Platform.h: Changed the definition of ENABLE_EXCEPTION_SCOPE_VERIFICATION not to use 'defined'.
1065
1066 2016-09-28  Mark Lam  <mark.lam@apple.com>
1067
1068         Re-enable StringView life-cycle checking.
1069         https://bugs.webkit.org/show_bug.cgi?id=160384
1070         <rdar://problem/28479434>
1071
1072         Reviewed by Saam Barati.
1073
1074         * wtf/text/StringView.h:
1075
1076 2016-09-28  Filip Pizlo  <fpizlo@apple.com>
1077
1078         The write barrier should be down with TSO
1079         https://bugs.webkit.org/show_bug.cgi?id=162316
1080
1081         Reviewed by Geoffrey Garen.
1082         
1083         Added clearRange(), which quickly clears a range of bits. This turned out to be useful for
1084         a DFG optimization pass.
1085
1086         * wtf/FastBitVector.cpp:
1087         (WTF::FastBitVector::clearRange):
1088         * wtf/FastBitVector.h:
1089
1090 2016-09-28  Mark Lam  <mark.lam@apple.com>
1091
1092         Fix race condition in StringView's UnderlyingString lifecycle management.
1093         https://bugs.webkit.org/show_bug.cgi?id=162702
1094
1095         Reviewed by Geoffrey Garen.
1096
1097         There 2 relevant functions at play:
1098
1099         void StringView::setUnderlyingString(const StringImpl* string)
1100         {
1101             UnderlyingString* underlyingString;
1102             if (!string)
1103                 underlyingString = nullptr;
1104             else {
1105                 std::lock_guard<StaticLock> lock(underlyingStringsMutex);
1106                 auto result = underlyingStrings().add(string, nullptr);
1107                 if (result.isNewEntry)
1108                     result.iterator->value = new UnderlyingString(*string);
1109                 else
1110                     ++result.iterator->value->refCount;
1111                 underlyingString = result.iterator->value; // Point P2.
1112             }
1113             adoptUnderlyingString(underlyingString); // Point P5.
1114         }
1115
1116         ... and ...
1117
1118         void StringView::adoptUnderlyingString(UnderlyingString* underlyingString)
1119         {
1120             if (m_underlyingString) {
1121                 // Point P0.
1122                 if (!--m_underlyingString->refCount) {
1123                     if (m_underlyingString->isValid) { // Point P1.
1124                         std::lock_guard<StaticLock> lock(underlyingStringsMutex);
1125                         underlyingStrings().remove(&m_underlyingString->string); // Point P3.
1126                     }
1127                     delete m_underlyingString; // Point P4.
1128                 }
1129             }
1130             m_underlyingString = underlyingString;
1131         }
1132
1133         Imagine the following scenario:
1134
1135         1. Thread T1 has been using an UnderlyingString U1, and is now done with it.
1136            T1 runs up to point P1 in adoptUnderlyingString(), and is blocked waiting for
1137            the underlyingStringsMutex (which is currently being held by Thread T2).
1138         2. Context switch to Thread T2.
1139            T2 wants to use UnderlyingString U1, and runs up to point P2 in setUnderlyingString()
1140            and releases the underlyingStringsMutex.
1141            Note: T2 thinks it has successfully refCounted U1, and therefore U1 is safe to use.
1142         3. Context switch to Thread T1.
1143            T1 acquires the underlyingStringsMutex, and proceeds to remove it from the
1144            underlyingStrings() map (see Point P3).  It thinks it has successfully done so
1145            and proceeds to delete U1 (see Point P4).
1146         4. Context switch to Thread T2.
1147            T2 proceeds to use U1 (see Point P5 in setUnderlyingString()).
1148            Note: U1 has already been freed.  This is a use after free.
1149
1150         The fix is to acquire the underlyingStringsMutex at Point P0 in adoptUnderlyingString()
1151         instead of after P1.  This ensures that the decrementing of the UnderlyingString
1152         refCount and its removal from the underlyingStrings() map is done as an atomic unit.
1153
1154         Note: If you look in StringView.cpp, you see another setUnderlyingString() which
1155         takes a StringView otherString.  This version of setUnderlyingString() can only
1156         be called from within the same thread that created the other StringView.  As a
1157         result, here, we are guaranteed that the UnderlyingString refCount is never zero,
1158         and there's no other threat of another thread trying to delete the UnderlyingString
1159         while we adopt it.  Hence, we don't need to acquire the underlyingStringsMutex
1160         here.
1161
1162         This race condition was found when running layout tests fetch/fetch-worker-crash.html
1163         and storage/indexeddb/modern/opendatabase-versions.html when CHECK_STRINGVIEW_LIFETIME
1164         is enabled.  This issue resulted in those tests crashing due to a use-after-free.
1165
1166         * wtf/text/StringView.cpp:
1167         (WTF::StringView::adoptUnderlyingString):
1168         (WTF::StringView::setUnderlyingString):
1169
1170 2016-09-28  Brent Fulgham  <bfulgham@apple.com>
1171
1172         Correct 'safeCast' implementation
1173         https://bugs.webkit.org/show_bug.cgi?id=162679
1174         <rdar://problem/28518189>
1175
1176         Reviewed by Zalan Bujtas.
1177
1178         * wtf/StdLibExtras.h:
1179         (WTF::safeCast): Use a RELEASE_ASSERT.
1180
1181 2016-09-27  Don Olmstead  <don.olmstead@am.sony.com>
1182
1183         [CMake] Add HAVE_LOCALTIME_R definition
1184         https://bugs.webkit.org/show_bug.cgi?id=162636
1185
1186         Reviewed by Alex Christensen.
1187
1188         * wtf/DateMath.cpp:
1189         (WTF::getLocalTime):
1190         * wtf/GregorianDateTime.cpp:
1191         (WTF::GregorianDateTime::setToCurrentLocalTime):
1192         * wtf/Platform.h:
1193
1194 2016-09-27  JF Bastien  <jfbastien@apple.com>
1195
1196         Speed up Heap::isMarkedConcurrently
1197         https://bugs.webkit.org/show_bug.cgi?id=162095
1198
1199         Reviewed by Filip Pizlo.
1200
1201         Heap::isMarkedConcurrently had a load-load fence which is expensive on weak memory ISAs such as ARM.
1202
1203         This patch is fairly perf-neutral overall, but the GC's instrumentation reports:
1204           GC:Eden is 93% average runtime after change
1205           GC:Full is 76% average runtime after change
1206
1207         The fence was there because:
1208          1. If the read of m_markingVersion in MarkedBlock::areMarksStale isn't what's expected then;
1209          2. The read of m_marks in MarkedBlock::isMarked needs to observe the value that was stored *before* m_markingVersion was stored.
1210
1211         This ordering isn't guaranteed on ARM, which has a weak memory model.
1212
1213         There are 3 ways to guarantee this ordering:
1214          A. Use a barrier instruction.
1215          B. Use a load-acquire (new in ARMv8).
1216          C. use ARM's address dependency rule, which C++ calls memory_order_consume.
1217
1218         In general:
1219          A. is slow but orders all of memory in an intuitive manner.
1220          B. is faster-ish and has the same property-ish.
1221          C. should be faster still, but *only orders dependent loads*. This last part is critical! Consume isn't an all-out replacement for acquire (acquire is rather a superset of consume).
1222
1223         ARM explains the address dependency rule in their document "barrier litmus tests and cookbook":
1224
1225         > *Resolving by the use of barriers and address dependency*
1226         >
1227         > There is a rule within the ARM architecture that:
1228         > Where the value returned by a read is used to compute the virtual address of a subsequent read or write (this is known as an address dependency), then these two memory accesses will be observed in program order. An address dependency exists even if the value read by the first read has no effect in changing the virtual address (as might be the case if the value returned is masked off before it is used, or if it had no effect on changing a predicted address value).
1229         > This restriction applies only when the data value returned from one read is used as a data value to calculate the address of a subsequent read or write. This does not apply if the data value returned from one read is used to determine the condition code flags, and the values of the flags are used for condition code evaluation to determine the address of a subsequent reads, either through conditional execution or the evaluation of a branch. This is known as a control dependency.
1230         > Where both a control and address dependency exist, the ordering behaviour is consistent with the address dependency.
1231
1232         C++'s memory_order_consume is unfortunately unimplemented by C++ compilers, and maybe unimplementable as spec'd. I'm working with interested folks in the committee to fix this situation: http://wg21.link/p0190r2
1233
1234         * wtf/Atomics.h:
1235         (WTF::zeroWithConsumeDependency): a 0 which carries a dependency
1236         (WTF::consumeLoad): pixie magic
1237
1238 2016-09-27  JF Bastien  <jfbastien@apple.com>
1239
1240         Atomics.h on Windows: remove seq_cst hack
1241         https://bugs.webkit.org/show_bug.cgi?id=162022
1242
1243         Reviewed by Mark Lam.
1244
1245         No need to force access to seq_cst, always inlining fixes the MSVC warning.
1246
1247         * wtf/Atomics.h:
1248         (WTF::Atomic::compareExchangeWeak): remove seq_cst hack
1249         (WTF::Atomic::compareExchangeStrong): remove seq_cst hack
1250         (WTF::Atomic::exchangeAndAdd): remove seq_cst hack
1251         (WTF::Atomic::exchange): remove seq_cst hack
1252
1253 2016-09-27  Don Olmstead  <don.olmstead@am.sony.com>
1254
1255         [CMake] Use CMake to determine HAVE_* defines
1256         https://bugs.webkit.org/show_bug.cgi?id=162368
1257
1258         Reviewed by Alex Christensen.
1259
1260         * wtf/Platform.h:
1261
1262 2016-09-20  Anders Carlsson  <andersca@apple.com>
1263
1264         PlatformEvent::m_modifiers should be an OptionSet
1265         https://bugs.webkit.org/show_bug.cgi?id=162326
1266
1267         Reviewed by Daniel Bates.
1268
1269         * wtf/OptionSet.h:
1270         (WTF::OptionSet::operator!=):
1271         (WTF::OptionSet::operator-):
1272
1273 2016-09-27  Jer Noble  <jer.noble@apple.com>
1274
1275         Remove deprecated ENCRYPTED_MEDIA implementation.
1276         https://bugs.webkit.org/show_bug.cgi?id=161010
1277
1278         Reviewed by Eric Carlson.
1279
1280         Remove ENABLE_ENCRYPTED_MEDIA.
1281
1282         * wtf/FeatureDefines.h:
1283
1284 2016-09-27  Youenn Fablet  <youenn@apple.com>
1285
1286         [Fetch API] Use Ref<const T> in FetchBody::m_data variant
1287         https://bugs.webkit.org/show_bug.cgi?id=162599
1288
1289         Reviewed by Alex Christensen.
1290
1291         Enabling to use DeferrableRefCounted<const T> by making m_refCount mutable.
1292
1293         * wtf/DeferrableRefCounted.h:
1294         (WTF::DeferrableRefCountedBase::ref):
1295         (WTF::DeferrableRefCountedBase::derefBase):
1296         (WTF::DeferrableRefCounted::deref):
1297
1298 2016-09-26  Daniel Bates  <dabates@apple.com>
1299
1300         Rename IOS_TEXT_AUTOSIZING to TEXT_AUTOSIZING
1301         https://bugs.webkit.org/show_bug.cgi?id=162365
1302
1303         Reviewed by Simon Fraser.
1304
1305         * wtf/FeatureDefines.h:
1306
1307 2016-09-26  Benjamin Poulain  <benjamin@webkit.org>
1308
1309         [JSC] Shrink the Math inline caches some more
1310         https://bugs.webkit.org/show_bug.cgi?id=162485
1311
1312         Reviewed by Saam Barati.
1313
1314         * wtf/Bag.h:
1315         Don't copy the arguments before initializing the nodes.
1316
1317 2016-09-26  Michael Catanzaro  <mcatanzaro@igalia.com>
1318
1319         std::unique_ptr deleter functions should not check if pointer is null
1320         https://bugs.webkit.org/show_bug.cgi?id=162558
1321
1322         Reviewed by Alex Christensen.
1323
1324         std::unique_ptr already does this before calling the deleter.
1325
1326         * wtf/efl/UniquePtrEfl.h:
1327         * wtf/glib/GUniquePtr.h:
1328
1329 == Rolled over to ChangeLog-2016-09-26 ==