diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2024-08-30 19:20:21 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2024-08-30 19:20:21 +0300 |
| commit | 314bca3dc19a864c76153bfcd5a58be8c40000f9 (patch) | |
| tree | 9aba30284fce66e149a7472adea1cb4037e49463 /tests/dangling_shmem/init.c | |
| parent | 1a2e1fff7ce4b8fd8db46549d81e71e76b842da3 (diff) | |
| download | kmi-314bca3dc19a864c76153bfcd5a58be8c40000f9.tar.gz kmi-314bca3dc19a864c76153bfcd5a58be8c40000f9.zip | |
improvements to shared memory handling
+ Now each shared region is reference counter (technically each region
is refernce counted, private regions just have a count of 1).
Also, syscalls that touch the TLB get flushed, but should probably
look into where else this flushing might be needed.
Diffstat (limited to 'tests/dangling_shmem/init.c')
| -rw-r--r-- | tests/dangling_shmem/init.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/tests/dangling_shmem/init.c b/tests/dangling_shmem/init.c new file mode 100644 index 0000000..df211a7 --- /dev/null +++ b/tests/dangling_shmem/init.c @@ -0,0 +1,50 @@ +#include <common/test.h> + +static id_t new_id = 0; +static char *refmem = NULL; + +START(pid, tid, d0, d1, d2, d3) +{ + UNUSED(pid); + UNUSED(tid); + UNUSED(d0); + UNUSED(d1); + UNUSED(d2); + UNUSED(d3); + + if (pid == 0 && d0 == SYS_USER_SPAWNED) { + printf("forking\n"); + id_t our_id = 0; + new_id = sys_fork(&our_id); + if (new_id == 0) { + printf("in child, setting up shared memory\n"); + void *p = sys_req_sharedmem(1, VM_R | VM_W); + check(p, "failed getting shared memory\n"); + + printf("referencing shared memory for pid 1\n"); + void *r = sys_ref_sharedmem(1, (uintptr_t)p, VM_R | VM_W); + check(r, "failed referencing shared memory\n"); + + sys_ipc_req1(1, (uintptr_t)r); + sys_exit(1); + } + + printf("swapping to child\n"); + enum sys_status r = sys_swap(new_id); + check(r == OK, "failed swapping to child\n"); + + printf("returned from child\n"); + /* child should now be dead */ + check(refmem[0] == 'p', "child dying affected our shared memory?\n"); + + printf("freeing shared memory\n"); + r = sys_free_mem((uintptr_t)refmem); + check(r == OK, "failed freeing referenced memory\n"); + } + else if (pid == new_id) { + refmem = (char *)d0; + refmem[0] = 'p'; + sys_ipc_resp0(); + } + ok(); +} |
