kyren / piccolo

An experimental stackless Lua VM implemented in pure Rust

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

question: are async calls into the vm Send?

wez opened this issue · comments

I'm using mlua quite heavily in a couple of applications.
One pain point that I have in one of them is that that futures that result from async calls into the VM are !Send, making it rather awkward to integrate in the regular multi threaded tokio runtime.

Is piccolo different?

Also: one thing I love about mlua is how easy it is to define custom embedded modules and types and map them into lua.
How's that look in piccolo? I'm happy to read code examples, but I didn't spot anything obviously like that on a very very quick glance. Can you point me to stuff to look at?

Thanks! This project sounds very interesting to me!

Just to note, next mlua version will have send feature flag replaced with sync to easily work with multithreaded apps. Under the hood it will use ReentrantMutex to support multi lock within a single thread.

Also: one thing I love about mlua is how easy it is to define custom embedded modules and types and map them into lua.
How's that look in piccolo? I'm happy to read code examples, but I didn't spot anything obviously like that on a very very quick glance. Can you point me to stuff to look at?

There's not much to look at, this project is still in its early stages. Usually most things work but they're not easy. You can check out the util crate and the [Static]UserMethods helpers: https://github.com/kyren/piccolo/blob/master/util/src/user_methods.rs if you want to see an example.

Is piccolo different?

Yes, in piccolo the entire VM isn't even Send, so the question is easier to answer.

Making the VM Send safely involves either something really complicated like kyren/gc-arena#61, which I will probably never do, or something better like https://doc.rust-lang.org/beta/unstable-book/language-features/auto-traits.html which would enable a much cleaner way to do the same thing.

I could take piccolo and do the same thing that mlua does, which is to sort of guard all of the entry points to user defined objects and require that they be Send, therefore being able to soundly assert that the whole VM itself is Send.

However, gc-arena allows deep GC integration from safe Rust, which is the whole big selling point, so I can't universally require Send on custom GC objects without doing so from gc-arena, which is the whole idea behind kyren/gc-arena#61 which is too complicated to do without custom auto traits.

But you the user could do the same assertion yourself, and then unsafely (but soundly, if you don't break the rules) impl Send on something holding a Lua, but the assertion would need to cover any custom GC object you insert into the VM.

This is all irrelevant anyway because piccolo does not provide automatic async integration or return any futures, so you would have to design such a thing first. This is always going to be fundamentally different in piccolo because there are at least two separate ways to integrate async code into piccolo in the first place, depending on whether you want to use Lua coroutines or not.

piccolo does not compete with mlua, or it at least it shouldn't be considered to. piccolo competes with PUC-Rio Lua or Luau, mlua could even wrap piccolo and provide exactly the same API, but it would take away a bunch of the usefulness of piccolo so it's probably not worth it.

If you're looking for something ready to go right now, use mlua. If you want to safely sandbox scripts, use mlua with Luau. If you need to use piccolo, you'll probably already understand why and won't need this explanation.

This issue made me think about it again, and I'm going to look with fresh eyes on a way to make gc-arena conditionally Send in a different way than kyren/gc-arena#61, because being able to make a Lua instance Send without infectious unsafety is also very important to me.

I believe there is now a path forward with gc-arena towards safe "send jails" that can reasonably make the piccolo VM send.

I'm going to close this issue though because the discussion of mlua is unrelated.