Changeset 82866 in webkit


Ignore:
Timestamp:
Apr 4, 2011 1:40:35 PM (13 years ago)
Author:
ggaren@apple.com
Message:

2011-04-04 Geoffrey Garen <ggaren@apple.com>

Reviewed by Oliver Hunt.

Renamed Finalizer => WeakHandleOwner (in preparation for adding a reachability callback)
https://bugs.webkit.org/show_bug.cgi?id=57775


Also renamed noFinalizer => emptyWeakOwner, since this is really an
optimization for a weak owner with empty callbacks.

  • collector/handles/HandleHeap.cpp: (JSC::HandleHeap::clearWeakPointers): Updated for renames. Removed redundant initialization of m_nextToFinalize. Moved deletion check inside weak owner check, since the weak owner can't delete the node if there is no weak owner!
  • collector/handles/HandleHeap.h: (JSC::WeakHandleOwner::~WeakHandleOwner): (JSC::HandleHeap::makeWeak): Updated for renames.

(JSC::HandleHeap::hasWeakOwner): Changed getFinalizer to hasWeakOwner,
to clarify this function's role in assertions.

(JSC::HandleHeap::Node::Node):
(JSC::HandleHeap::Node::makeWeak):
(JSC::HandleHeap::Node::isWeak):
(JSC::HandleHeap::Node::weakOwner):
(JSC::HandleHeap::Node::weakOwnerContext):
(JSC::HandleHeap::Node::emptyWeakOwner):

  • interpreter/RegisterFile.cpp: (JSC::RegisterFile::globalObjectCollectedNotifier):
  • interpreter/RegisterFile.h:
  • runtime/WeakGCMap.h:
  • runtime/WeakGCPtr.h: (JSC::WeakGCPtr::WeakGCPtr): (JSC::WeakGCPtr::set): Updated for renames.
Location:
trunk/Source/JavaScriptCore
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r82858 r82866  
     12011-04-04  Geoffrey Garen  <ggaren@apple.com>
     2
     3        Reviewed by Oliver Hunt.
     4
     5        Renamed Finalizer => WeakHandleOwner (in preparation for adding a reachability callback)
     6        https://bugs.webkit.org/show_bug.cgi?id=57775
     7       
     8        Also renamed noFinalizer => emptyWeakOwner, since this is really an
     9        optimization for a weak owner with empty callbacks.
     10
     11        * collector/handles/HandleHeap.cpp:
     12        (JSC::HandleHeap::clearWeakPointers): Updated for renames. Removed
     13        redundant initialization of m_nextToFinalize. Moved deletion check inside
     14        weak owner check, since the weak owner can't delete the node if there is
     15        no weak owner!
     16
     17        * collector/handles/HandleHeap.h:
     18        (JSC::WeakHandleOwner::~WeakHandleOwner):
     19        (JSC::HandleHeap::makeWeak): Updated for renames.
     20
     21        (JSC::HandleHeap::hasWeakOwner): Changed getFinalizer to hasWeakOwner,
     22        to clarify this function's role in assertions.
     23
     24        (JSC::HandleHeap::Node::Node):
     25        (JSC::HandleHeap::Node::makeWeak):
     26        (JSC::HandleHeap::Node::isWeak):
     27        (JSC::HandleHeap::Node::weakOwner):
     28        (JSC::HandleHeap::Node::weakOwnerContext):
     29        (JSC::HandleHeap::Node::emptyWeakOwner):
     30        * interpreter/RegisterFile.cpp:
     31        (JSC::RegisterFile::globalObjectCollectedNotifier):
     32        * interpreter/RegisterFile.h:
     33        * runtime/WeakGCMap.h:
     34        * runtime/WeakGCPtr.h:
     35        (JSC::WeakGCPtr::WeakGCPtr):
     36        (JSC::WeakGCPtr::set): Updated for renames.
     37
    1382011-04-04  Oliver Hunt  <oliver@apple.com>
    239
  • trunk/Source/JavaScriptCore/collector/handles/HandleHeap.cpp

    r82718 r82866  
    8787            continue;
    8888
    89         m_nextToFinalize = node->next();
    90         if (Finalizer* finalizer = node->finalizer())
    91             finalizer->finalize(Handle<Unknown>::wrapSlot(node->slot()), node->finalizerContext());
    92 
    93         if (m_nextToFinalize != node->next()) // Finalizer deallocated node.
    94             continue;
     89        if (WeakHandleOwner* weakOwner = node->weakOwner()) {
     90            weakOwner->finalize(Handle<Unknown>::wrapSlot(node->slot()), node->weakOwnerContext());
     91            if (m_nextToFinalize != node->next()) // Owner deallocated node.
     92                continue;
     93        }
    9594
    9695        *node->slot() = JSValue();
  • trunk/Source/JavaScriptCore/collector/handles/HandleHeap.h

    r82718 r82866  
    3939class HeapRootMarker;
    4040
    41 class Finalizer {
     41class WeakHandleOwner {
    4242public:
    4343    virtual void finalize(Handle<Unknown>, void*) = 0;
    44     virtual ~Finalizer() {}
     44    virtual ~WeakHandleOwner() {}
    4545};
    4646
     
    5454    void deallocate(HandleSlot);
    5555
    56     void makeWeak(HandleSlot, Finalizer* = 0, void* context = 0);
     56    void makeWeak(HandleSlot, WeakHandleOwner* = 0, void* context = 0);
    5757
    5858    void markStrongHandles(HeapRootMarker&);
     
    6565
    6666#if !ASSERT_DISABLED
    67     Finalizer* getFinalizer(HandleSlot handle)
    68     {
    69         return toNode(handle)->finalizer();
    70     }
     67    bool hasWeakOwner(HandleSlot, WeakHandleOwner*);
    7168#endif
    7269
     
    8279        HandleHeap* handleHeap();
    8380
    84         void makeWeak(Finalizer*, void* context);
     81        void makeWeak(WeakHandleOwner*, void* context);
    8582        bool isWeak();
    8683       
    87         Finalizer* finalizer();
    88         void* finalizerContext();
     84        WeakHandleOwner* weakOwner();
     85        void* weakOwnerContext();
    8986
    9087        void setPrev(Node*);
     
    9592
    9693    private:
    97         Finalizer* noFinalizer();
     94        WeakHandleOwner* emptyWeakOwner();
    9895
    9996        JSValue m_value;
    10097        HandleHeap* m_handleHeap;
    101         Finalizer* m_finalizer;
    102         void* m_finalizerContext;
     98        WeakHandleOwner* m_weakOwner;
     99        void* m_weakOwnerContext;
    103100        Node* m_prev;
    104101        Node* m_next;
     
    161158}
    162159
    163 inline void HandleHeap::makeWeak(HandleSlot handle, Finalizer* finalizer, void* context)
     160inline void HandleHeap::makeWeak(HandleSlot handle, WeakHandleOwner* weakOwner, void* context)
    164161{
    165162    Node* node = toNode(handle);
    166163    SentinelLinkedList<Node>::remove(node);
    167     node->makeWeak(finalizer, context);
     164    node->makeWeak(weakOwner, context);
    168165    if (handle->isCell() && *handle)
    169166        m_weakList.push(node);
     
    172169}
    173170
     171#if !ASSERT_DISABLED
     172inline bool HandleHeap::hasWeakOwner(HandleSlot handle, WeakHandleOwner* weakOwner)
     173{
     174    return toNode(handle)->weakOwner() == weakOwner;
     175}
     176#endif
     177
    174178inline HandleHeap::Node::Node(HandleHeap* handleHeap)
    175179    : m_handleHeap(handleHeap)
    176     , m_finalizer(0)
    177     , m_finalizerContext(0)
     180    , m_weakOwner(0)
     181    , m_weakOwnerContext(0)
    178182{
    179183}
     
    181185inline HandleHeap::Node::Node(WTF::SentinelTag)
    182186    : m_handleHeap(0)
    183     , m_finalizer(0)
    184     , m_finalizerContext(0)
     187    , m_weakOwner(0)
     188    , m_weakOwnerContext(0)
    185189{
    186190}
     
    196200}
    197201
    198 inline void HandleHeap::Node::makeWeak(Finalizer* finalizer, void* context)
    199 {
    200     m_finalizer = finalizer ? finalizer : noFinalizer();
    201     m_finalizerContext = context;
     202inline void HandleHeap::Node::makeWeak(WeakHandleOwner* weakOwner, void* context)
     203{
     204    m_weakOwner = weakOwner ? weakOwner : emptyWeakOwner();
     205    m_weakOwnerContext = context;
    202206}
    203207
    204208inline bool HandleHeap::Node::isWeak()
    205209{
    206     return m_finalizer; // True for noFinalizer().
    207 }
    208 
    209 inline Finalizer* HandleHeap::Node::finalizer()
    210 {
    211     return m_finalizer == noFinalizer() ? 0 : m_finalizer;
    212 }
    213 
    214 inline void* HandleHeap::Node::finalizerContext()
    215 {
    216     ASSERT(finalizer());
    217     return m_finalizerContext;
     210    return m_weakOwner; // True for emptyWeakOwner().
     211}
     212
     213inline WeakHandleOwner* HandleHeap::Node::weakOwner()
     214{
     215    return m_weakOwner == emptyWeakOwner() ? 0 : m_weakOwner; // 0 for emptyWeakOwner().
     216}
     217
     218inline void* HandleHeap::Node::weakOwnerContext()
     219{
     220    ASSERT(weakOwner());
     221    return m_weakOwnerContext;
    218222}
    219223
     
    238242}
    239243
    240 inline Finalizer* HandleHeap::Node::noFinalizer()
    241 {
    242     return reinterpret_cast<Finalizer*>(-1); // Sentinel to indicate a node is weak but has no real finalizer.
    243 }
    244 
    245 }
    246 
    247 #endif
     244// Sentinel to indicate that a node is weak, but its owner has no meaningful
     245// callbacks. This allows us to optimize by skipping such nodes.
     246inline WeakHandleOwner* HandleHeap::Node::emptyWeakOwner()
     247{
     248    return reinterpret_cast<WeakHandleOwner*>(-1);
     249}
     250
     251}
     252
     253#endif
  • trunk/Source/JavaScriptCore/interpreter/RegisterFile.cpp

    r81262 r82866  
    7676}
    7777
    78 class GlobalObjectNotifier : public Finalizer {
     78class GlobalObjectNotifier : public WeakHandleOwner {
    7979public:
    8080    void finalize(Handle<Unknown> value, void*)
     
    8585};
    8686
    87 Finalizer* RegisterFile::globalObjectCollectedNotifier()
     87WeakHandleOwner* RegisterFile::globalObjectCollectedNotifier()
    8888{
    8989    // This will leak alas, but we only create one of them, and it doesn't
  • trunk/Source/JavaScriptCore/interpreter/RegisterFile.h

    r81262 r82866  
    136136        static void initializeThreading();
    137137
    138         static Finalizer* globalObjectCollectedNotifier();
     138        static WeakHandleOwner* globalObjectCollectedNotifier();
    139139
    140140        Register* const * addressOfEnd() const
  • trunk/Source/JavaScriptCore/runtime/WeakGCMap.h

    r82703 r82866  
    3535// A HashMap for GC'd values that removes entries when the associated value
    3636// dies.
    37 template<typename KeyType, typename MappedType> class WeakGCMap : private Finalizer {
     37template<typename KeyType, typename MappedType> class WeakGCMap : private WeakHandleOwner {
    3838    WTF_MAKE_FAST_ALLOCATED;
    3939    WTF_MAKE_NONCOPYABLE(WeakGCMap);
  • trunk/Source/JavaScriptCore/runtime/WeakGCPtr.h

    r79601 r82866  
    4444    }
    4545   
    46     WeakGCPtr(JSGlobalData& globalData, Finalizer* finalizer = 0, void* context = 0)
     46    WeakGCPtr(JSGlobalData& globalData, WeakHandleOwner* weakOwner = 0, void* context = 0)
    4747        : m_slot(globalData.allocateGlobalHandle())
    4848    {
    49         HandleHeap::heapFor(m_slot)->makeWeak(m_slot, finalizer, context);
     49        HandleHeap::heapFor(m_slot)->makeWeak(m_slot, weakOwner, context);
    5050    }
    5151   
    52     WeakGCPtr(JSGlobalData& globalData, ExternalType value, Finalizer* finalizer = 0, void* context = 0)
     52    WeakGCPtr(JSGlobalData& globalData, ExternalType value, WeakHandleOwner* weakOwner = 0, void* context = 0)
    5353        : m_slot(globalData.allocateGlobalHandle())
    5454    {
    55         HandleHeap::heapFor(m_slot)->makeWeak(m_slot, finalizer, context);
     55        HandleHeap::heapFor(m_slot)->makeWeak(m_slot, weakOwner, context);
    5656        internalSet(value);
    5757    }
     
    7878    }
    7979
    80     void set(JSGlobalData& globalData, ExternalType value, Finalizer* finalizer)
     80    void set(JSGlobalData& globalData, ExternalType value, WeakHandleOwner* weakOwner)
    8181    {
    8282        if (!this->m_slot) {
    8383            this->m_slot = globalData.allocateGlobalHandle();
    84             HandleHeap::heapFor(this->m_slot)->makeWeak(this->m_slot, finalizer, 0);
    85         } else
    86             ASSERT(HandleHeap::heapFor(this->m_slot)->getFinalizer(this->m_slot) == finalizer);
     84            HandleHeap::heapFor(this->m_slot)->makeWeak(this->m_slot, weakOwner);
     85        }
     86        ASSERT(HandleHeap::heapFor(this->m_slot)->hasWeakOwner(this->m_slot, weakOwner));
    8787        this->internalSet(value);
    8888    }
Note: See TracChangeset for help on using the changeset viewer.