Files
wehub-resource-sync 26446540fa
Lint / lint (push) Has been cancelled
CI / MacOS (push) Has been cancelled
CI / Windows (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:36:25 +08:00

198 lines
6.1 KiB
Plaintext

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#import "RPCArgs.h"
#import <Foundation/Foundation.h>
#import "../../../src/support/socket.h"
#import "../../../src/support/utils.h"
#import <string>
using std::string;
const char* kUsage =
"\n"
"iOS tvmrpc application supported flags:\n"
"--host_url The tracker/proxy address, Default=0.0.0.0\n"
"--host_port The tracker/proxy port, Default=9190\n"
"--key The key used to identify the device type in tracker. Default=\"\"\n"
"--custom_addr Custom IP Address to Report to RPC Tracker. Default=\"\"\n"
"--immediate_connect No UI interconnection, connect to tracker immediately. Default=False\n"
"--verbose Allow to print status info to std out. Default=False\n"
"--server_mode Server mode. Can be \"standalone\", \"proxy\" or \"tracker\". "
"Default=standalone \n"
"\n";
struct RPCArgs_cpp {
string host_url = "0.0.0.0";
int host_port = 9190;
string key;
string custom_addr = "null";
bool immediate_connect = false;
bool verbose = false;
RPCServerMode server_mode = RPCServerMode_Tracker;
operator RPCArgs() const {
return RPCArgs{.host_url = host_url.c_str(),
.host_port = host_port,
.key = key.c_str(),
.custom_addr = custom_addr.c_str(),
.verbose = verbose,
.immediate_connect = immediate_connect,
.server_mode = server_mode};
};
RPCArgs_cpp& operator=(const RPCArgs& args) {
host_url = args.host_url;
host_port = args.host_port;
key = args.key;
custom_addr = args.custom_addr;
verbose = args.verbose;
immediate_connect = args.immediate_connect;
server_mode = args.server_mode;
return *this;
}
};
struct RPCArgs_cpp g_rpc_args;
static void restore_from_cache() {
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
auto get_string_from_cache = [defaults](const char* key) {
NSString* ns_key = [NSString stringWithUTF8String:key];
NSString* ns_val = [defaults stringForKey:ns_key];
return std::string(ns_val != nil ? [ns_val UTF8String] : "");
};
auto get_int_from_cache = [defaults](const char* key) {
NSString* ns_key = [NSString stringWithUTF8String:key];
return static_cast<int>([defaults integerForKey:ns_key]);
};
g_rpc_args.host_url = get_string_from_cache("RPCArgs_url");
g_rpc_args.host_port = get_int_from_cache("RPCArgs_port");
g_rpc_args.key = get_string_from_cache("RPCArgs_key");
}
static void update_in_cache() {
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[NSString stringWithUTF8String:g_rpc_args.host_url.c_str()]
forKey:@"RPCArgs_url"];
[defaults setInteger:g_rpc_args.host_port forKey:@"RPCArgs_port"];
[defaults setObject:[NSString stringWithUTF8String:g_rpc_args.key.c_str()] forKey:@"RPCArgs_key"];
}
string GetCmdOption(int argc, char* argv[], string option, bool key = false) {
string cmd;
for (int i = 1; i < argc; ++i) {
string arg = argv[i];
if (arg.find(option) == 0) {
if (key) {
cmd = argv[i];
return cmd;
}
// We assume "=" is the end of option.
TVM_FFI_ICHECK_EQ(*option.rbegin(), '=');
cmd = arg.substr(arg.find('=') + 1);
return cmd;
}
}
return cmd;
}
void update_rpc_args(int argc, char* argv[]) {
restore_from_cache();
RPCArgs_cpp& args = g_rpc_args;
using tvm::support::IsNumber;
using tvm::support::ValidateIP;
constexpr int MAX_PORT_NUM = 65535;
const string immediate_connect = GetCmdOption(argc, argv, "--immediate_connect", true);
args.immediate_connect = !immediate_connect.empty();
const string verbose = GetCmdOption(argc, argv, "--verbose", true);
args.verbose = !verbose.empty();
const string server_mode = GetCmdOption(argc, argv, "--server_mode=", false);
if (!server_mode.empty()) {
if (server_mode == "tracker") {
args.server_mode = RPCServerMode_Tracker;
} else if (server_mode == "proxy") {
args.server_mode = RPCServerMode_Proxy;
} else if (server_mode == "standalone") {
args.server_mode = RPCServerMode_Standalone;
} else {
LOG(WARNING) << "Wrong server_mode value.";
LOG(INFO) << kUsage;
exit(1);
}
}
const string host_url = GetCmdOption(argc, argv, "--host_url=");
if (!host_url.empty()) {
if (!ValidateIP(host_url)) {
LOG(WARNING) << "Wrong tracker address format.";
LOG(INFO) << kUsage;
exit(1);
}
args.host_url = host_url;
}
const string host_port = GetCmdOption(argc, argv, "--host_port=");
if (!host_port.empty()) {
if (!IsNumber(host_port) || stoi(host_port) > MAX_PORT_NUM) {
LOG(WARNING) << "Wrong trackerport number.";
LOG(INFO) << kUsage;
exit(1);
}
args.host_port = stoi(host_port);
}
const string key = GetCmdOption(argc, argv, "--key=");
if (!key.empty()) {
args.key = key;
}
const string custom_addr = GetCmdOption(argc, argv, "--custom_addr=");
if (!custom_addr.empty()) {
if (!ValidateIP(custom_addr)) {
LOG(WARNING) << "Wrong custom address format.";
LOG(INFO) << kUsage;
exit(1);
}
args.custom_addr = '"' + custom_addr + '"';
}
update_in_cache();
}
RPCArgs get_current_rpc_args(void) { return g_rpc_args; }
void set_current_rpc_args(RPCArgs args) {
g_rpc_args = args;
update_in_cache();
}