mirror of
https://github.com/fluencelabs/musl
synced 2025-04-24 23:02:14 +00:00
Merge pull request #1 from fluencelabs/memory-grow-mk4
Simple memory grow
This commit is contained in:
commit
f5a94478d8
1
.gitignore
vendored
1
.gitignore
vendored
@ -6,3 +6,4 @@
|
|||||||
config.mak
|
config.mak
|
||||||
lib/musl-gcc.specs
|
lib/musl-gcc.specs
|
||||||
/obj/
|
/obj/
|
||||||
|
.idea/*
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define a_barrier() syscall(__NR_membarrier)
|
#define a_barrier() (0)
|
||||||
|
|
||||||
#define a_cas a_cas
|
#define a_cas a_cas
|
||||||
static inline int a_cas(volatile int *p, int t, int s)
|
static inline int a_cas(volatile int *p, int t, int s)
|
||||||
|
@ -7,3 +7,13 @@ static inline struct pthread *__pthread_self(void) {
|
|||||||
#define CANCEL_REG_IP 16
|
#define CANCEL_REG_IP 16
|
||||||
|
|
||||||
#define MC_PC gregs[REG_EIP]
|
#define MC_PC gregs[REG_EIP]
|
||||||
|
|
||||||
|
#define __wait __wait
|
||||||
|
static inline void __wait(volatile int *addr, volatile int *waiters, int cnt, int priv) {}
|
||||||
|
static inline void __wake(volatile void *addr, int cnt, int priv) {}
|
||||||
|
static inline void __futexwait(volatile void *addr, int val, int priv) {}
|
||||||
|
|
||||||
|
#define __block_all_sigs __block_all_sigs
|
||||||
|
static inline void __block_all_sigs(void *set) {}
|
||||||
|
static inline void __block_app_sigs(void *set) {}
|
||||||
|
static inline void __restore_sigs(void *set) {}
|
||||||
|
@ -34,7 +34,13 @@ struct bin {
|
|||||||
|
|
||||||
#define C_INUSE ((size_t)1)
|
#define C_INUSE ((size_t)1)
|
||||||
|
|
||||||
|
#ifndef __wasm__
|
||||||
#define IS_MMAPPED(c) !((c)->csize & (C_INUSE))
|
#define IS_MMAPPED(c) !((c)->csize & (C_INUSE))
|
||||||
|
#else
|
||||||
|
#undef MMAP_THRESHOLD
|
||||||
|
#define MMAP_THRESHOLD ((size_t)-1)
|
||||||
|
#define IS_MMAPPED(c) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
__attribute__((__visibility__("hidden")))
|
__attribute__((__visibility__("hidden")))
|
||||||
void __bin_chunk(struct chunk *);
|
void __bin_chunk(struct chunk *);
|
||||||
|
@ -150,6 +150,8 @@ void __vm_unlock(void);
|
|||||||
|
|
||||||
int __timedwait(volatile int *, int, clockid_t, const struct timespec *, int);
|
int __timedwait(volatile int *, int, clockid_t, const struct timespec *, int);
|
||||||
int __timedwait_cp(volatile int *, int, clockid_t, const struct timespec *, int);
|
int __timedwait_cp(volatile int *, int, clockid_t, const struct timespec *, int);
|
||||||
|
|
||||||
|
#ifndef __wait
|
||||||
void __wait(volatile int *, volatile int *, int, int);
|
void __wait(volatile int *, volatile int *, int, int);
|
||||||
static inline void __wake(volatile void *addr, int cnt, int priv)
|
static inline void __wake(volatile void *addr, int cnt, int priv)
|
||||||
{
|
{
|
||||||
@ -164,14 +166,17 @@ static inline void __futexwait(volatile void *addr, int val, int priv)
|
|||||||
__syscall(SYS_futex, addr, FUTEX_WAIT|priv, val) != -ENOSYS ||
|
__syscall(SYS_futex, addr, FUTEX_WAIT|priv, val) != -ENOSYS ||
|
||||||
__syscall(SYS_futex, addr, FUTEX_WAIT, val);
|
__syscall(SYS_futex, addr, FUTEX_WAIT, val);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void __acquire_ptc(void);
|
void __acquire_ptc(void);
|
||||||
void __release_ptc(void);
|
void __release_ptc(void);
|
||||||
void __inhibit_ptc(void);
|
void __inhibit_ptc(void);
|
||||||
|
|
||||||
|
#ifndef __block_all_sigs
|
||||||
void __block_all_sigs(void *);
|
void __block_all_sigs(void *);
|
||||||
void __block_app_sigs(void *);
|
void __block_app_sigs(void *);
|
||||||
void __restore_sigs(void *);
|
void __restore_sigs(void *);
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DEFAULT_STACK_SIZE 81920
|
#define DEFAULT_STACK_SIZE 81920
|
||||||
#define DEFAULT_GUARD_SIZE 4096
|
#define DEFAULT_GUARD_SIZE 4096
|
||||||
|
@ -99,6 +99,7 @@ static int bin_index_up(size_t x)
|
|||||||
if (x <= 32) return x;
|
if (x <= 32) return x;
|
||||||
x--;
|
x--;
|
||||||
if (x < 512) return bin_tab[x/8-4] + 1;
|
if (x < 512) return bin_tab[x/8-4] + 1;
|
||||||
|
if (x > 0x1c00) return 64;
|
||||||
return bin_tab[x/128-4] + 17;
|
return bin_tab[x/128-4] + 17;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,6 +284,34 @@ static void trim(struct chunk *self, size_t n)
|
|||||||
__bin_chunk(split);
|
__bin_chunk(split);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// returns chunk which size is more then given n from the 63-th unsorted bin
|
||||||
|
// if there is no suitable chunk returns 0
|
||||||
|
static struct chunk *get_chunk_from_unsorted_bin(size_t n)
|
||||||
|
{
|
||||||
|
const int unsorted_bin_id = 63;
|
||||||
|
struct chunk *current = 0;
|
||||||
|
|
||||||
|
lock_bin(unsorted_bin_id);
|
||||||
|
current = mal.bins[unsorted_bin_id].head;
|
||||||
|
|
||||||
|
while(current != 0 && current != mal.bins[unsorted_bin_id].tail) {
|
||||||
|
// use the simple first-fit strategy
|
||||||
|
if(current->csize >= n) {
|
||||||
|
if (!pretrim(current, n, unsorted_bin_id, unsorted_bin_id)) {
|
||||||
|
unbin(current, unsorted_bin_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
unlock_bin(unsorted_bin_id);
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
current = current->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
unlock_bin(unsorted_bin_id);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void *malloc(size_t n)
|
void *malloc(size_t n)
|
||||||
{
|
{
|
||||||
struct chunk *c;
|
struct chunk *c;
|
||||||
@ -304,7 +333,14 @@ void *malloc(size_t n)
|
|||||||
i = bin_index_up(n);
|
i = bin_index_up(n);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
uint64_t mask = mal.binmap & -(1ULL<<i);
|
uint64_t mask = mal.binmap & -(1ULL<<i);
|
||||||
if (!mask) {
|
if (i == 64) {
|
||||||
|
c = get_chunk_from_unsorted_bin(n);
|
||||||
|
if(c != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == 64 || !mask) {
|
||||||
c = expand_heap(n);
|
c = expand_heap(n);
|
||||||
if (!c) return 0;
|
if (!c) return 0;
|
||||||
if (alloc_rev(c)) {
|
if (alloc_rev(c)) {
|
||||||
@ -315,6 +351,7 @@ void *malloc(size_t n)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
j = first_set(mask);
|
j = first_set(mask);
|
||||||
lock_bin(j);
|
lock_bin(j);
|
||||||
c = mal.bins[j].head;
|
c = mal.bins[j].head;
|
||||||
|
28
src/malloc/wasm32/expand_heap.c
Normal file
28
src/malloc/wasm32/expand_heap.c
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#include <limits.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include "libc.h"
|
||||||
|
#include "syscall.h"
|
||||||
|
|
||||||
|
#define WASM_PAGE_SIZE 65536
|
||||||
|
|
||||||
|
/* Expand the heap in-place use WebAssembly grow_memory operators.
|
||||||
|
* The caller is responsible for locking to prevent concurrent calls. */
|
||||||
|
|
||||||
|
void *__expand_heap(size_t *pn)
|
||||||
|
{
|
||||||
|
size_t n = *pn;
|
||||||
|
n += -n & WASM_PAGE_SIZE-1;
|
||||||
|
unsigned delta = n / WASM_PAGE_SIZE;
|
||||||
|
|
||||||
|
unsigned res = __builtin_wasm_memory_grow(0, delta);
|
||||||
|
if (res == (unsigned)-1) {
|
||||||
|
errno = ENOMEM;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *area = (void*)(WASM_PAGE_SIZE * res);
|
||||||
|
*pn = n;
|
||||||
|
return area;
|
||||||
|
}
|
6
src/mman/wasm32/madvise.c
Normal file
6
src/mman/wasm32/madvise.c
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include <sys/mman.h>
|
||||||
|
#include "libc.h"
|
||||||
|
|
||||||
|
int __madvise(void *addr, size_t len, int advice) { return 0; }
|
||||||
|
|
||||||
|
weak_alias(__madvise, madvise);
|
1
src/signal/wasm32/block.c
Normal file
1
src/signal/wasm32/block.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "pthread_impl.h"
|
3
src/signal/wasm32/raise.c
Normal file
3
src/signal/wasm32/raise.c
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
int raise(int sig) { }
|
@ -215,7 +215,8 @@ int vfwscanf(FILE *restrict f, const wchar_t *restrict fmt, va_list ap)
|
|||||||
if (t == 'c') {
|
if (t == 'c') {
|
||||||
if (width<1) width = 1;
|
if (width<1) width = 1;
|
||||||
invert = 1;
|
invert = 1;
|
||||||
set = L"";
|
static const wchar_t empty[] = { 0 };
|
||||||
|
set = empty;
|
||||||
} else if (t == 's') {
|
} else if (t == 's') {
|
||||||
invert = 1;
|
invert = 1;
|
||||||
static const wchar_t spaces[] = {
|
static const wchar_t spaces[] = {
|
||||||
|
@ -12,8 +12,9 @@ static size_t do_read(FILE *f, unsigned char *buf, size_t len)
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
const wchar_t *wcs = f->cookie;
|
const wchar_t *wcs = f->cookie;
|
||||||
|
static const wchar_t strudel[] = { '@', 0 };
|
||||||
|
|
||||||
if (!wcs[0]) wcs=L"@";
|
if (!wcs[0]) wcs=strudel;
|
||||||
for (i=0; i<f->buf_size && wcs[i]; i++)
|
for (i=0; i<f->buf_size && wcs[i]; i++)
|
||||||
f->buf[i] = wcs[i] < 128 ? wcs[i] : '@';
|
f->buf[i] = wcs[i] < 128 ? wcs[i] : '@';
|
||||||
f->rpos = f->buf;
|
f->rpos = f->buf;
|
||||||
|
@ -14,8 +14,9 @@ static size_t do_read(FILE *f, unsigned char *buf, size_t len)
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
const wchar_t *wcs = f->cookie;
|
const wchar_t *wcs = f->cookie;
|
||||||
|
static const wchar_t strudel[] = { '@', 0 };
|
||||||
|
|
||||||
if (!wcs[0]) wcs=L"@";
|
if (!wcs[0]) wcs=strudel;
|
||||||
for (i=0; i<f->buf_size && wcs[i]; i++)
|
for (i=0; i<f->buf_size && wcs[i]; i++)
|
||||||
f->buf[i] = wcs[i] < 128 ? wcs[i] : '@';
|
f->buf[i] = wcs[i] < 128 ? wcs[i] : '@';
|
||||||
f->rpos = f->buf;
|
f->rpos = f->buf;
|
||||||
|
2
src/thread/wasm32/__wait.c
Normal file
2
src/thread/wasm32/__wait.c
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#include "pthread_impl.h"
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user