mirror of
https://bitbucket.org/smil3y/katie.git
synced 2025-02-24 10:52:56 +00:00
remove useless JavaScriptCore file
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
parent
2fe6525ad4
commit
39b413bcaf
1 changed files with 0 additions and 393 deletions
|
@ -1,393 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
|
|
||||||
* Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com)
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
|
|
||||||
* its contributors may be used to endorse or promote products derived
|
|
||||||
* from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
|
|
||||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
* DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "Threading.h"
|
|
||||||
|
|
||||||
#if USE(PTHREADS)
|
|
||||||
|
|
||||||
#include "CurrentTime.h"
|
|
||||||
#include "HashMap.h"
|
|
||||||
#include "MainThread.h"
|
|
||||||
#include "RandomNumberSeed.h"
|
|
||||||
#include "StdLibExtras.h"
|
|
||||||
#include "ThreadIdentifierDataPthreads.h"
|
|
||||||
#include "ThreadSpecific.h"
|
|
||||||
#include "UnusedParam.h"
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#if !COMPILER(MSVC)
|
|
||||||
#include <limits.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if OS(ANDROID)
|
|
||||||
#include "jni_utility.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace WTF {
|
|
||||||
|
|
||||||
typedef HashMap<ThreadIdentifier, pthread_t> ThreadMap;
|
|
||||||
|
|
||||||
static Mutex* atomicallyInitializedStaticMutex;
|
|
||||||
|
|
||||||
#if !OS(DARWIN) || USE(WEB_THREAD)
|
|
||||||
static pthread_t mainThread; // The thread that was the first to call initializeThreading(), which must be the main thread.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void clearPthreadHandleForIdentifier(ThreadIdentifier);
|
|
||||||
|
|
||||||
static Mutex& threadMapMutex()
|
|
||||||
{
|
|
||||||
DEFINE_STATIC_LOCAL(Mutex, mutex, ());
|
|
||||||
return mutex;
|
|
||||||
}
|
|
||||||
|
|
||||||
void initializeThreading()
|
|
||||||
{
|
|
||||||
if (!atomicallyInitializedStaticMutex) {
|
|
||||||
atomicallyInitializedStaticMutex = new Mutex;
|
|
||||||
threadMapMutex();
|
|
||||||
initializeRandomNumberGenerator();
|
|
||||||
#if !OS(DARWIN) || USE(WEB_THREAD)
|
|
||||||
mainThread = pthread_self();
|
|
||||||
#endif
|
|
||||||
initializeMainThread();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void lockAtomicallyInitializedStaticMutex()
|
|
||||||
{
|
|
||||||
ASSERT(atomicallyInitializedStaticMutex);
|
|
||||||
atomicallyInitializedStaticMutex->lock();
|
|
||||||
}
|
|
||||||
|
|
||||||
void unlockAtomicallyInitializedStaticMutex()
|
|
||||||
{
|
|
||||||
atomicallyInitializedStaticMutex->unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
static ThreadMap& threadMap()
|
|
||||||
{
|
|
||||||
DEFINE_STATIC_LOCAL(ThreadMap, map, ());
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ThreadIdentifier identifierByPthreadHandle(const pthread_t& pthreadHandle)
|
|
||||||
{
|
|
||||||
MutexLocker locker(threadMapMutex());
|
|
||||||
|
|
||||||
ThreadMap::iterator i = threadMap().begin();
|
|
||||||
for (; i != threadMap().end(); ++i) {
|
|
||||||
if (pthread_equal(i->second, pthreadHandle))
|
|
||||||
return i->first;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ThreadIdentifier establishIdentifierForPthreadHandle(const pthread_t& pthreadHandle)
|
|
||||||
{
|
|
||||||
ASSERT(!identifierByPthreadHandle(pthreadHandle));
|
|
||||||
|
|
||||||
MutexLocker locker(threadMapMutex());
|
|
||||||
|
|
||||||
static ThreadIdentifier identifierCount = 1;
|
|
||||||
|
|
||||||
threadMap().add(identifierCount, pthreadHandle);
|
|
||||||
|
|
||||||
return identifierCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static pthread_t pthreadHandleForIdentifier(ThreadIdentifier id)
|
|
||||||
{
|
|
||||||
MutexLocker locker(threadMapMutex());
|
|
||||||
|
|
||||||
return threadMap().get(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clearPthreadHandleForIdentifier(ThreadIdentifier id)
|
|
||||||
{
|
|
||||||
MutexLocker locker(threadMapMutex());
|
|
||||||
|
|
||||||
ASSERT(threadMap().contains(id));
|
|
||||||
|
|
||||||
threadMap().remove(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if OS(ANDROID)
|
|
||||||
// On the Android platform, threads must be registered with the VM before they run.
|
|
||||||
struct ThreadData {
|
|
||||||
ThreadFunction entryPoint;
|
|
||||||
void* arg;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void* runThreadWithRegistration(void* arg)
|
|
||||||
{
|
|
||||||
ThreadData* data = static_cast<ThreadData*>(arg);
|
|
||||||
JavaVM* vm = JSC::Bindings::getJavaVM();
|
|
||||||
JNIEnv* env;
|
|
||||||
void* ret = 0;
|
|
||||||
if (vm->AttachCurrentThread(&env, 0) == JNI_OK) {
|
|
||||||
ret = data->entryPoint(data->arg);
|
|
||||||
vm->DetachCurrentThread();
|
|
||||||
}
|
|
||||||
delete data;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ThreadIdentifier createThreadInternal(ThreadFunction entryPoint, void* data, const char*)
|
|
||||||
{
|
|
||||||
pthread_t threadHandle;
|
|
||||||
ThreadData* threadData = new ThreadData();
|
|
||||||
threadData->entryPoint = entryPoint;
|
|
||||||
threadData->arg = data;
|
|
||||||
|
|
||||||
if (pthread_create(&threadHandle, 0, runThreadWithRegistration, static_cast<void*>(threadData))) {
|
|
||||||
LOG_ERROR("Failed to create pthread at entry point %p with data %p", entryPoint, data);
|
|
||||||
delete threadData;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return establishIdentifierForPthreadHandle(threadHandle);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
ThreadIdentifier createThreadInternal(ThreadFunction entryPoint, void* data, const char*)
|
|
||||||
{
|
|
||||||
pthread_t threadHandle;
|
|
||||||
if (pthread_create(&threadHandle, 0, entryPoint, data)) {
|
|
||||||
LOG_ERROR("Failed to create pthread at entry point %p with data %p", entryPoint, data);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return establishIdentifierForPthreadHandle(threadHandle);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void initializeCurrentThreadInternal(const char* threadName)
|
|
||||||
{
|
|
||||||
#if HAVE(PTHREAD_SETNAME_NP)
|
|
||||||
pthread_setname_np(threadName);
|
|
||||||
#else
|
|
||||||
UNUSED_PARAM(threadName);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ThreadIdentifier id = identifierByPthreadHandle(pthread_self());
|
|
||||||
ASSERT(id);
|
|
||||||
ThreadIdentifierData::initialize(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
int waitForThreadCompletion(ThreadIdentifier threadID, void** result)
|
|
||||||
{
|
|
||||||
ASSERT(threadID);
|
|
||||||
|
|
||||||
pthread_t pthreadHandle = pthreadHandleForIdentifier(threadID);
|
|
||||||
if (!pthreadHandle)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
int joinResult = pthread_join(pthreadHandle, result);
|
|
||||||
if (joinResult == EDEADLK)
|
|
||||||
LOG_ERROR("ThreadIdentifier %u was found to be deadlocked trying to quit", threadID);
|
|
||||||
|
|
||||||
return joinResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
void detachThread(ThreadIdentifier threadID)
|
|
||||||
{
|
|
||||||
ASSERT(threadID);
|
|
||||||
|
|
||||||
pthread_t pthreadHandle = pthreadHandleForIdentifier(threadID);
|
|
||||||
if (!pthreadHandle)
|
|
||||||
return;
|
|
||||||
|
|
||||||
pthread_detach(pthreadHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
ThreadIdentifier currentThread()
|
|
||||||
{
|
|
||||||
ThreadIdentifier id = ThreadIdentifierData::identifier();
|
|
||||||
if (id)
|
|
||||||
return id;
|
|
||||||
|
|
||||||
// Not a WTF-created thread, ThreadIdentifier is not established yet.
|
|
||||||
id = establishIdentifierForPthreadHandle(pthread_self());
|
|
||||||
ThreadIdentifierData::initialize(id);
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isMainThread()
|
|
||||||
{
|
|
||||||
#if OS(DARWIN) && !USE(WEB_THREAD)
|
|
||||||
return pthread_main_np();
|
|
||||||
#else
|
|
||||||
return pthread_equal(pthread_self(), mainThread);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
Mutex::Mutex()
|
|
||||||
{
|
|
||||||
pthread_mutex_init(&m_mutex, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
Mutex::~Mutex()
|
|
||||||
{
|
|
||||||
pthread_mutex_destroy(&m_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mutex::lock()
|
|
||||||
{
|
|
||||||
int result = pthread_mutex_lock(&m_mutex);
|
|
||||||
ASSERT_UNUSED(result, !result);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Mutex::tryLock()
|
|
||||||
{
|
|
||||||
int result = pthread_mutex_trylock(&m_mutex);
|
|
||||||
|
|
||||||
if (result == 0)
|
|
||||||
return true;
|
|
||||||
if (result == EBUSY)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
ASSERT_NOT_REACHED();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mutex::unlock()
|
|
||||||
{
|
|
||||||
int result = pthread_mutex_unlock(&m_mutex);
|
|
||||||
ASSERT_UNUSED(result, !result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if HAVE(PTHREAD_RWLOCK)
|
|
||||||
ReadWriteLock::ReadWriteLock()
|
|
||||||
{
|
|
||||||
pthread_rwlock_init(&m_readWriteLock, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
ReadWriteLock::~ReadWriteLock()
|
|
||||||
{
|
|
||||||
pthread_rwlock_destroy(&m_readWriteLock);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ReadWriteLock::readLock()
|
|
||||||
{
|
|
||||||
int result = pthread_rwlock_rdlock(&m_readWriteLock);
|
|
||||||
ASSERT_UNUSED(result, !result);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ReadWriteLock::tryReadLock()
|
|
||||||
{
|
|
||||||
int result = pthread_rwlock_tryrdlock(&m_readWriteLock);
|
|
||||||
|
|
||||||
if (result == 0)
|
|
||||||
return true;
|
|
||||||
if (result == EBUSY || result == EAGAIN)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
ASSERT_NOT_REACHED();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ReadWriteLock::writeLock()
|
|
||||||
{
|
|
||||||
int result = pthread_rwlock_wrlock(&m_readWriteLock);
|
|
||||||
ASSERT_UNUSED(result, !result);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ReadWriteLock::tryWriteLock()
|
|
||||||
{
|
|
||||||
int result = pthread_rwlock_trywrlock(&m_readWriteLock);
|
|
||||||
|
|
||||||
if (result == 0)
|
|
||||||
return true;
|
|
||||||
if (result == EBUSY || result == EAGAIN)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
ASSERT_NOT_REACHED();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ReadWriteLock::unlock()
|
|
||||||
{
|
|
||||||
int result = pthread_rwlock_unlock(&m_readWriteLock);
|
|
||||||
ASSERT_UNUSED(result, !result);
|
|
||||||
}
|
|
||||||
#endif // HAVE(PTHREAD_RWLOCK)
|
|
||||||
|
|
||||||
ThreadCondition::ThreadCondition()
|
|
||||||
{
|
|
||||||
pthread_cond_init(&m_condition, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
ThreadCondition::~ThreadCondition()
|
|
||||||
{
|
|
||||||
pthread_cond_destroy(&m_condition);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ThreadCondition::wait(Mutex& mutex)
|
|
||||||
{
|
|
||||||
int result = pthread_cond_wait(&m_condition, &mutex.impl());
|
|
||||||
ASSERT_UNUSED(result, !result);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ThreadCondition::timedWait(Mutex& mutex, double absoluteTime)
|
|
||||||
{
|
|
||||||
if (absoluteTime < currentTime())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (absoluteTime > INT_MAX) {
|
|
||||||
wait(mutex);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int timeSeconds = static_cast<int>(absoluteTime);
|
|
||||||
int timeNanoseconds = static_cast<int>((absoluteTime - timeSeconds) * 1E9);
|
|
||||||
|
|
||||||
timespec targetTime;
|
|
||||||
targetTime.tv_sec = timeSeconds;
|
|
||||||
targetTime.tv_nsec = timeNanoseconds;
|
|
||||||
|
|
||||||
return pthread_cond_timedwait(&m_condition, &mutex.impl(), &targetTime) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ThreadCondition::signal()
|
|
||||||
{
|
|
||||||
int result = pthread_cond_signal(&m_condition);
|
|
||||||
ASSERT_UNUSED(result, !result);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ThreadCondition::broadcast()
|
|
||||||
{
|
|
||||||
int result = pthread_cond_broadcast(&m_condition);
|
|
||||||
ASSERT_UNUSED(result, !result);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace WTF
|
|
||||||
|
|
||||||
#endif // USE(PTHREADS)
|
|
Loading…
Add table
Reference in a new issue