Ignore:
Timestamp:
Apr 11, 2017, 7:56:21 AM (8 years ago)
Author:
Yusuke Suzuki
Message:

[JSC][GTK] Use RunLoop::Timer in GTK port
https://bugs.webkit.org/show_bug.cgi?id=170723

Reviewed by Carlos Garcia Campos.

Source/JavaScriptCore:

This patch makes GTK port use RunLoop::Timer for JSRunLoopTimer.
Only Cocoa-based ports use platform-specific Timer because it
has additional feature that changes RunLoop to the WebThread one.

And we enable Heap timers in all the ports including JSCOnly port.

  • heap/EdenGCActivityCallback.cpp:

(JSC::EdenGCActivityCallback::lastGCLength):

  • heap/EdenGCActivityCallback.h:
  • heap/FullGCActivityCallback.cpp:

(JSC::FullGCActivityCallback::lastGCLength):

  • heap/FullGCActivityCallback.h:
  • heap/GCActivityCallback.cpp:

(JSC::GCActivityCallback::GCActivityCallback):
(JSC::GCActivityCallback::doWork):
(JSC::GCActivityCallback::scheduleTimer):
(JSC::GCActivityCallback::cancelTimer):
(JSC::GCActivityCallback::nextFireTime):
(JSC::GCActivityCallback::didAllocate):

  • heap/GCActivityCallback.h:
  • heap/IncrementalSweeper.cpp:

(JSC::IncrementalSweeper::doWork):
(JSC::IncrementalSweeper::doSweep):

  • heap/IncrementalSweeper.h:
  • heap/StopIfNecessaryTimer.cpp:

(JSC::StopIfNecessaryTimer::scheduleSoon):

  • runtime/JSRunLoopTimer.cpp:

(JSC::JSRunLoopTimer::setRunLoop):
(JSC::JSRunLoopTimer::scheduleTimer):
(JSC::JSRunLoopTimer::cancelTimer):
(JSC::JSRunLoopTimer::JSRunLoopTimer):
(JSC::JSRunLoopTimer::~JSRunLoopTimer):
(JSC::JSRunLoopTimer::timerDidFireCallback):

  • runtime/JSRunLoopTimer.h:
  • runtime/PromiseDeferredTimer.cpp:

(JSC::PromiseDeferredTimer::scheduleWorkSoon):

Source/WTF:

Add secondsUntilFire method. And add setName and setPriority
for GTK RunLoop::Timer.

  • wtf/RunLoop.h:
  • wtf/cf/RunLoopCF.cpp:

(WTF::RunLoop::TimerBase::secondsUntilFire):

  • wtf/generic/RunLoopGeneric.cpp:

(WTF::RunLoop::TimerBase::secondsUntilFire):

  • wtf/glib/RunLoopGLib.cpp:

(WTF::RunLoop::TimerBase::setName):
(WTF::RunLoop::TimerBase::secondsUntilFire):

  • wtf/win/RunLoopWin.cpp:

(WTF::RunLoop::TimerBase::timerFired):
(WTF::RunLoop::TimerBase::start):
(WTF::RunLoop::TimerBase::isActive):
(WTF::RunLoop::TimerBase::secondsUntilFire):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/runtime/JSRunLoopTimer.cpp

    r215223 r215228  
    3636#include <wtf/Threading.h>
    3737
    38 #if USE(GLIB)
     38#if USE(GLIB_EVENT_LOOP)
    3939#include <glib.h>
    4040#include <wtf/glib/RunLoopSourcePriority.h>
     
    4242
    4343namespace JSC {
     44
     45const Seconds JSRunLoopTimer::s_decade { 60 * 60 * 24 * 365 * 10 };
    4446
    4547void JSRunLoopTimer::timerDidFire()
     
    6466#if USE(CF)
    6567
    66 const CFTimeInterval JSRunLoopTimer::s_decade = 60 * 60 * 24 * 365 * 10;
    67 
    6868JSRunLoopTimer::JSRunLoopTimer(VM* vm)
    6969    : m_vm(vm)
     
    8686        memset(&m_context, 0, sizeof(CFRunLoopTimerContext));
    8787        m_context.info = this;
    88         m_timer = adoptCF(CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + s_decade, s_decade, 0, 0, JSRunLoopTimer::timerDidFireCallback, &m_context));
     88        m_timer = adoptCF(CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + s_decade.seconds(), s_decade.seconds(), 0, 0, JSRunLoopTimer::timerDidFireCallback, &m_context));
    8989        CFRunLoopAddTimer(m_runLoop.get(), m_timer.get(), kCFRunLoopCommonModes);
    9090    }
     
    101101}
    102102
    103 void JSRunLoopTimer::scheduleTimer(double intervalInSeconds)
     103void JSRunLoopTimer::scheduleTimer(Seconds intervalInSeconds)
    104104{
    105     CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + intervalInSeconds);
     105    CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + intervalInSeconds.seconds());
    106106    m_isScheduled = true;
    107107}
     
    109109void JSRunLoopTimer::cancelTimer()
    110110{
    111     CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + s_decade);
    112     m_isScheduled = false;
    113 }
    114 
    115 #elif USE(GLIB)
    116 
    117 const long JSRunLoopTimer::s_decade = 60 * 60 * 24 * 365 * 10;
    118 
    119 static GSourceFuncs JSRunLoopTimerSourceFunctions = {
    120     nullptr, // prepare
    121     nullptr, // check
    122     // dispatch
    123     [](GSource*, GSourceFunc callback, gpointer userData) -> gboolean
    124     {
    125         return callback(userData);
    126     },
    127     nullptr, // finalize
    128     nullptr, // closure_callback
    129     nullptr, // closure_marshall
    130 };
    131 
    132 JSRunLoopTimer::JSRunLoopTimer(VM* vm)
    133     : m_vm(vm)
    134     , m_apiLock(&vm->apiLock())
    135     , m_timer(adoptGRef(g_source_new(&JSRunLoopTimerSourceFunctions, sizeof(GSource))))
    136 {
    137     g_source_set_priority(m_timer.get(), RunLoopSourcePriority::JavascriptTimer);
    138     g_source_set_name(m_timer.get(), "[JavaScriptCore] JSRunLoopTimer");
    139     g_source_set_callback(m_timer.get(), [](gpointer userData) -> gboolean {
    140         auto& runLoopTimer = *static_cast<JSRunLoopTimer*>(userData);
    141         g_source_set_ready_time(runLoopTimer.m_timer.get(), g_get_monotonic_time() + JSRunLoopTimer::s_decade * G_USEC_PER_SEC);
    142         runLoopTimer.timerDidFire();
    143         return G_SOURCE_CONTINUE;
    144     }, this, nullptr);
    145     g_source_attach(m_timer.get(), g_main_context_get_thread_default());
    146 }
    147 
    148 JSRunLoopTimer::~JSRunLoopTimer()
    149 {
    150     g_source_destroy(m_timer.get());
    151 }
    152 
    153 void JSRunLoopTimer::scheduleTimer(double intervalInSeconds)
    154 {
    155     g_source_set_ready_time(m_timer.get(), g_get_monotonic_time() + intervalInSeconds * G_USEC_PER_SEC);
    156     m_isScheduled = true;
    157 }
    158 
    159 void JSRunLoopTimer::cancelTimer()
    160 {
    161     g_source_set_ready_time(m_timer.get(), g_get_monotonic_time() + s_decade * G_USEC_PER_SEC);
     111    CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + s_decade.seconds());
    162112    m_isScheduled = false;
    163113}
     
    165115#else
    166116
    167 const Seconds JSRunLoopTimer::s_decade { 60 * 60 * 24 * 365 * 10 };
    168 
    169117JSRunLoopTimer::JSRunLoopTimer(VM* vm)
    170118    : m_vm(vm)
    171119    , m_apiLock(&vm->apiLock())
    172     , m_timer(RunLoop::current(), this, &JSRunLoopTimer::timerDidFire)
     120    , m_timer(RunLoop::current(), this, &JSRunLoopTimer::timerDidFireCallback)
    173121{
     122#if USE(GLIB_EVENT_LOOP)
     123    m_timer.setPriority(RunLoopSourcePriority::JavascriptTimer);
     124    m_timer.setName("[JavaScriptCore] JSRunLoopTimer");
     125#endif
    174126    m_timer.startOneShot(s_decade);
    175127}
     
    179131}
    180132
    181 void JSRunLoopTimer::scheduleTimer(double intervalInSeconds)
     133void JSRunLoopTimer::timerDidFireCallback()
     134{
     135    m_timer.startOneShot(s_decade);
     136    timerDidFire();
     137}
     138
     139void JSRunLoopTimer::scheduleTimer(Seconds intervalInSeconds)
    182140{
    183141    m_timer.startOneShot(intervalInSeconds);
Note: See TracChangeset for help on using the changeset viewer.