[vmkit-commits] [vmkit] r198111 - execute on my custom stacks
Gael Thomas
gael.thomas at lip6.fr
Sat Dec 28 02:41:15 PST 2013
Author: gthomas
Date: Sat Dec 28 04:41:15 2013
New Revision: 198111
URL: http://llvm.org/viewvc/llvm-project?rev=198111&view=rev
Log:
execute on my custom stacks
Modified:
vmkit/branches/mcjit/include/vmkit/thread.h
vmkit/branches/mcjit/lib/vmkit/allocator.cc
vmkit/branches/mcjit/lib/vmkit/thread.cc
vmkit/branches/mcjit/lib/vmkit/vmkit.cc
Modified: vmkit/branches/mcjit/include/vmkit/thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/thread.h?rev=198111&r1=198110&r2=198111&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/thread.h (original)
+++ vmkit/branches/mcjit/include/vmkit/thread.h Sat Dec 28 04:41:15 2013
@@ -26,10 +26,7 @@ namespace vmkit {
VMKit* vm() { return _vm; }
- static __thread Thread* _thread;
-
- static Thread* get() { return _thread; }
- static void set(Thread* thread) { _thread = thread; }
+ static Thread* get();
void start();
void join();
Modified: vmkit/branches/mcjit/lib/vmkit/allocator.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/allocator.cc?rev=198111&r1=198110&r2=198111&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/allocator.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/allocator.cc Sat Dec 28 04:41:15 2013
@@ -46,7 +46,6 @@ void* BumpAllocator::allocate(size_t siz
pthread_mutex_lock(&mutex);
size_t total = round((uintptr_t)size + sizeof(BumpAllocatorNode), 4096);
BumpAllocatorNode* newBucket = (BumpAllocatorNode*)map(total);
- //memset(newBucket, 0, total);
newBucket->next = current->next;
current->next = newBucket;
newBucket->top = (uint8_t*)((uintptr_t)newBucket + bucketSize);
@@ -59,11 +58,8 @@ void* BumpAllocator::allocate(size_t siz
uint8_t* res = __sync_fetch_and_add(&node->top, (uint8_t*)round(size, 8));
uint8_t* end = res + size;
- if(res >= (uint8_t*)node && (res + size) < ((uint8_t*)node) + bucketSize) {
- //printf("%p -> %lu %lu (%p -> %p)\n", res, size, round((uintptr_t)size, 64), node, ((uint8_t*)node) + bucketSize);
- //memset(res, 0, size);
+ if(res >= (uint8_t*)node && (res + size) < ((uint8_t*)node) + bucketSize)
return res;
- }
pthread_mutex_lock(&mutex);
BumpAllocatorNode* newBucket = (BumpAllocatorNode*)map(bucketSize);
@@ -78,7 +74,6 @@ void* BumpAllocator::map(size_t n) {
void* res = mmap(0, n, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, 0, 0);
if(res == MAP_FAILED)
Thread::get()->vm()->internalError(L"unable to map %ld bytes", n);
- //memset(res, 0, n);
return res;
}
@@ -129,7 +124,7 @@ void* ThreadAllocator::allocate() {
spaces.push_back(space);
- uintptr_t base = (((uintptr_t)space - 1) & -PAGE_SIZE) + PAGE_SIZE;
+ uintptr_t base = (((uintptr_t)space - 1) & -topStack) + topStack;
uint32_t n = (base == (uintptr_t)space) ? refill : (refill - 1);
for(uint32_t i=0; i<n; i++) {
@@ -156,5 +151,5 @@ void* ThreadAllocator::stackAddr(void* t
}
size_t ThreadAllocator::stackSize(void* thread) {
- return topStack;
+ return topStack - baseStack;
}
Modified: vmkit/branches/mcjit/lib/vmkit/thread.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/thread.cc?rev=198111&r1=198110&r2=198111&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/thread.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/thread.cc Sat Dec 28 04:41:15 2013
@@ -4,8 +4,6 @@
using namespace vmkit;
-__thread Thread* Thread::_thread = 0;
-
Thread::Thread(VMKit* vm) {
_vm = vm;
}
@@ -18,15 +16,25 @@ void Thread::operator delete(void* p) {
ThreadAllocator::allocator()->release(p);
}
+Thread* Thread::get() {
+ return (Thread*)((uintptr_t)__builtin_frame_address(0) & ThreadAllocator::allocator()->magic());
+}
+
void* Thread::doRun(void* _thread) {
Thread* thread = (Thread*)_thread;
- set(thread);
thread->run();
return 0;
}
void Thread::start() {
- pthread_create(&_tid, 0, doRun, this);
+ pthread_attr_t attr;
+
+ pthread_attr_init(&attr);
+ pthread_attr_setstack(&attr, ThreadAllocator::allocator()->stackAddr(this), ThreadAllocator::allocator()->stackSize(this));
+
+ pthread_create(&_tid, &attr, doRun, this);
+
+ pthread_attr_destroy(&attr);
}
void Thread::join() {
Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=198111&r1=198110&r2=198111&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Sat Dec 28 04:41:15 2013
@@ -100,8 +100,6 @@ void VMKit::addSymbol(llvm::GlobalValue*
}
void VMKit::vmkitBootstrap(Thread* initialThread, const char* selfBitCodePath) {
- Thread::set(initialThread);
-
std::string err;
llvm::OwningPtr<llvm::MemoryBuffer> buf;
if (llvm::MemoryBuffer::getFile(selfBitCodePath, buf))
More information about the vmkit-commits
mailing list