summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/bytecode/ExecutionCounter.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/bytecode/ExecutionCounter.h')
-rw-r--r--Source/JavaScriptCore/bytecode/ExecutionCounter.h58
1 files changed, 41 insertions, 17 deletions
diff --git a/Source/JavaScriptCore/bytecode/ExecutionCounter.h b/Source/JavaScriptCore/bytecode/ExecutionCounter.h
index c755c0445..5002c6c67 100644
--- a/Source/JavaScriptCore/bytecode/ExecutionCounter.h
+++ b/Source/JavaScriptCore/bytecode/ExecutionCounter.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2012, 2014 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -35,46 +35,67 @@ namespace JSC {
class CodeBlock;
+enum CountingVariant {
+ CountingForBaseline,
+ CountingForUpperTiers
+};
+
+double applyMemoryUsageHeuristics(int32_t value, CodeBlock*);
+int32_t applyMemoryUsageHeuristicsAndConvertToInt(int32_t value, CodeBlock*);
+
+inline int32_t formattedTotalExecutionCount(float value)
+{
+ union {
+ int32_t i;
+ float f;
+ } u;
+ u.f = value;
+ return u.i;
+}
+
+template<CountingVariant countingVariant>
class ExecutionCounter {
public:
ExecutionCounter();
+ void forceSlowPathConcurrently(); // If you use this, checkIfThresholdCrossedAndSet() may still return false.
bool checkIfThresholdCrossedAndSet(CodeBlock*);
void setNewThreshold(int32_t threshold, CodeBlock*);
void deferIndefinitely();
double count() const { return static_cast<double>(m_totalCount) + m_counter; }
void dump(PrintStream&) const;
- static double applyMemoryUsageHeuristics(int32_t value, CodeBlock*);
- static int32_t applyMemoryUsageHeuristicsAndConvertToInt(int32_t value, CodeBlock*);
+
+ static int32_t maximumExecutionCountsBetweenCheckpoints()
+ {
+ switch (countingVariant) {
+ case CountingForBaseline:
+ return Options::maximumExecutionCountsBetweenCheckpointsForBaseline();
+ case CountingForUpperTiers:
+ return Options::maximumExecutionCountsBetweenCheckpointsForUpperTiers();
+ default:
+ RELEASE_ASSERT_NOT_REACHED();
+ return 0;
+ }
+ }
+
template<typename T>
static T clippedThreshold(JSGlobalObject* globalObject, T threshold)
{
int32_t maxThreshold;
if (Options::randomizeExecutionCountsBetweenCheckpoints())
- maxThreshold = globalObject->weakRandomInteger() % Options::maximumExecutionCountsBetweenCheckpoints();
+ maxThreshold = globalObject->weakRandomInteger() % maximumExecutionCountsBetweenCheckpoints();
else
- maxThreshold = Options::maximumExecutionCountsBetweenCheckpoints();
+ maxThreshold = maximumExecutionCountsBetweenCheckpoints();
if (threshold > maxThreshold)
threshold = maxThreshold;
return threshold;
}
- static int32_t formattedTotalCount(float value)
- {
- union {
- int32_t i;
- float f;
- } u;
- u.f = value;
- return u.i;
- }
-
private:
bool hasCrossedThreshold(CodeBlock*) const;
bool setThreshold(CodeBlock*);
void reset();
public:
-
// NB. These are intentionally public because it will be modified from machine code.
// This counter is incremented by the JIT or LLInt. It starts out negative and is
@@ -89,11 +110,14 @@ public:
// m_counter.
float m_totalCount;
- // This is the threshold we were originally targetting, without any correction for
+ // This is the threshold we were originally targeting, without any correction for
// the memory usage heuristics.
int32_t m_activeThreshold;
};
+typedef ExecutionCounter<CountingForBaseline> BaselineExecutionCounter;
+typedef ExecutionCounter<CountingForUpperTiers> UpperTierExecutionCounter;
+
} // namespace JSC
#endif // ExecutionCounter_h