Pretend to run the emulator
This commit is contained in:
parent
e5932da1e5
commit
6ed78636a5
|
@ -22,6 +22,7 @@ typedef enum rdb_read_state_t {
|
|||
|
||||
typedef struct RdbRequest {
|
||||
int connfd;
|
||||
bool blocking;
|
||||
struct Buffer {
|
||||
char buf[INBUF_LEN];
|
||||
size_t len;
|
||||
|
@ -36,6 +37,7 @@ typedef struct RdbRequest {
|
|||
|
||||
void rdb_request_init(RdbRequest *req, int connfd, char *cmd, size_t cmdlen);
|
||||
void rdb_request_reset(RdbRequest *req);
|
||||
void rdb_request_set_blocking(RdbRequest *req, bool blocking);
|
||||
rdb_read_result_t rdb_request_read(RdbRequest *req, size_t *len);
|
||||
|
||||
#endif
|
14
main.c
14
main.c
|
@ -78,10 +78,11 @@ const uint32_t SYSTEM_REGISTERS[] = {
|
|||
|
||||
const uint32_t PC_INDEX = 32 + 13;
|
||||
|
||||
int handle_command(RdbClient *client, CommandBuf *cmd, VB *sim) {
|
||||
int handle_command(RdbClient *client, CommandBuf *cmd, VB *sim, bool *running) {
|
||||
rdb_client_begin_packet(client);
|
||||
|
||||
if (cmd_match_only_str(cmd, "\x03")) {
|
||||
*running = false;
|
||||
rdb_client_write_str(client, "T05thread:p1.t1;threads:p1.t1");
|
||||
return rdb_client_send_packet(client);
|
||||
}
|
||||
|
@ -183,6 +184,7 @@ int handle_command(RdbClient *client, CommandBuf *cmd, VB *sim) {
|
|||
}
|
||||
if (cmd_match_only_str(cmd, "c")) {
|
||||
printf("running until we hit a breakpoint or the server stops us\n");
|
||||
*running = true;
|
||||
return 0;
|
||||
}
|
||||
if (cmd_match_only_str(cmd, "?")) {
|
||||
|
@ -224,6 +226,8 @@ int server(int connfd, VB *sim) {
|
|||
rdb_request_init(&req, connfd, buf, BUFLEN);
|
||||
rdb_client_init(&client, connfd);
|
||||
|
||||
bool running = false;
|
||||
|
||||
while (1) {
|
||||
rdb_read_result_t result = rdb_request_read(&req, &len);
|
||||
if (result == read_result_error) {
|
||||
|
@ -232,7 +236,10 @@ int server(int connfd, VB *sim) {
|
|||
printf("client has disconnected\n");
|
||||
return 0;
|
||||
} else if (result == read_result_pending) {
|
||||
// TODO: should run the emulator while we wait
|
||||
if (running) {
|
||||
printf("pretend the emulator is running now\n");
|
||||
sleep(1);
|
||||
}
|
||||
continue;
|
||||
} else {
|
||||
printf("received command \"%.*s\"\n", (int) len, buf);
|
||||
|
@ -240,10 +247,11 @@ int server(int connfd, VB *sim) {
|
|||
CommandBuf cmd;
|
||||
cmd.buf = buf;
|
||||
cmd.len = len;
|
||||
int res = handle_command(&client, &cmd, sim);
|
||||
int res = handle_command(&client, &cmd, sim, &running);
|
||||
if (res != 0) {
|
||||
return res;
|
||||
}
|
||||
rdb_request_set_blocking(&req, !running);
|
||||
rdb_request_reset(&req);
|
||||
}
|
||||
|
||||
|
|
11
request.c
11
request.c
|
@ -2,12 +2,14 @@
|
|||
#include <hex.h>
|
||||
#include <request.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
|
||||
void rdb_request_init(RdbRequest *req, int connfd, char *cmd, size_t cmdlen) {
|
||||
req->connfd = connfd;
|
||||
req->cmd = cmd;
|
||||
req->cmdlen = cmdlen;
|
||||
req->blocking = true;
|
||||
rdb_request_reset(req);
|
||||
}
|
||||
|
||||
|
@ -19,14 +21,19 @@ void rdb_request_reset(RdbRequest *req) {
|
|||
req->chk = 0;
|
||||
}
|
||||
|
||||
void rdb_request_set_blocking(RdbRequest *req, bool blocking) {
|
||||
req->blocking = blocking;
|
||||
}
|
||||
|
||||
static rdb_read_result_t read_char(RdbRequest *req, char *in) {
|
||||
if (req->inbuf.index >= req->inbuf.len) {
|
||||
ssize_t inlen = read(req->connfd, req->inbuf.buf, INBUF_LEN);
|
||||
int flags = req->blocking ? 0 : MSG_DONTWAIT;
|
||||
ssize_t inlen = recv(req->connfd, req->inbuf.buf, INBUF_LEN, flags);
|
||||
if (inlen == 0) {
|
||||
return read_result_disconnected;
|
||||
}
|
||||
if (inlen < 0) {
|
||||
if (errno == EAGAIN) {
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||
return read_result_pending;
|
||||
} else {
|
||||
perror("could not read incoming packet");
|
||||
|
|
Loading…
Reference in New Issue