#include "CodeBlock.h"
#include "JSONObject.h"
#include "ObjectConstructor.h"
-#include "Operations.h"
+#include "JSCInlines.h"
namespace JSC { namespace Profiler {
-#if COMPILER(MINGW) || COMPILER(MSVC7_OR_LOWER) || OS(WINCE)
-static int databaseCounter;
-#else
-static volatile int databaseCounter;
-#endif
-static SpinLock registrationLock = SPINLOCK_INITIALIZER;
-static int didRegisterAtExit;
+static std::atomic<int> databaseCounter;
+
+static StaticSpinLock registrationLock;
+static std::atomic<int> didRegisterAtExit;
static Database* firstDatabase;
Database::Database(VM& vm)
- : m_databaseID(atomicIncrement(&databaseCounter))
+ : m_databaseID(++databaseCounter)
, m_vm(vm)
, m_shouldSaveAtExit(false)
, m_nextRegisteredDatabase(0)
Bytecodes* Database::ensureBytecodesFor(CodeBlock* codeBlock)
{
+ Locker locker(m_lock);
+
codeBlock = codeBlock->baselineVersion();
HashMap<CodeBlock*, Bytecodes*>::iterator iter = m_bytecodesMap.find(codeBlock);
void Database::notifyDestruction(CodeBlock* codeBlock)
{
+ Locker locker(m_lock);
+
m_bytecodesMap.remove(codeBlock);
}
-PassRefPtr<Compilation> Database::newCompilation(Bytecodes* bytecodes, CompilationKind kind)
+void Database::addCompilation(PassRefPtr<Compilation> compilation)
{
- RefPtr<Compilation> compilation = adoptRef(new Compilation(bytecodes, kind));
+ ASSERT(!isCompilationThread());
+
m_compilations.append(compilation);
- return compilation.release();
-}
-
-PassRefPtr<Compilation> Database::newCompilation(CodeBlock* codeBlock, CompilationKind kind)
-{
- return newCompilation(ensureBytecodesFor(codeBlock), kind);
}
JSValue Database::toJS(ExecState* exec) const
bool Database::save(const char* filename) const
{
- OwnPtr<FilePrintStream> out = FilePrintStream::open(filename, "w");
+ auto out = FilePrintStream::open(filename, "w");
if (!out)
return false;
void Database::addDatabaseToAtExit()
{
- if (atomicIncrement(&didRegisterAtExit) == 1)
+ if (++didRegisterAtExit == 1)
atexit(atExitCallback);
- TCMalloc_SpinLockHolder holder(®istrationLock);
+ SpinLockHolder holder(registrationLock);
m_nextRegisteredDatabase = firstDatabase;
firstDatabase = this;
}
void Database::removeDatabaseFromAtExit()
{
- TCMalloc_SpinLockHolder holder(®istrationLock);
+ SpinLockHolder holder(registrationLock);
for (Database** current = &firstDatabase; *current; current = &(*current)->m_nextRegisteredDatabase) {
if (*current != this)
continue;
Database* Database::removeFirstAtExitDatabase()
{
- TCMalloc_SpinLockHolder holder(®istrationLock);
+ SpinLockHolder holder(registrationLock);
Database* result = firstDatabase;
if (result) {
firstDatabase = result->m_nextRegisteredDatabase;