< prev index next >

test/hotspot/gtest/classfile/test_symbolTable.cpp

Print this page

        

*** 22,31 **** --- 22,32 ---- */ #include "precompiled.hpp" #include "runtime/interfaceSupport.inline.hpp" #include "classfile/symbolTable.hpp" + #include "threadHelper.inline.hpp" #include "unittest.hpp" TEST_VM(SymbolTable, temp_new_symbol) { // Assert messages assume these symbols are unique, and the refcounts start at // one, but code does not rely on this.
*** 72,77 **** --- 73,145 ---- { // inner scope TempNewSymbol s_inner = xyz; } ASSERT_EQ(xyz->refcount(), xyzcount - 1) << "Should have been decremented by dtor in inner scope"; + + // Test overflowing refcount making symbol permanent + Symbol* bigsym = SymbolTable::new_symbol("bigsym", CATCH); + for (int i = 0; i < PERM_REFCOUNT + 100; i++) { + bigsym->increment_refcount(); + } + ASSERT_EQ(bigsym->refcount(), PERM_REFCOUNT) << "should not have overflowed"; + + } + + // TODO: Make two threads one decrementing the refcount and the other trying to increment. + // try_increment_refcount should return false + + #define SYM_NAME_LENGTH 30 + static char symbol_name[SYM_NAME_LENGTH]; + + class SymbolThread : public JavaTestThread { + public: + SymbolThread(Semaphore* post) : JavaTestThread(post) {} + virtual ~SymbolThread() {} + void main_run() { + Thread* THREAD = Thread::current(); + for (int i = 0; i < 1000; i++) { + TempNewSymbol sym = SymbolTable::new_symbol(symbol_name, CATCH); + // Create and destroy new symbol + EXPECT_TRUE(sym->refcount() != 0) << "Symbol refcount unexpectedly zeroed"; + } + } + }; + + #define SYM_TEST_THREAD_COUNT 5 + + class DriverSymbolThread : public JavaTestThread { + public: + Semaphore _done; + DriverSymbolThread(Semaphore* post) : JavaTestThread(post) { }; + virtual ~DriverSymbolThread(){} + + void main_run() { + Semaphore done(0); + + Thread* THREAD = Thread::current(); + + // Find a symbol where there will probably be only one instance. + for (int i = 0; i < 100; i++) { + snprintf(symbol_name, SYM_NAME_LENGTH, "some_symbol%d", i); + TempNewSymbol ts = SymbolTable::new_symbol(symbol_name, CATCH); + if (ts->refcount() == 1) { + EXPECT_TRUE(ts->refcount() == 1) << "Symbol is just created"; + break; // found a unique symbol + } + } + + SymbolThread* st[SYM_TEST_THREAD_COUNT]; + for (int i = 0; i < SYM_TEST_THREAD_COUNT; i++) { + st[i] = new SymbolThread(&done); + st[i]->doit(); + } + + for (int i = 0; i < 4; i++) { + done.wait(); + } + } + }; + + TEST_VM(SymbolTable, test_symbol_refcount_parallel) { + mt_test_doer<DriverSymbolThread>(); }
< prev index next >