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

Changes to cpp_rpc to make it work on Android (+ Hexagon offloading) #5535

Merged
merged 2 commits into from
May 8, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions apps/cpp_rpc/rpc_env.cc
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,17 @@ namespace {
namespace tvm {
namespace runtime {
RPCEnv::RPCEnv() {
#ifndef _WIN32
char cwd[PATH_MAX];
if (char *rc = getcwd(cwd, sizeof(cwd))) {
base_ = std::string(cwd) + "/rpc";
} else {
base_ = "./rpc";
}
Comment on lines +71 to +76
Copy link
Member

Choose a reason for hiding this comment

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

This will break on Windows platform. Windows doesn't have PATH_MAX (is 4096) but has MAX_PATH (is 260). Please guard it on different macro. Or you could define one common length instead of using PATH_MAX. cc @jmorrill

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I don't have a convenient way of testing it on Windows right now, so I'm just going to #ifdef it.

Copy link
Member

Choose a reason for hiding this comment

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

Ok. Could you triger CI again? The error shouldn’t be related with your change.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done.

#else
base_ = "./rpc";
#endif

mkdir(base_.c_str(), 0777);
TVM_REGISTER_GLOBAL("tvm.rpc.server.workpath").set_body([](TVMArgs args, TVMRetValue* rv) {
static RPCEnv env;
Expand Down
34 changes: 30 additions & 4 deletions apps/cpp_rpc/rpc_server.cc
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,22 @@ static pid_t waitPidEintr(int* status) {
}
#endif

#ifdef __ANDROID__
static std::string getNextString(std::stringstream* iss) {
std::string str = iss->str();
size_t start = iss->tellg();
size_t len = str.size();
// Skip leading spaces.
while (start < len && isspace(str[start])) start++;

size_t end = start;
while (end < len && !isspace(str[end])) end++;

iss->seekg(end);
return str.substr(start, end-start);
}
#endif

/*!
* \brief RPCServer RPC Server class.
* \param host The hostname of the server, Default=0.0.0.0
Expand Down Expand Up @@ -164,9 +180,9 @@ class RPCServer {
int status = 0;
const pid_t finished_first = waitPidEintr(&status);
if (finished_first == timer_pid) {
kill(worker_pid, SIGKILL);
kill(worker_pid, SIGTERM);
} else if (finished_first == worker_pid) {
kill(timer_pid, SIGKILL);
kill(timer_pid, SIGTERM);
} else {
LOG(INFO) << "Child pid=" << finished_first << " unexpected, but still continue.";
}
Expand Down Expand Up @@ -260,7 +276,12 @@ class RPCServer {

std::stringstream ssin(remote_key);
std::string arg0;
#ifndef __ANDROID__
ssin >> arg0;
#else
arg0 = getNextString(&ssin);
#endif

if (arg0 != expect_header) {
code = kRPCMismatch;
CHECK_EQ(conn.SendAll(&code, sizeof(code)), sizeof(code));
Expand All @@ -274,7 +295,11 @@ class RPCServer {
CHECK_EQ(conn.SendAll(&keylen, sizeof(keylen)), sizeof(keylen));
CHECK_EQ(conn.SendAll(server_key.c_str(), keylen), keylen);
LOG(INFO) << "Connection success " << addr->AsString();
#ifndef __ANDROID__
ssin >> *opts;
#else
*opts = getNextString(&ssin);
#endif
*conn_sock = conn;
return;
}
Expand All @@ -301,8 +326,9 @@ class RPCServer {
int GetTimeOutFromOpts(const std::string& opts) const {
const std::string option = "-timeout=";

if (opts.find(option) == 0) {
const std::string cmd = opts.substr(opts.find_last_of(option) + 1);
size_t pos = opts.rfind(option);
if (pos != std::string::npos) {
const std::string cmd = opts.substr(pos + option.size());
CHECK(support::IsNumber(cmd)) << "Timeout is not valid";
return std::stoi(cmd);
}
Expand Down