-
Notifications
You must be signed in to change notification settings - Fork 127
Open
Description
This is related to #17 and #188 / #181 to some extent.
If doing runtime linking, where libraries are spawned as separate instances with their own memory, there is a problem passing data between these instances. The "Wasm threads" proposal (here) contains support for shared memory segments, but finalisation of that is still quite far out in the future.
A simplistic API and approach is presented here, modelled after POSIX's shm subsystem.
shmemCreate(id: u64, size: u32, ptr: u32, len: u32)- creates a shared memory buffer withsizeand loads the initial value fromptr ... ptr+len(lencan be zero and in that case noptrcan also be "invalid")shmemAttach(id: u64, ptr: u32, len: u32)- attaches a shared memory buffer and loads the current value to the memory area pointed byptrshmemDetach(ptr: u32)- detaches the local memory area from any updatesshmemSize(id: u64)- returns the size of the shared memory
Since no parallel execution exists in "ewasm", whenever a linked module is called, the caller has stopped executing. When a callee is finished, the shared memory areas used are updated prior to returning execution to the caller.
As an example:
currently executing test.wasm:
...
// load memory at 0x1000 with 256 bytes of data
shmemCreate(1, 256, 0x1000, 256)
// call `keccak256` in a "linked module"
keccak256()
currently executing keccak256.wasm:
shmemAttach(1, 0x20, 256)
// do the hashing here and eventually copy the result into 0x20 .. 0x20+32
currently executing test.wasm:
// the memory area 0x1000 .. 0x1000+32 should contain the hash result
Metadata
Metadata
Assignees
Labels
No labels