summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/bytecode/Watchpoint.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/bytecode/Watchpoint.h')
-rw-r--r--Source/JavaScriptCore/bytecode/Watchpoint.h172
1 files changed, 30 insertions, 142 deletions
diff --git a/Source/JavaScriptCore/bytecode/Watchpoint.h b/Source/JavaScriptCore/bytecode/Watchpoint.h
index c8f628d33..8790f4e62 100644
--- a/Source/JavaScriptCore/bytecode/Watchpoint.h
+++ b/Source/JavaScriptCore/bytecode/Watchpoint.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -27,47 +27,12 @@
#define Watchpoint_h
#include <wtf/Atomics.h>
-#include <wtf/FastMalloc.h>
-#include <wtf/Noncopyable.h>
-#include <wtf/PrintStream.h>
#include <wtf/SentinelLinkedList.h>
#include <wtf/ThreadSafeRefCounted.h>
namespace JSC {
-class FireDetail {
- void* operator new(size_t) = delete;
-
-public:
- FireDetail()
- {
- }
-
- virtual ~FireDetail()
- {
- }
-
- virtual void dump(PrintStream&) const = 0;
-};
-
-class StringFireDetail : public FireDetail {
-public:
- StringFireDetail(const char* string)
- : m_string(string)
- {
- }
-
- virtual void dump(PrintStream& out) const override;
-
-private:
- const char* m_string;
-};
-
-class WatchpointSet;
-
class Watchpoint : public BasicRawSentinelNode<Watchpoint> {
- WTF_MAKE_NONCOPYABLE(Watchpoint);
- WTF_MAKE_FAST_ALLOCATED;
public:
Watchpoint()
{
@@ -75,12 +40,10 @@ public:
virtual ~Watchpoint();
+ void fire() { fireInternal(); }
+
protected:
- virtual void fireInternal(const FireDetail&) = 0;
-
-private:
- friend class WatchpointSet;
- void fire(const FireDetail&);
+ virtual void fireInternal() = 0;
};
enum WatchpointState {
@@ -94,14 +57,8 @@ class InlineWatchpointSet;
class WatchpointSet : public ThreadSafeRefCounted<WatchpointSet> {
friend class LLIntOffsetsExtractor;
public:
- JS_EXPORT_PRIVATE WatchpointSet(WatchpointState);
- JS_EXPORT_PRIVATE ~WatchpointSet(); // Note that this will not fire any of the watchpoints; if you need to know when a WatchpointSet dies then you need a separate mechanism for this.
-
- // Fast way of getting the state, which only works from the main thread.
- WatchpointState stateOnJSThread() const
- {
- return static_cast<WatchpointState>(m_state);
- }
+ WatchpointSet(WatchpointState);
+ ~WatchpointSet(); // Note that this will not fire any of the watchpoints; if you need to know when a WatchpointSet dies then you need a separate mechanism for this.
// It is safe to call this from another thread. It may return an old
// state. Guarantees that if *first* read the state() of the thing being
@@ -141,66 +98,39 @@ public:
// set watchpoints that we believe will actually be fired.
void startWatching()
{
- ASSERT(m_state != IsInvalidated);
- if (m_state == IsWatched)
- return;
- WTF::storeStoreFence();
+ ASSERT(state() != IsInvalidated);
m_state = IsWatched;
- WTF::storeStoreFence();
}
- void fireAll(const FireDetail& detail)
+ void fireAll()
{
- if (LIKELY(m_state != IsWatched))
+ if (state() != IsWatched)
return;
- fireAllSlow(detail);
+ fireAllSlow();
}
- void fireAll(const char* reason)
- {
- if (LIKELY(m_state != IsWatched))
- return;
- fireAllSlow(reason);
- }
-
- void touch(const FireDetail& detail)
+ void touch()
{
if (state() == ClearWatchpoint)
startWatching();
else
- fireAll(detail);
+ fireAll();
}
- void touch(const char* reason)
- {
- touch(StringFireDetail(reason));
- }
-
- void invalidate(const FireDetail& detail)
+ void invalidate()
{
if (state() == IsWatched)
- fireAll(detail);
+ fireAll();
m_state = IsInvalidated;
}
-
- void invalidate(const char* reason)
- {
- invalidate(StringFireDetail(reason));
- }
-
- bool isBeingWatched() const
- {
- return m_setIsNotEmpty;
- }
-
+
int8_t* addressOfState() { return &m_state; }
int8_t* addressOfSetIsNotEmpty() { return &m_setIsNotEmpty; }
- JS_EXPORT_PRIVATE void fireAllSlow(const FireDetail&); // Call only if you've checked isWatched.
- JS_EXPORT_PRIVATE void fireAllSlow(const char* reason); // Ditto.
+ JS_EXPORT_PRIVATE void fireAllSlow(); // Call only if you've checked isWatched.
private:
- void fireAllWatchpoints(const FireDetail&);
+ void fireAllWatchpoints();
friend class InlineWatchpointSet;
@@ -244,34 +174,18 @@ public:
freeFat();
}
- // Fast way of getting the state, which only works from the main thread.
- WatchpointState stateOnJSThread() const
- {
- uintptr_t data = m_data;
- if (isFat(data))
- return fat(data)->stateOnJSThread();
- return decodeState(data);
- }
-
- // It is safe to call this from another thread. It may return a prior state,
- // but that should be fine since you should only perform actions based on the
- // state if you also add a watchpoint.
- WatchpointState state() const
- {
- WTF::loadLoadFence();
- uintptr_t data = m_data;
- WTF::loadLoadFence();
- if (isFat(data))
- return fat(data)->state();
- return decodeState(data);
- }
-
// It is safe to call this from another thread. It may return false
// even if the set actually had been invalidated, but that ought to happen
// only in the case of races, and should be rare.
bool hasBeenInvalidated() const
{
- return state() == IsInvalidated;
+ WTF::loadLoadFence();
+ uintptr_t data = m_data;
+ if (isFat(data)) {
+ WTF::loadLoadFence();
+ return fat(data)->hasBeenInvalidated();
+ }
+ return decodeState(data) == IsInvalidated;
}
// Like hasBeenInvalidated(), may be called from another thread.
@@ -292,10 +206,10 @@ public:
m_data = encodeState(IsWatched);
}
- void fireAll(const FireDetail& detail)
+ void fireAll()
{
if (isFat()) {
- fat()->fireAll(detail);
+ fat()->fireAll();
return;
}
if (decodeState(m_data) == ClearWatchpoint)
@@ -304,45 +218,19 @@ public:
WTF::storeStoreFence();
}
- void invalidate(const FireDetail& detail)
- {
- if (isFat())
- fat()->invalidate(detail);
- else
- m_data = encodeState(IsInvalidated);
- }
-
- JS_EXPORT_PRIVATE void fireAll(const char* reason);
-
- void touch(const FireDetail& detail)
+ void touch()
{
if (isFat()) {
- fat()->touch(detail);
+ fat()->touch();
return;
}
- uintptr_t data = m_data;
- if (decodeState(data) == IsInvalidated)
- return;
- WTF::storeStoreFence();
- if (decodeState(data) == ClearWatchpoint)
+ if (decodeState(m_data) == ClearWatchpoint)
m_data = encodeState(IsWatched);
else
m_data = encodeState(IsInvalidated);
WTF::storeStoreFence();
}
- void touch(const char* reason)
- {
- touch(StringFireDetail(reason));
- }
-
- bool isBeingWatched() const
- {
- if (isFat())
- return fat()->isBeingWatched();
- return false;
- }
-
private:
static const uintptr_t IsThinFlag = 1;
static const uintptr_t StateMask = 6;
@@ -359,7 +247,7 @@ private:
static uintptr_t encodeState(WatchpointState state)
{
- return (static_cast<uintptr_t>(state) << StateShift) | IsThinFlag;
+ return (state << StateShift) | IsThinFlag;
}
bool isThin() const { return isThin(m_data); }