• Jeff Brown's avatar
    Optimize IndirectRefTable. · 5552e624
    Jeff Brown authored
    Removed unused debugging code that maintained pointers to the
    4 previous objects in each slot.
    
    Promoted the serial number property of a slot to be first class.
    This is a sufficiently cheap and useful check to perform that we
    might as well always do it.
    
    Changed get() and remove() so they check the validity of the
    references at the same time as they retrieve them.  They're
    also a bit smarter about checking the reference kind given
    that they can assume that the table will only contain references
    of one kind.  The checks are now much more consistent.
    For example, remove() used to check whether an index was
    stale only in the case where it was not removing the top entry
    (now it always checks).
    
    Made add() return NULL instead of dvmAbort()'ing in the case
    where the table overflowed and ensure we don't blow away the
    table in that cases.  This change resolves an issue with
    TestIndirectRefTable.cpp which deliberately overflows the table
    and expects add() to return NULL (as documented!).  As it
    happens, the add() method is called in exactly 3 places in
    Jni.cpp.  In each of those cases, the code was written to
    handle a NULL result and only in the case of adding a weak
    global reference did it not abort.  Fixed the weak global
    reference case to be consistent with the others.
    
    Changed the signature of contains() to take an Object* since
    that's what we're actually looking for inside the table.
    
    Added a couple of calls to dump() in TestIndirectRefTable.cpp
    for visual inspection of its correctness.
    
    Performance as measured by TestIndirectRefTable on same hardware.
    
    Old implementation:
    - Add/remove 100 objects FIFO order, 100000 iterations, 0.023ms / iteration
    - Add/remove 100 objects LIFO order, 100000 iterations, 0.020ms / iteration
    - Get 100 objects, 100000 iterations, 0.009ms / iteration
    
    New implementation:
    - Add/remove 100 objects FIFO order, 100000 iterations, 0.010ms / iteration
    - Add/remove 100 objects LIFO order, 100000 iterations, 0.009ms / iteration
    - Get 100 objects, 100000 iterations, 0.002ms / iteration
    
    Change-Id: I1c904eb03bc8dd9822e6d9cce702c696e976974e
    5552e624
IndirectRefTable.h 13.2 KB