OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
64 // | 64 // |
65 // FIXME: We should evaluate the performance gain. Having | 65 // FIXME: We should evaluate the performance gain. Having |
66 // ThreadAffinity is complicating the implementation and we should get | 66 // ThreadAffinity is complicating the implementation and we should get |
67 // rid of it if it is fast enough to go through thread-local storage | 67 // rid of it if it is fast enough to go through thread-local storage |
68 // always. | 68 // always. |
69 enum ThreadAffinity { | 69 enum ThreadAffinity { |
70 AnyThread, | 70 AnyThread, |
71 MainThreadOnly, | 71 MainThreadOnly, |
72 }; | 72 }; |
73 | 73 |
74 // By default all types are considered to be used on the main thread only. | 74 class Node; |
75 class CSSValue; | |
76 | |
77 template<typename T> | |
78 class DerivesNodeOrCSSValue { | |
79 private: | |
80 typedef char YesType; | |
81 struct NoType { | |
82 char padding[8]; | |
83 }; | |
84 | |
85 static YesType check(Node*); | |
86 static YesType check(CSSValue*); | |
87 static NoType check(void*); | |
88 | |
89 public: | |
90 static const bool value = sizeof(check(static_cast<T*>(0))) == sizeof(YesTyp e); | |
91 }; | |
92 | |
93 template<typename T, bool derivesNodeOrCSSValue = DerivesNodeOrCSSValue<T>::valu e > class DefaultThreadingTrait; | |
zerny-chromium
2014/02/21 07:04:54
I think this can use:
derivesNodeOrCSSValue = I
| |
94 | |
95 template<typename T> | |
96 struct DefaultThreadingTrait<T, false> { | |
haraken
2014/02/21 06:51:08
Would you add a comment to mention that only Node
| |
97 static const ThreadAffinity Affinity = MainThreadOnly; | |
98 }; | |
99 | |
100 template<typename T> | |
101 struct DefaultThreadingTrait<T, true> { | |
102 static const ThreadAffinity Affinity = AnyThread; | |
103 }; | |
104 | |
75 template<typename T> | 105 template<typename T> |
76 struct ThreadingTrait { | 106 struct ThreadingTrait { |
77 static const ThreadAffinity Affinity = MainThreadOnly; | 107 static const ThreadAffinity Affinity = DefaultThreadingTrait<T>::Affinity; |
78 }; | 108 }; |
79 | 109 |
80 // Marks the specified class as being used from multiple threads. When | 110 // Marks the specified class as being used from multiple threads. When |
81 // a class is used from multiple threads we go through thread local | 111 // a class is used from multiple threads we go through thread local |
82 // storage to get the heap in which to allocate an object of that type | 112 // storage to get the heap in which to allocate an object of that type |
83 // and when allocating a Persistent handle for an object with that | 113 // and when allocating a Persistent handle for an object with that |
84 // type. Notice that marking the base class does not automatically | 114 // type. Notice that marking the base class does not automatically |
85 // mark its descendants and they have to be explicitly marked. | 115 // mark its descendants and they have to be explicitly marked. |
86 #define USED_FROM_MULTIPLE_THREADS(Class) \ | 116 #define USED_FROM_MULTIPLE_THREADS(Class) \ |
87 class Class; \ | 117 class Class; \ |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
538 ASSERT(ThreadState::isMainThread()); | 568 ASSERT(ThreadState::isMainThread()); |
539 return ThreadState::mainThreadState(); | 569 return ThreadState::mainThreadState(); |
540 } | 570 } |
541 }; | 571 }; |
542 | 572 |
543 template<> class ThreadStateFor<AnyThread> { | 573 template<> class ThreadStateFor<AnyThread> { |
544 public: | 574 public: |
545 static ThreadState* state() { return ThreadState::current(); } | 575 static ThreadState* state() { return ThreadState::current(); } |
546 }; | 576 }; |
547 | 577 |
578 /* | |
548 // FIXME: Experiment if the threading affinity really matters for performance. | 579 // FIXME: Experiment if the threading affinity really matters for performance. |
549 // FIXME: Move these macros and other related structures to a separate file. | 580 // FIXME: Move these macros and other related structures to a separate file. |
550 USED_FROM_MULTIPLE_THREADS(Algorithm); | 581 USED_FROM_MULTIPLE_THREADS(Algorithm); |
551 USED_FROM_MULTIPLE_THREADS(Crypto); | 582 USED_FROM_MULTIPLE_THREADS(Crypto); |
552 USED_FROM_MULTIPLE_THREADS(DOMParser); | 583 USED_FROM_MULTIPLE_THREADS(DOMParser); |
553 USED_FROM_MULTIPLE_THREADS(DeprecatedStorageQuota); | 584 USED_FROM_MULTIPLE_THREADS(DeprecatedStorageQuota); |
554 USED_FROM_MULTIPLE_THREADS(Key); | 585 USED_FROM_MULTIPLE_THREADS(Key); |
555 USED_FROM_MULTIPLE_THREADS(KeyPair); | 586 USED_FROM_MULTIPLE_THREADS(KeyPair); |
556 USED_FROM_MULTIPLE_THREADS(MemoryInfo); | 587 USED_FROM_MULTIPLE_THREADS(MemoryInfo); |
557 USED_FROM_MULTIPLE_THREADS(Notification); | 588 USED_FROM_MULTIPLE_THREADS(Notification); |
(...skipping 11 matching lines...) Expand all Loading... | |
569 USED_FROM_MULTIPLE_THREADS(WebKitNotification); | 600 USED_FROM_MULTIPLE_THREADS(WebKitNotification); |
570 USED_FROM_MULTIPLE_THREADS(WorkerCrypto); | 601 USED_FROM_MULTIPLE_THREADS(WorkerCrypto); |
571 USED_FROM_MULTIPLE_THREADS(WorkerPerformance); | 602 USED_FROM_MULTIPLE_THREADS(WorkerPerformance); |
572 USED_FROM_MULTIPLE_THREADS(XMLHttpRequest); | 603 USED_FROM_MULTIPLE_THREADS(XMLHttpRequest); |
573 USED_FROM_MULTIPLE_THREADS(XMLSerializer); | 604 USED_FROM_MULTIPLE_THREADS(XMLSerializer); |
574 USED_FROM_MULTIPLE_THREADS(XPathEvaluator); | 605 USED_FROM_MULTIPLE_THREADS(XPathEvaluator); |
575 USED_FROM_MULTIPLE_THREADS(XPathExpression); | 606 USED_FROM_MULTIPLE_THREADS(XPathExpression); |
576 USED_FROM_MULTIPLE_THREADS(XPathNSResolver); | 607 USED_FROM_MULTIPLE_THREADS(XPathNSResolver); |
577 USED_FROM_MULTIPLE_THREADS(XPathResult); | 608 USED_FROM_MULTIPLE_THREADS(XPathResult); |
578 USED_FROM_MULTIPLE_THREADS(XSLTProcessor); | 609 USED_FROM_MULTIPLE_THREADS(XSLTProcessor); |
610 */ | |
579 | 611 |
580 } | 612 } |
581 | 613 |
582 #endif // ThreadState_h | 614 #endif // ThreadState_h |
OLD | NEW |