ewasm / design

Ewasm Design Overview and Specification
Apache License 2.0
1.02k stars 125 forks source link

Shared memory between instances #198

Open axic opened 5 years ago

axic commented 5 years ago

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.

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
poemm commented 5 years ago

Curious, was there a reason for not allowing Ewasm modules to export/import a memory instance between each other? Or modules importing the same memory instance?

Someone may complain about memory copying overhead dominating runtime for some use-cases.