Don't reset the notification timer on every parse start/stop. This speeds up

flurries of little document.write calls a good bit.  Bug 242899, r=peterv,
sr=jst


git-svn-id: svn://10.0.0.236/trunk@156333 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bzbarsky%mit.edu
2004-05-13 01:39:29 +00:00
parent d8ea205bcc
commit 16d46a5fcf

View File

@@ -61,6 +61,7 @@
#include "nsCRT.h"
#include "prtime.h"
#include "prlog.h"
#include "nsInt64.h"
#include "nsGenericHTMLElement.h"
#include "nsIElementFactory.h"
@@ -168,6 +169,9 @@ static PRLogModuleInfo* gSinkLogModuleInfo;
#define NS_SINK_FLAG_FORM_ON_STACK 0x00000080
#define NS_SINK_FLAG_PARSING 0x00000100
#define NS_SINK_FLAG_DROPPED_TIMER 0x00000200
// 1/2 second fudge factor for window creation
#define NS_DELAY_FOR_WINDOW_CREATION 500000
@@ -2411,6 +2415,12 @@ HTMLContentSink::Notify(nsITimer *timer)
MOZ_TIMER_DEBUGLOG(("Start: nsHTMLContentSink::Notify()\n"));
MOZ_TIMER_START(mWatch);
if (mFlags & NS_SINK_FLAG_PARSING) {
// We shouldn't interfere with our normal DidProcessAToken logic
mFlags |= NS_SINK_FLAG_DROPPED_TIMER;
return NS_OK;
}
#ifdef MOZ_DEBUG
{
PRTime now = PR_Now();
@@ -2455,44 +2465,29 @@ HTMLContentSink::WillInterrupt()
#ifndef SINK_NO_INCREMENTAL
if (mNotifyOnTimer && mLayoutStarted) {
if (mBackoffCount && !mInMonolithicContainer) {
PRTime now = PR_Now();
PRInt64 interval, diff;
PRInt32 delay;
LL_I2L(interval, GetNotificationInterval());
LL_SUB(diff, now, mLastNotificationTime);
nsInt64 now(PR_Now());
nsInt64 interval(GetNotificationInterval());
nsInt64 lastNotification(mLastNotificationTime);
nsInt64 diff(now - lastNotification);
// If it's already time for us to have a notification
if (LL_CMP(diff, >, interval)) {
if (diff > interval || (mFlags & NS_SINK_FLAG_DROPPED_TIMER)) {
mBackoffCount--;
SINK_TRACE(SINK_TRACE_REFLOW,
("HTMLContentSink::WillInterrupt: flushing tags since we've "
"run out time; backoff count: %d", mBackoffCount));
result = mCurrentContext->FlushTags(PR_TRUE);
} else {
// If the time since the last notification is less than
// the expected interval but positive, set a timer up for the remaining
// interval.
if (LL_CMP(diff, >, LL_ZERO)) {
LL_SUB(diff, interval, diff);
LL_L2I(delay, diff);
} else {
// Else set up a timer for the expected interval
delay = GetNotificationInterval();
if (mFlags & NS_SINK_FLAG_DROPPED_TIMER) {
TryToScrollToRef();
mFlags &= ~NS_SINK_FLAG_DROPPED_TIMER;
}
} else if (!mNotificationTimer) {
interval -= diff;
PRInt32 delay = interval;
// Convert to milliseconds
delay /= PR_USEC_PER_MSEC;
// Cancel a timer if we had one out there
if (mNotificationTimer) {
SINK_TRACE(SINK_TRACE_REFLOW,
("HTMLContentSink::WillInterrupt: canceling notification "
"timeout"));
mNotificationTimer->Cancel();
}
mNotificationTimer = do_CreateInstance("@mozilla.org/timer;1",
&result);
if (NS_SUCCEEDED(result)) {
@@ -2503,6 +2498,9 @@ HTMLContentSink::WillInterrupt()
result =
mNotificationTimer->InitWithCallback(this, delay,
nsITimer::TYPE_ONE_SHOT);
if (NS_FAILED(result)) {
mNotificationTimer = nsnull;
}
}
}
}
@@ -2515,6 +2513,8 @@ HTMLContentSink::WillInterrupt()
}
#endif
mFlags &= ~NS_SINK_FLAG_PARSING;
return result;
}
@@ -2523,15 +2523,7 @@ HTMLContentSink::WillResume()
{
SINK_TRACE(SINK_TRACE_CALLS, ("HTMLContentSink::WillResume: this=%p", this));
// Cancel a timer if we had one out there
if (mNotificationTimer) {
SINK_TRACE(SINK_TRACE_REFLOW,
("HTMLContentSink::WillResume: canceling notification "
"timeout"));
mNotificationTimer->Cancel();
mNotificationTimer = 0;
}
mFlags |= NS_SINK_FLAG_PARSING;
return NS_OK;
}