fix root push and pop issue; make shared library for examples
This commit is contained in:
parent
5b8775dab6
commit
62f299dcf7
|
@ -30,3 +30,9 @@ You can statically link any LGPL 3.0 code to code of permissive licenses
|
||||||
(like MIT), and even to source-available license (like the SSPL or the
|
(like MIT), and even to source-available license (like the SSPL or the
|
||||||
Commons Clause) as long as the end user can recompile the program to use
|
Commons Clause) as long as the end user can recompile the program to use
|
||||||
their own version of the library.
|
their own version of the library.
|
||||||
|
|
||||||
|
----
|
||||||
|
Todo
|
||||||
|
----
|
||||||
|
|
||||||
|
call before gc and after gc
|
||||||
|
|
|
@ -56,13 +56,13 @@ static void check_len(void *rec, size_t i)
|
||||||
assert(i * sizeof(void *) < uns_c89_relo_get_len(rec));
|
assert(i * sizeof(void *) < uns_c89_relo_get_len(rec));
|
||||||
}
|
}
|
||||||
|
|
||||||
void uns_c89_relo_record_set(void *rec, size_t i, void *v)
|
void uns_c89_relo_record_set(Uns_ptr rec, size_t i, void *v)
|
||||||
{
|
{
|
||||||
check_len(rec, i);
|
check_len(rec, i);
|
||||||
memcpy((unsigned char *)rec + i*sizeof(void*), &v, sizeof(v));
|
memcpy((unsigned char *)rec + i*sizeof(void*), &v, sizeof(v));
|
||||||
}
|
}
|
||||||
|
|
||||||
void *uns_c89_relo_record_get(void *rec, size_t i)
|
void *uns_c89_relo_record_get(Uns_ptr rec, size_t i)
|
||||||
{
|
{
|
||||||
void *v;
|
void *v;
|
||||||
|
|
||||||
|
|
15
cheney_c89.c
15
cheney_c89.c
|
@ -14,6 +14,7 @@
|
||||||
* License along with this program. If not, see
|
* License along with this program. If not, see
|
||||||
* <https://www.gnu.org/licenses/>.
|
* <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
@ -53,6 +54,11 @@ static void *raw_alloc(struct ctx *ctx, size_t len, int is_record)
|
||||||
{
|
{
|
||||||
unsigned char *p;
|
unsigned char *p;
|
||||||
|
|
||||||
|
/*
|
||||||
|
printf("%lu (%ld)\n", (unsigned long)(len + sizeof(struct uns_c89_relo_hdr)),
|
||||||
|
(long)(ctx->tospace_end - ctx->tospace_alloc));
|
||||||
|
*/
|
||||||
|
assert(ctx->tospace_alloc + sizeof(struct uns_c89_relo_hdr) + len <= ctx->tospace_end);
|
||||||
p = uns_c89_relo_init(ctx->tospace_alloc, len, is_record);
|
p = uns_c89_relo_init(ctx->tospace_alloc, len, is_record);
|
||||||
ctx->tospace_alloc = p + len;
|
ctx->tospace_alloc = p + len;
|
||||||
|
|
||||||
|
@ -89,8 +95,8 @@ static void scan_record(struct uns_gc *gc, unsigned char *p)
|
||||||
void *newp;
|
void *newp;
|
||||||
|
|
||||||
for (i = 0; i < l; i++) {
|
for (i = 0; i < l; i++) {
|
||||||
newp = relocate(gc, uns_c89_relo_record_get(p, i));
|
newp = relocate(gc, uns_c89_relo_record_get((void *)p, i));
|
||||||
uns_c89_relo_record_set(p, i, newp);
|
uns_c89_relo_record_set((void *)p, i, newp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,6 +124,9 @@ int uns_cheney_c89_collect(struct uns_gc *gc)
|
||||||
|
|
||||||
/* Setup statistics */
|
/* Setup statistics */
|
||||||
gc->before_collection = fromspace_lim - fromspace;
|
gc->before_collection = fromspace_lim - fromspace;
|
||||||
|
/*
|
||||||
|
printf("before: %ld\n", gc->before_collection);
|
||||||
|
*/
|
||||||
gc->after_collection = 0;
|
gc->after_collection = 0;
|
||||||
gc->collection_number += 1;
|
gc->collection_number += 1;
|
||||||
|
|
||||||
|
@ -170,7 +179,7 @@ void *uns_cheney_c89_alloc_record(struct uns_gc *gc, size_t records)
|
||||||
unsigned char *res = alloc(gc, records*sizeof(void *), 1);
|
unsigned char *res = alloc(gc, records*sizeof(void *), 1);
|
||||||
|
|
||||||
for (i = 0; i < records; i++)
|
for (i = 0; i < records; i++)
|
||||||
uns_c89_relo_record_set(res, i, NULL);
|
uns_c89_relo_record_set((void *)res, i, NULL);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,9 @@ COMMON_OBJS=../test_common.o uns_string.o
|
||||||
.SUFFIXES: .test
|
.SUFFIXES: .test
|
||||||
CFLAGS=-Wall -Wno-overlength-strings -std=c89 -Werror -pedantic -fPIC -g -Iinclude
|
CFLAGS=-Wall -Wno-overlength-strings -std=c89 -Werror -pedantic -fPIC -g -Iinclude
|
||||||
|
|
||||||
|
libunsstring.so: uns_string.o
|
||||||
|
$(CC) -shared -I../../include $(CFLAGS) $< -o libunsstring.so
|
||||||
|
|
||||||
test: $(TESTS) $(COMMON_OBJS)
|
test: $(TESTS) $(COMMON_OBJS)
|
||||||
for i in $(TESTS); do \
|
for i in $(TESTS); do \
|
||||||
LD_LIBRARY_PATH=$$(pwd)/../../ valgrind ./$$i || exit 1; \
|
LD_LIBRARY_PATH=$$(pwd)/../../ valgrind ./$$i || exit 1; \
|
||||||
|
|
|
@ -46,7 +46,7 @@ size_t uns_c89_relo_get_record_len(void *p);
|
||||||
|
|
||||||
void *uns_c89_relo_init(void *p, size_t len_size, int is_record);
|
void *uns_c89_relo_init(void *p, size_t len_size, int is_record);
|
||||||
|
|
||||||
void uns_c89_relo_record_set(void *rec, size_t i, void *v);
|
void uns_c89_relo_record_set(Uns_ptr rec, size_t i, void *v);
|
||||||
void *uns_c89_relo_record_get(void *rec, size_t i);
|
void *uns_c89_relo_record_get(Uns_ptr rec, size_t i);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
9
uns.c
9
uns.c
|
@ -15,12 +15,16 @@
|
||||||
* <https://www.gnu.org/licenses/>.
|
* <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
#include "uns.h"
|
#include "uns.h"
|
||||||
|
|
||||||
void uns_root_add(struct uns_gc *gc, struct uns_ctr *root)
|
void uns_root_add(struct uns_gc *gc, struct uns_ctr *root)
|
||||||
{
|
{
|
||||||
root->prev = NULL;
|
root->prev = NULL;
|
||||||
root->next = gc->roots;
|
root->next = gc->roots;
|
||||||
|
|
||||||
|
if (gc->roots)
|
||||||
|
gc->roots->prev = root;
|
||||||
gc->roots = root;
|
gc->roots = root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +37,10 @@ void uns_root_remove(struct uns_gc *gc, struct uns_ctr *root)
|
||||||
root->next->prev = root->prev;
|
root->next->prev = root->prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gc->roots == root)
|
if (gc->roots == root) {
|
||||||
|
assert(!root->prev);
|
||||||
gc->roots = root->next;
|
gc->roots = root->next;
|
||||||
|
}
|
||||||
|
|
||||||
root->prev = root->next = NULL;
|
root->prev = root->next = NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue