mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 21:07:35 +00:00
LibJS: Port garbage collector to Linux
Well that was easy. LibJS can now run on Linux :^)
This commit is contained in:
parent
538537dfd0
commit
79e065f0a2
2 changed files with 32 additions and 3 deletions
|
@ -31,10 +31,15 @@
|
||||||
#include <LibJS/Heap/HeapBlock.h>
|
#include <LibJS/Heap/HeapBlock.h>
|
||||||
#include <LibJS/Interpreter.h>
|
#include <LibJS/Interpreter.h>
|
||||||
#include <LibJS/Runtime/Object.h>
|
#include <LibJS/Runtime/Object.h>
|
||||||
#include <serenity.h>
|
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef __serenity__
|
||||||
|
#include <serenity.h>
|
||||||
|
#elif __linux__
|
||||||
|
#include <pthread.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define HEAP_DEBUG
|
#define HEAP_DEBUG
|
||||||
|
|
||||||
namespace JS {
|
namespace JS {
|
||||||
|
@ -105,15 +110,31 @@ void Heap::gather_conservative_roots(HashTable<Cell*>& roots)
|
||||||
|
|
||||||
HashTable<FlatPtr> possible_pointers;
|
HashTable<FlatPtr> possible_pointers;
|
||||||
|
|
||||||
for (size_t i = 0; i < (sizeof(buf->regs) / sizeof(FlatPtr)); ++i)
|
const FlatPtr* raw_jmp_buf = reinterpret_cast<const FlatPtr*>(buf);
|
||||||
possible_pointers.set(buf->regs[i]);
|
|
||||||
|
for (size_t i = 0; i < sizeof(buf) / sizeof(FlatPtr); i += sizeof(FlatPtr))
|
||||||
|
possible_pointers.set(raw_jmp_buf[i]);
|
||||||
|
|
||||||
FlatPtr stack_base;
|
FlatPtr stack_base;
|
||||||
size_t stack_size;
|
size_t stack_size;
|
||||||
|
|
||||||
|
#ifdef __serenity__
|
||||||
if (get_stack_bounds(&stack_base, &stack_size) < 0) {
|
if (get_stack_bounds(&stack_base, &stack_size) < 0) {
|
||||||
perror("get_stack_bounds");
|
perror("get_stack_bounds");
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
#elif __linux__
|
||||||
|
pthread_attr_t attr = {};
|
||||||
|
if (int rc = pthread_getattr_np(pthread_self(), &attr) != 0) {
|
||||||
|
fprintf(stderr, "pthread_getattr_np: %s\n", strerror(-rc));
|
||||||
|
ASSERT_NOT_REACHED();
|
||||||
|
}
|
||||||
|
if (int rc = pthread_attr_getstack(&attr, (void**)&stack_base, &stack_size) != 0) {
|
||||||
|
fprintf(stderr, "pthread_attr_getstack: %s\n", strerror(-rc));
|
||||||
|
ASSERT_NOT_REACHED();
|
||||||
|
}
|
||||||
|
pthread_attr_destroy(&attr);
|
||||||
|
#endif
|
||||||
|
|
||||||
FlatPtr stack_reference = reinterpret_cast<FlatPtr>(&dummy);
|
FlatPtr stack_reference = reinterpret_cast<FlatPtr>(&dummy);
|
||||||
FlatPtr stack_top = stack_base + stack_size;
|
FlatPtr stack_top = stack_base + stack_size;
|
||||||
|
|
|
@ -37,7 +37,11 @@ NonnullOwnPtr<HeapBlock> HeapBlock::create_with_cell_size(Heap& heap, size_t cel
|
||||||
{
|
{
|
||||||
char name[64];
|
char name[64];
|
||||||
snprintf(name, sizeof(name), "LibJS: HeapBlock(%zu)", cell_size);
|
snprintf(name, sizeof(name), "LibJS: HeapBlock(%zu)", cell_size);
|
||||||
|
#ifdef __serenity__
|
||||||
auto* block = (HeapBlock*)serenity_mmap(nullptr, block_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0, block_size, name);
|
auto* block = (HeapBlock*)serenity_mmap(nullptr, block_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0, block_size, name);
|
||||||
|
#else
|
||||||
|
auto* block = (HeapBlock*)aligned_alloc(block_size, block_size);
|
||||||
|
#endif
|
||||||
ASSERT(block != MAP_FAILED);
|
ASSERT(block != MAP_FAILED);
|
||||||
new (block) HeapBlock(heap, cell_size);
|
new (block) HeapBlock(heap, cell_size);
|
||||||
return NonnullOwnPtr<HeapBlock>(NonnullOwnPtr<HeapBlock>::Adopt, *block);
|
return NonnullOwnPtr<HeapBlock>(NonnullOwnPtr<HeapBlock>::Adopt, *block);
|
||||||
|
@ -45,8 +49,12 @@ NonnullOwnPtr<HeapBlock> HeapBlock::create_with_cell_size(Heap& heap, size_t cel
|
||||||
|
|
||||||
void HeapBlock::operator delete(void* ptr)
|
void HeapBlock::operator delete(void* ptr)
|
||||||
{
|
{
|
||||||
|
#ifdef __serenity__
|
||||||
int rc = munmap(ptr, block_size);
|
int rc = munmap(ptr, block_size);
|
||||||
ASSERT(rc == 0);
|
ASSERT(rc == 0);
|
||||||
|
#else
|
||||||
|
free(ptr);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
HeapBlock::HeapBlock(Heap& heap, size_t cell_size)
|
HeapBlock::HeapBlock(Heap& heap, size_t cell_size)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue