From 699a3c46a9dc3385ec94f7522697831c6ac5d0fc Mon Sep 17 00:00:00 2001 From: Kouya Heika Date: Mon, 20 Apr 2026 19:23:32 -0500 Subject: [PATCH] Improve request handling, use less loops, optimize array pointer allocations --- src/main.h | 74 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 53 insertions(+), 21 deletions(-) diff --git a/src/main.h b/src/main.h index 164928c..c48ef03 100644 --- a/src/main.h +++ b/src/main.h @@ -19,6 +19,8 @@ #define PAGE_ASSET 1 #define PAGE_ERROR 2 +mxml_node_t* doc; + uint8_t running = 0; char* daemon_name = "Stethoscope"; uint16_t listen_port = 7800; @@ -85,7 +87,7 @@ struct XMLServiceRow { static enum MHD_Result http_response(void *cls, struct MHD_Connection *conn, const char* uri, const char* method, const char* version, const char* upload_Data, size_t* upload_data_size, void** req_cls) { const union MHD_ConnectionInfo *info = MHD_get_connection_info(conn, MHD_CONNECTION_INFO_CLIENT_ADDRESS); - const char *client_ip = {}; + const char* client_ip = (char*)malloc(64); uint16_t client_port = 0; if (info != NULL) { const struct sockaddr *addr = info->client_addr; @@ -100,7 +102,7 @@ static enum MHD_Result http_response(void *cls, struct MHD_Connection *conn, con client_ip = inet_ntop(AF_INET6, &addr6->sin6_addr, ip_str, sizeof(ip_str)); client_port = ntohs(addr6->sin6_port); } - } else client_ip = "?.?.?.?"; + } uint16_t response_code = 0; char* page; @@ -145,12 +147,15 @@ static enum MHD_Result http_response(void *cls, struct MHD_Connection *conn, con int row_index = 0; struct XMLServiceRow table_rows[services.size]; - Iterator it = vector_begin(&services); - Iterator end = vector_end(&services); - for (; !iterator_equals(&it, &end); iterator_increment(&it)) { - struct Service* service = *(struct Service**)iterator_get(&it); - mxml_node_t* table = mxmlNewElement(center, "table"); - mxmlElementSetAttr(table, "width", "100%"); + mxml_node_t* table = mxmlNewElement(center, "table"); + mxmlElementSetAttr(table, "width", "100%"); + + mxml_node_t* colgroup = mxmlNewElement(table, "colgroup"); + + Iterator service_it = vector_begin(&services); + Iterator service_end = vector_end(&services); + for (; !iterator_equals(&service_it, &service_end); iterator_increment(&service_it)) { + struct Service* service = *(struct Service**)iterator_get(&service_it); mxml_node_t* header_row = mxmlNewElement(table, "tr"); mxml_node_t* header_cell = mxmlNewElement(table, "th"); mxmlElementSetAttr(header_cell, "align", "left"); @@ -162,38 +167,65 @@ static enum MHD_Result http_response(void *cls, struct MHD_Connection *conn, con row_index++; } + int col_count = 1; + long now = microtime(); + long earliest_time = 0; + Iterator count_it = vector_begin(&status_timeline); + Iterator peroid_end = vector_end(&status_timeline); + for (; !iterator_equals(&count_it, &peroid_end); iterator_increment(&count_it)) { + struct StatusPeroid* peroid = *(struct StatusPeroid**)iterator_get(&count_it); + if (earliest_time == 0) earliest_time = peroid->time; + else if (peroid->time <= (now - 86400000000)) { + earliest_time = peroid->time; + } else col_count++; + } - Iterator pit = vector_begin(&status_timeline); - Iterator pend = vector_end(&status_timeline); - for (; !iterator_equals(&pit, &pend); iterator_increment(&pit)) { - struct StatusPeroid* peroid = *(struct StatusPeroid**)iterator_get(&pit); + long last_time = earliest_time; + long total_time = now - earliest_time; + Iterator peroid_it = vector_begin(&status_timeline); + for (; !iterator_equals(&peroid_it, &peroid_end); iterator_increment(&peroid_it)) { + struct StatusPeroid* peroid = *(struct StatusPeroid**)iterator_get(&peroid_it); + if (peroid->time < earliest_time) continue; + + long duration = peroid->time - last_time; + if (total_time > 0 && duration > 0) { + double col_size = (double)duration / total_time * 100.0L; + char* size_str = (char*)malloc(50); + snprintf(size_str, 50, "%lf%%", col_size); + + mxml_node_t* col = mxmlNewElement(colgroup, "col"); + mxmlElementSetAttr(col, "width", size_str); + last_time = peroid->time; + } Iterator sit = vector_begin(&peroid->server_statuses); Iterator send = vector_end(&peroid->server_statuses); for (; !iterator_equals(&sit, &send); iterator_increment(&sit)) { struct ServerStatus* srvstat = *(struct ServerStatus**)iterator_get(&sit); - struct XMLServiceRow row_struct; + struct XMLServiceRow* row_struct; for (int x = 0; x < services.size; x++) if (table_rows[x].service == srvstat->service) { - row_struct = table_rows[x]; + row_struct = &table_rows[x]; break; } - mxml_node_t* cell = mxmlNewElement(row_struct.row, "td"); - mxmlElementSetAttr(cell, "_status", state_text(srvstat->state)); - char* ping_str = (char*)malloc(16); - snprintf(ping_str, 16, "%f ms", srvstat->ping); - mxmlElementSetAttr(cell, "_ping", ping_str); + if (row_struct->service != 0) { + mxml_node_t* cell = mxmlNewElement(row_struct->row, "td"); + mxmlElementSetAttr(cell, "_status", state_text(srvstat->state)); + char* ping_str = (char*)malloc(50); + snprintf(ping_str, 50, "%f ms", srvstat->ping); + mxmlElementSetAttr(cell, "_ping", ping_str); + } } } response_code = 200; } else { mxml_node_t* error_header = mxmlNewElement(center, "h1"); - char* err_str = (char*)malloc(5); - snprintf(err_str, 5, "%i", response_code); + char err_str[5]; + snprintf(err_str, sizeof(err_str)-1, "%i", response_code); mxmlNewText(error_header, 0, err_str); }