Please file a bug at bugs.webkit.org, uploading a suggested patch with a test 
case, and cc fpizlo.  We can discuss it in bugzilla instead of this mailing 
list.
> On Jul 8, 2016, at 11:53 AM, Vienneau, Christopher <cvienn...@ea.com> wrote:
> 
> Hello,
>  
> I’ve recently noticed that our version of WebKit based off of 188436 asserts 
> when running the scenario below, but our older version based off of 157437 
> does not.  After doing some investigation I found that the implementation of 
> JSLock changed significantly between the two versions.  The tip of trunk 
> version is pretty much what we have in 188436 as well; the code for 
> currentThreadIsHoldingLock() I find questionable.  Please feel free to 
> suggest how we might improperly be using the system to get in the assert 
> scenario, or discuss the merit of the changes I suggest.
>  
> Thank you
>  
> Chris Vienneau
>  
>  
> Current Code:
> bool JSLock::currentThreadIsHoldingLock()
> {
>     ASSERT(!m_hasExclusiveThread || (exclusiveThread() == 
> std::this_thread::get_id()));
>     if (m_hasExclusiveThread)
>         return !!m_lockCount;
>     return m_ownerThreadID == std::this_thread::get_id();
> }
> I found the logic missing some things that I wanted really clear so I chose 
> to re-implement it. 
>  
> Suggested currentThreadIsHoldingLock
> I took a look at what happens in 15.x and came up with this version of the 
> function:
> bool JSLock::currentThreadIsHoldingLock()
> {
>     ASSERT(!m_hasExclusiveThread || (exclusiveThread() == 
> std::this_thread::get_id()));
>     //+EAWebKitChange
>     //07/07/2016 - this logic is more strait forward and fixes an assert in 
> DestroyJavascriptValue after EvaluateJavaScript
>     if (m_hasExclusiveThread && exclusiveThread() == 
> std::this_thread::get_id())
>     {
>         return true;
>     }    
>     if (m_lockCount && m_ownerThreadID == std::this_thread::get_id())
>     {
>         return true;
>     } 
>     return false;
>     //-EAWebKitChange
> }
>  
> Additional Required Fix
> The above was successful in clearing up the assert however another change was 
> needed to make things run properly for all tests and soaks:
> void JSLock::lock(intptr_t lockCount)
> {
>     ASSERT(lockCount > 0);
>     //+EAWebKitChange
>     //07/07/2016 - added  && (m_lockCount > 0) to condition
>     //currentThreadIsHoldingLock doesn't really return if it is holding the 
> lock, but more so if it should have the lock
>     //this change allows us to take the lock the first time
>     if (currentThreadIsHoldingLock() && (m_lockCount > 0)) {
>     //-EAWebKitChange
>         m_lockCount += lockCount;
>         return;
>     }
>  
>     if (!m_hasExclusiveThread) {
>         m_lock.lock();
>         m_ownerThreadID = std::this_thread::get_id();
>     }
>     ASSERT(!m_lockCount);
>     m_lockCount = lockCount;
>  
>     didAcquireLock();
> }
>  
> Test Code:
>     void JavascriptArrays(void*)
>     {
>         EA_TRACE_MESSAGE("Running JavascriptArrays");
>                                 
>         JavascriptArrayBoundObject jsb;
>         jsb.mEAWK = mEAWK;
>         jsb.mView = mView;
>  
>         using namespace EA::WebKit;
>         mView->BindJavaScriptObject("TestObject", &jsb);
>  
>         eastl::string16 script(EA_CHAR16("TestObject.ArrayTest([1, true, 
> \"ping\"]);"));
>  
>         JavascriptValue *returnValue = mEAWK->CreateJavascriptValue(mView);
>         mView->EvaluateJavaScript(script.data(), returnValue);
>         mEAWK->DestroyJavascriptValue(returnValue);
>     }
>  
> Assert location:
> \JavaScriptCore\heap\Heap.cpp (471)
> bool Heap::unprotect(JSValue k)
> {
>     ASSERT(k);
> >    ASSERT(m_vm->currentThreadIsHoldingAPILock());
> …
>  
> Callstack:
>                 
> EAWebKitDemoUTFWin.exe!EA::Browser::BrowserClient::DebugLog(EA::WebKit::DebugLogInfo
>  & dli={...}) Line 254                C++
>                EAWebKitd.dll!EA::WebKit::DebugLogCallback(const 
> eastl::basic_string<char,eastl::allocator> & origMessage={...}, bool 
> shouldAssert=true) Line 611       C++
>                EAWebKitd.dll!EA::WebKit::DebugLogCallbackInternal(bool 
> shouldAssert=true, const char * format=0x000007feb4b15170, char * 
> args=0x00000000001af000) Line 629              C++
>                EAWebKitd.dll!vprintf_stderr_common(bool shouldAssert=true, 
> const char * format=0x000007feb4b15170, char * args=0x00000000001af000) Line 
> 153           C++
>                EAWebKitd.dll!printf_stderr_common(bool shouldAssert=true, 
> const char * format=0x000007feb4b15170, ...) Line 237         C++
>                EAWebKitd.dll!printCallSite(const char * 
> file=0x000007feb4d04240, int line=471, const char * 
> function=0x000007feb4d04158, bool shouldAssert=true) Line 259             C++
>                EAWebKitd.dll!WTFReportAssertionFailure(const char * 
> file=0x000007feb4d04240, int line=471, const char * 
> function=0x000007feb4d04158, const char * assertion=0x000007feb4d03fe8) Line 
> 281    C++
>                EAWebKitd.dll!JSC::Heap::unprotect(JSC::JSValue k={...}) Line 
> 471           C++
>                EAWebKitd.dll!JSC::gcUnprotect(JSC::JSCell * 
> val=0x000007fffe453dd0) Line 38  C++
>                EAWebKitd.dll!JSC::gcUnprotect(JSC::JSValue value={...}) Line 
> 62             C++
>                EAWebKitd.dll!EA::WebKit::JavascriptValue::Destruct() Line 495 
>                C++
>                EAWebKitd.dll!EA::WebKit::JavascriptValue::~JavascriptValue() 
> Line 318               C++
>                EAWebKitd.dll!EA::WebKit::JavascriptValue::`vector deleting 
> destructor'(unsigned int)  C++
>                
> EAWebKitd.dll!EA::WebKit::DestroyJavascriptValue(EA::WebKit::JavascriptValue 
> * v=0x000007fffe4b7a70) Line 1035             C++
>                
> EAWebKitd.dll!EA::WebKit::EAWebKitLib::DestroyJavascriptValue(EA::WebKit::JavascriptValue
>  * v=0x000007fffe4b7a70) Line 400               C++
> >             
> > EAWebKitDemoUTFWin.exe!EAWebkitViewFunctionalTest::JavascriptArrays(void * 
> > __formal=0x00000000001afae0) Line 192              C++
>                 
> EAWebKitDemoUTFWin.exe!EATest::Test_mfun<EAWebkitViewFunctionalTest>::TestDelegate<EAWebkitViewFunctionalTest>::Invoke(EAWebkitViewFunctionalTest
>  * instance=0x00000001415f2130, void * p=0x00000000001afae0) Line 72          
>       C++
>                
> EAWebKitDemoUTFWin.exe!EATest::Test_mfun<EAWebkitViewFunctionalTest>::operator()(void
>  * context=0x00000000001afae0) Line 107 C++
>                EAWebKitDemoUTFWin.exe!EATest::TestCase::operator()(void * 
> context=0x00000000001afae0) Line 76                C++
>                
> EAWebKitDemoUTFWin.exe!EATest::TestSuite::ExecuteTestCase(EATest::TestCase * 
> tc=0x00000000002c4239, void * context=0x00000000001afae0) Line 520 C++
>                EAWebKitDemoUTFWin.exe!EATest::TestSuite::RunTests(const char 
> * suitename=0x0000000000000000, const char * testname=0x0000000000000000, 
> void * context=0x00000000001afae0) Line 304        C++
>                EAWebKitDemoUTFWin.exe!EATest::TestSuite::RunAllTests(void * 
> context=0x00000000001afae0) Line 147                C++
>                EAWebKitDemoUTFWin.exe!EATest::DoTests(int argc=1, char * * 
> argv=0x000007fffefb83a0, void * context=0x00000000001afae0) Line 307 C++
>                
> EAWebKitDemoUTFWin.exe!EA::Browser::RunUnitTests(EA::App::AppCommandLine & 
> commandLine={...}) Line 2284             C++
>                EAWebKitDemoUTFWin.exe!EAMain(EA::App::AppCommandLine & 
> commandLine={...}) Line 1123         C++
>                EAWebKitDemoUTFWin.exe!WinMain(HINSTANCE__ * 
> __formal=0x000000013fe80000, HINSTANCE__ * __formal=0x0000000000000000, char 
> * cmdLine=0x00000000002167c2, int __formal=10) Line 79 C++
>                EAWebKitDemoUTFWin.exe!invoke_main() Line 109      C++
>                EAWebKitDemoUTFWin.exe!__scrt_common_main_seh() Line 264       
>  C++
>                EAWebKitDemoUTFWin.exe!__scrt_common_main() Line 309  C++
>                EAWebKitDemoUTFWin.exe!WinMainCRTStartup() Line 17         C++
>                kernel32.dll!BaseThreadInitThunk‑()      Unknown
>                ntdll.dll!RtlUserThreadStart‑()   Unknown
> _______________________________________________
> webkit-dev mailing list
> webkit-dev@lists.webkit.org <mailto:webkit-dev@lists.webkit.org>
> https://lists.webkit.org/mailman/listinfo/webkit-dev 
> <https://lists.webkit.org/mailman/listinfo/webkit-dev>
_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to