Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP Cross-platform support. #1

Closed
wants to merge 20 commits into from

Conversation

kitlith
Copy link

@kitlith kitlith commented Jul 17, 2019

To achieve feature parity with existing implementation, we still need to implement Process::with_name. Either we need to bring in a crate that can do cross-platform process listing, or implement it ourselves with the platform specific APIs.

Process::path is also unimplemented, but I notice that it's currently unused, so I'm not sure how necessary it is.

EDIT: These have now been reimplemented.

I should note that I have only compiled this, I have not tried to run/test this.

I'd also like to comment that some modules are loaded/unloaded dynamically, so we may want to query them on-request, instead of querying them once when we start working with the program.

@kitlith
Copy link
Author

kitlith commented Jul 17, 2019

As an alternative to sysinfo, there is also https://crates.io/crates/proclist which has a narrower set of functionality, but seems to be less used/supported.

@CryZe
Copy link
Owner

CryZe commented Jul 17, 2019

That looks really good from a first glance. 👍 I'll take a deeper look later today.

Copy link
Author

@kitlith kitlith left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

doing a quick review before I sleep, noting anything that I touched that may need improvements. cya in the morning.

}
pid: Pid,
handle: ProcessHandle,
modules: HashMap<String, Address>
Copy link
Author

@kitlith kitlith Jul 17, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Out of these, pid is the only necessary variable. We probably shouldn't assume that modules never changes, and handle (on some platforms) is literally the same as pid. We may want to consider making pid be the base type and creating an extension trait.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here are my thoughts on what we can do with modules:

  • Keep it as-is: we won't be able to detect plugins loading/unloading.
  • Re-parse every time: could be a bit slow
    • re-parse in Process::module_address(): we'll recompute in a loop...
    • re-parse in a new Process::modules(), move logic of module_address into runtime: better, but we're still gonna be calling this many times per second.
  • Caching? parse once at creation, re-parse if Error::ModuleDoesntExist or if a read based off of a module fails?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently, this is setup with Process::modules.

@@ -519,7 +519,7 @@ fn read_into_buf(ctx: &mut Ctx, address: u64, buf: u32, buf_len: u32) {
let buf = &memory[buf..buf + buf_len];
if let Some(process) = &env.process {
let mut byte_buf = vec![0; buf.len()];
process.read_buf(address, &mut byte_buf).unwrap();
process.read_buf(address as usize, &mut byte_buf).unwrap();
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: may want to use TryInto here

crates/livesplit-auto-splitting/src/process.rs Outdated Show resolved Hide resolved
crates/livesplit-auto-splitting/src/process.rs Outdated Show resolved Hide resolved
.or(Err(Error::ProcessDoesntExist))?
.into_iter()
.filter(|range| range.filename().is_some())
.map(|range| (range.filename().clone().unwrap(), range.start()))
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assuming the module string we're testing against is just supposed to be the filename without the path (e.g., "hl2.exe") we should fix this so that only the filename is returned here, not the whole path.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should this also be without the extension? e.g. "hl2" instead of "hl2.exe"?

@kitlith
Copy link
Author

kitlith commented Jul 23, 2019

BTW, wasmer apparently already has WASI support: so you shouldn't need to implement the WASI api yourself... i think.

@CryZe
Copy link
Owner

CryZe commented Jul 23, 2019

Yeah we really shouldn't be implementing it ourselves, BUT for that we need theirs to fit our use case. And that is really tight control over what the auto splitter is allowed to do and how it does so. So all the printing for example goes straight to our log instead of to the actual terminal, only certain files can be read, none can be written to by default, and so on. So unless theirs is really customizable (and I think back then when I checked it wasn't), we may need to have our own implementation where we have full control over what we allow.

@kitlith
Copy link
Author

kitlith commented Jul 23, 2019

So, it's partially customizable. You can specify folders and such it has access to... which passes through libpreopen, which I saw you were having issues with elsewhere. We also don't have access to the internals to do stuff like manually add a file descriptor to the internal table and then pass it to our code...

I'd probably start by forking wasmer-wasi and increasing our access to the internals so we can at least perform workarounds like the above. We should probably also open a discussion with the people behind wasmer for creating an api that we can work with to accomplish what we need.

In the meantime though: is this good to be merged into your development branch? We can continue with additional PRs.

The auto splitter runtime will now gracefully shut down the auto
splitters if they fail to execute instead of panicking like it did
before. Also all the message are now reported using the log crate
instead of being printed.
I don't see any reason to introduce lambdas when not necessary.
 - Process::modules, dynamically get modules.
 - Port commented stuff to work with the wasmer stuff.
 - Others?
Not sure what's up with the windows CI failures, time to muck with
different versions of wasmer-runtime i guess.
0.5.7 -> 0.13.1
@kitlith
Copy link
Author

kitlith commented May 1, 2020

Closing in favor of #2

@kitlith kitlith closed this May 1, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants