blob: 143cad58e37c64d4b1a29f5136c905c8c2288b8a [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#pragma once
#include "Base/ThreadServiceWrapper.h"
namespace JsStaticAPI
{
class JavascriptLibrary;
}
class ThreadServiceWrapperBase : public ThreadServiceWrapper
{
friend class JsStaticAPI::JavascriptLibrary;
public:
bool ScheduleNextCollectOnExit() override sealed;
void ScheduleFinishConcurrent() override sealed;
void SetForceOneIdleCollection() override;
protected:
enum FinishReason
{
FinishReasonNormal,
FinishReasonIdleTimerSetupFailed,
FinishReasonTaskComplete
};
ThreadServiceWrapperBase();
bool Initialize(ThreadContext *newThreadContext);
void Shutdown();
bool IdleCollect();
void FinishIdleCollect(FinishReason reason);
void ClearForceOneIdleCollection();
virtual bool CanScheduleIdleCollect() = 0;
virtual bool OnScheduleIdleCollect(uint delta, bool scheduleAsTask) = 0;
virtual void OnFinishIdleCollect() = 0;
virtual bool ShouldFinishConcurrentCollectOnIdleCallback() = 0;
ThreadContext *GetThreadContext() { return threadContext; }
private:
static const unsigned int IdleTicks = 1000; // 1 second
static const unsigned int IdleFinishTicks = 100; // 100 ms;
bool ScheduleIdleCollect(uint ticks, bool scheduleAsTask);
ThreadContext* threadContext;
bool inIdleCollect;
bool needIdleCollect;
bool forceIdleCollectOnce;
unsigned int tickCountNextIdleCollection;
bool hasScheduledIdleCollect;
bool shouldScheduleIdleCollectOnExitIdle;
};
#ifdef RECYCLER_TRACE
#define IDLE_COLLECT_VERBOSE_TRACE(msg, ...) \
if (Js::Configuration::Global.flags.Verbose) \
{ \
IDLE_COLLECT_TRACE(msg, ##__VA_ARGS__); \
}
#define IDLE_COLLECT_TRACE(msg, ...) \
if (Js::Configuration::Global.flags.Trace.IsEnabled(Js::IdleCollectPhase)) \
{\
Output::Print(_u("%04X> ") msg, ::GetCurrentThreadId(), ##__VA_ARGS__); \
Output::Flush(); \
}
#else
#define IDLE_COLLECT_TRACE(...)
#define IDLE_COLLECT_VERBOSE_TRACE(...)
#endif