More work on removing old determinism-in-driver code

This commit is contained in:
2022-02-21 20:23:01 -05:00
parent 19b6951e0f
commit 6a9bf4ca42
5 changed files with 72 additions and 70 deletions

View File

@@ -1,4 +1,10 @@
#define CHBUF_SIZE (256*1024)
#define POLLVEC_SIZE (DrivenEngine::MAX_CHAN+1)
static std::unique_ptr<char[]> chbuf;
static std::unique_ptr<struct pollfd[]> pollvec;
static MonoClock monoclock;
namespace util {
@@ -19,13 +25,41 @@ static void initialize_engine() {
DrivenEngine::register_maker("unittest", make_RunUnitTests);
}
static void if_error_print_and_exit(const UmmString &str) {
static void allocate_buffers() {
chbuf.reset(new char[CHBUF_SIZE]);
pollvec.reset(new struct pollfd[POLLVEC_SIZE]);
}
static void if_error_print_and_exit(const std::string &str) {
if (!str.empty()) {
std::cerr << std::endl << "error: " << str << std::endl;
exit(1);
}
}
static std::string_view read_file(const char *fn, char *buf, int bufsize, std::string &err) {
FILE *f = fopen(fn, "r");
if (f == 0) {
err = std::string("cannot read file") + fn;
buf[0] = 0;
return std::string_view(buf, 0);
}
int nread = fread(buf, 1, bufsize, f);
if (nread < 0) {
err = std::string("cannot read file: ") + fn;
buf[0] = 0;
return std::string_view(buf, 0);
}
if (nread == bufsize) {
err = std::string("file too large: ") + fn;
buf[0] = 0;
return std::string_view(buf, 0);
}
err = "";
return std::string_view(buf, nread);
}
static SSL_CTX *new_ssl_context(bool server_cert, bool root_certs, std::string_view require_cert) {
SSL_CTX *ctx = SSL_CTX_new(TLS_method());
SSL_CTX_set_mode(ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
@@ -40,12 +74,12 @@ static SSL_CTX *new_ssl_context(bool server_cert, bool root_certs, std::string_v
return ctx;
}
static UmmString err_print_errors_str() {
static std::string err_print_errors_str() {
BIO *bio = BIO_new(BIO_s_mem());
ERR_print_errors(bio);
char *buf;
size_t len = BIO_get_mem_data(bio, &buf);
UmmString ret(buf, len);
std::string ret(buf, len);
BIO_free(bio);
return ret;
}
@@ -99,8 +133,8 @@ public:
};
DrivenEngine *driven_;
UmmVector<ChanInfo> chans_;
UmmMap<int, SOCKET> listen_sockets_;
std::vector<ChanInfo> chans_;
std::map<int, SOCKET> listen_sockets_;
bool read_console_recently_;
SSL_CTX *ssl_ctx_with_root_certs_;
@@ -112,7 +146,7 @@ public:
const std::vector<int> &listenports = driven_->drv_get_listen_ports();
for (int port : listenports) {
if (listen_sockets_.find(port) == listen_sockets_.end()) {
UmmString err;
std::string err;
SOCKET sock = listen_on_port(port, err);
if_error_print_and_exit(err);
assert(sock != INVALID_SOCKET);
@@ -123,13 +157,13 @@ public:
void handle_lua_source() {
if (driven_->drv_get_rescan_lua_source()) {
UmmString err;
std::string err;
std::string_view ctrl = read_file("lua/control.lst", chbuf.get(), CHBUF_SIZE, err);
if_error_print_and_exit(err);
UmmStringVec names = drv::parse_control_lst(ctrl);
std::vector<std::string> names = drv::parse_control_lst(ctrl);
driven_->drv_clear_lua_source();
for (const UmmString &str : names) {
UmmString lfn = UmmString("lua/") + str;
for (const std::string &str : names) {
std::string lfn = std::string("lua/") + str;
std::string_view data = read_file(lfn.c_str(), chbuf.get(), CHBUF_SIZE, err);
if_error_print_and_exit(err);
driven_->drv_add_lua_source(str, data);
@@ -221,7 +255,7 @@ public:
void handle_new_outgoing_sockets() {
const std::vector<int> &chans = driven_->drv_get_new_outgoing();
for (int chid : chans) {
UmmString err;
std::string err;
SOCKET sock = open_connection(driven_->drv_get_target(chid), err);
if (sock == INVALID_SOCKET) {
driven_->drv_notify_close(chid, err);
@@ -236,7 +270,7 @@ public:
}
void accept_connection(int port, SOCKET sock) {
UmmString err;
std::string err;
SOCKET socket = accept_on_socket(sock, err);
if_error_print_and_exit(err);
if (socket != INVALID_SOCKET) {
@@ -247,7 +281,7 @@ public:
}
void advance_plaintext(ChanInfo &chan) {
UmmString err;
std::string err;
// If the channel has no outgoing bytes and has been released,
// just close it.
@@ -384,7 +418,7 @@ public:
void handle_socket_input_output() {
UmmString err;
std::string err;
int mstimeout = read_console_recently_ ? 100 : 1000;
// Peek output buffers and determine channel release flags.