areusch commented on a change in pull request #7876:
URL: https://github.com/apache/tvm/pull/7876#discussion_r663192607
##########
File path: apps/ios_rpc/tvmrpc/ViewController.mm
##########
@@ -22,168 +22,144 @@
*/
#import "ViewController.h"
-#include <string>
+#import "RPCArgs.h"
-@implementation ViewController
-
-- (void)stream:(NSStream*)strm handleEvent:(NSStreamEvent)event {
- std::string buffer;
- switch (event) {
- case NSStreamEventOpenCompleted: {
- self.statusLabel.text = @"Connected";
- break;
- }
- case NSStreamEventHasBytesAvailable:
- if (strm == inputStream_) {
- [self onReadAvailable];
- }
- break;
- case NSStreamEventHasSpaceAvailable: {
- if (strm == outputStream_) {
- [self onWriteAvailable];
- }
- break;
- }
- case NSStreamEventErrorOccurred: {
- NSLog(@"%@", [strm streamError].localizedDescription);
- break;
- }
- case NSStreamEventEndEncountered: {
- [self close];
- // auto reconnect when normal end.
- [self open];
- break;
- }
- default: {
- NSLog(@"Unknown event");
- }
- }
+@implementation ViewController {
+ // server implementation
+ RPCServer* server_;
+ // verbose flag to print status info
+ bool verbose_;
+ // Button state. True - push will start connection, false - push will
disconnect
+ bool to_connect_;
}
-- (void)onReadAvailable {
- constexpr int kRPCMagic = 0xff271;
- if (!initialized_) {
- int code;
- size_t nbytes = [inputStream_ read:reinterpret_cast<uint8_t*>(&code)
maxLength:sizeof(code)];
- if (nbytes != sizeof(code)) {
- self.infoText.text = @"Fail to receive remote confirmation code.";
- [self close];
- } else if (code == kRPCMagic + 2) {
- self.infoText.text = @"Proxy server cannot find client that matches the
key";
- [self close];
- } else if (code == kRPCMagic + 1) {
- self.infoText.text = @"Proxy server already have another server with
same key";
- [self close];
- } else if (code != kRPCMagic) {
- self.infoText.text = @"Given address is not a TVM RPC Proxy";
- [self close];
- } else {
- initialized_ = true;
- self.statusLabel.text = @"Proxy connected.";
- ICHECK(handler_ != nullptr);
- }
- }
- const int kBufferSize = 4 << 10;
- if (initialized_) {
- while ([inputStream_ hasBytesAvailable]) {
- recvBuffer_.resize(kBufferSize);
- uint8_t* bptr = reinterpret_cast<uint8_t*>(&recvBuffer_[0]);
- size_t nbytes = [inputStream_ read:bptr maxLength:kBufferSize];
- recvBuffer_.resize(nbytes);
- int flag = 1;
- if ([outputStream_ hasSpaceAvailable]) {
- flag |= 2;
- }
- // always try to write
- try {
- flag = handler_(recvBuffer_, flag);
- if (flag == 2) {
- [self onShutdownReceived];
- }
- } catch (const tvm::Error& e) {
- [self close];
- }
- }
+- (void)viewDidLoad {
+ // To handle end editing events
+ self.proxyURL.delegate = self;
+ self.proxyPort.delegate = self;
+ self.proxyKey.delegate = self;
+
+ RPCArgs args = get_current_rpc_args();
+ self.proxyURL.text = @(args.host_url);
+ self.proxyPort.text = @(args.host_port).stringValue;
+ self.proxyKey.text = @(args.key);
+
+ self.ModeSelector.selectedSegmentIndex = args.server_mode;
+ self->verbose_ = args.verbose;
+ self->to_connect_ = true;
+
+ // Add border to button
+ void (^addBorder)(UIButton* btn) = ^(UIButton* btn) {
+ btn.layer.borderWidth = 2.0f;
+ btn.layer.borderColor = self.ConnectButton.currentTitleColor.CGColor;
+ btn.layer.cornerRadius = 10;
+ };
+ addBorder(self.ConnectButton);
+
+ // Connect to tracker immediately
+ if (args.immediate_connect) {
+ [self disableUIInteraction];
+ [self open];
}
}
-- (void)onShutdownReceived {
- [self close];
-}
+/*!
+ * \brief Disable all UI elements
+ */
+- (void)disableUIInteraction {
+ void (^disable)(UITextField* field) = ^(UITextField* field) {
+ field.enabled = NO;
+ field.backgroundColor = [UIColor lightGrayColor];
+ };
-- (void)onWriteAvailable {
- if (initSendPtr_ < initBytes_.length()) {
- initSendPtr_ += [outputStream_
write:reinterpret_cast<uint8_t*>(&initBytes_[initSendPtr_])
- maxLength:(initBytes_.length() - initSendPtr_)];
- }
- if (initialized_) {
- try {
- std::string dummy;
- int flag = handler_(dummy, 2);
- if (flag == 2) {
- [self onShutdownReceived];
- }
- } catch (const tvm::Error& e) {
- [self close];
- }
- }
+ void (^disableButton)(UIButton* btn) = ^(UIButton* btn) {
+ btn.enabled = NO;
+ btn.layer.borderColor = btn.currentTitleColor.CGColor;
+ };
+
+ disable(self.proxyURL);
+ disable(self.proxyPort);
+ disable(self.proxyKey);
+ disableButton(self.ConnectButton);
+ self.ModeSelector.enabled = NO;
}
+/*!
+ * \brief Start RPC server
+ */
- (void)open {
- constexpr int kRPCMagic = 0xff271;
- NSLog(@"Connecting to the proxy server..");
- // Initialize the data states.
- key_ = [self.proxyKey.text UTF8String];
- key_ = "server:" + key_;
- std::ostringstream os;
- int rpc_magic = kRPCMagic;
- os.write(reinterpret_cast<char*>(&rpc_magic), sizeof(rpc_magic));
- int keylen = static_cast<int>(key_.length());
- os.write(reinterpret_cast<char*>(&keylen), sizeof(keylen));
- os.write(key_.c_str(), key_.length());
- initialized_ = false;
- initBytes_ = os.str();
- initSendPtr_ = 0;
- // Initialize the network.
- CFReadStreamRef readStream;
- CFWriteStreamRef writeStream;
- CFStreamCreatePairWithSocketToHost(NULL, (__bridge
CFStringRef)self.proxyURL.text,
- [self.proxyPort.text intValue],
&readStream, &writeStream);
- inputStream_ = (NSInputStream*)readStream;
- outputStream_ = (NSOutputStream*)writeStream;
- [inputStream_ setDelegate:self];
- [outputStream_ setDelegate:self];
- [inputStream_ scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
- [outputStream_ scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
- [outputStream_ open];
- [inputStream_ open];
- handler_ = tvm::runtime::CreateServerEventHandler(outputStream_, key_,
"%toinit");
- ICHECK(handler_ != nullptr);
+ RPCServerMode server_mode =
static_cast<RPCServerMode>(self.ModeSelector.selectedSegmentIndex);
+
+ server_ = [RPCServer serverWithMode:server_mode];
+ server_.host = self.proxyURL.text;
+ server_.port = self.proxyPort.text.intValue;
+ server_.key = self.proxyKey.text;
+ server_.verbose = self->verbose_;
+ server_.delegate = self;
+
+ [server_ start];
+
self.infoText.text = @"";
self.statusLabel.text = @"Connecting...";
}
+/*!
+ * \brief Stop RPC server
+ */
- (void)close {
- NSLog(@"Closing the streams.");
- [inputStream_ close];
- [outputStream_ close];
- [inputStream_ removeFromRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
- [outputStream_ removeFromRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
- [inputStream_ setDelegate:nil];
- [outputStream_ setDelegate:nil];
- inputStream_ = nil;
- outputStream_ = nil;
- handler_ = nullptr;
- self.statusLabel.text = @"Disconnected";
+ [server_ stop];
+ self.statusLabel.text = @"Disconnecting...";
Review comment:
ah understood, i thought i was sync
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]