1
0
Fork 0
mirror of https://github.com/zigzap/zap.git synced 2025-10-21 07:34:08 +00:00

Endpoint example: /stop endpoint & leak detection

This commit is contained in:
Rene Schallner 2023-07-03 15:54:26 +02:00
parent b4a23e1000
commit 28b90c7b00
2 changed files with 74 additions and 34 deletions

View file

@ -1,6 +1,7 @@
const std = @import("std"); const std = @import("std");
const zap = @import("zap"); const zap = @import("zap");
const Endpoint = @import("endpoint.zig"); const Endpoint = @import("endpoint.zig");
const StopEndpoint = @import("stopendpoint.zig");
// this is just to demo that we can catch arbitrary slugs // this is just to demo that we can catch arbitrary slugs
fn on_request(r: zap.SimpleRequest) void { fn on_request(r: zap.SimpleRequest) void {
@ -17,6 +18,8 @@ pub fn main() !void {
}){}; }){};
var allocator = gpa.allocator(); var allocator = gpa.allocator();
// we scope everything that can allocate within this block for leak detection
{
// setup listener // setup listener
var listener = zap.SimpleEndpointListener.init( var listener = zap.SimpleEndpointListener.init(
allocator, allocator,
@ -34,8 +37,11 @@ pub fn main() !void {
var endpoint = Endpoint.init(allocator, "/users"); var endpoint = Endpoint.init(allocator, "/users");
defer endpoint.deinit(); defer endpoint.deinit();
var stopEp = StopEndpoint.init("/stop");
// add endpoint // add endpoint
try listener.addEndpoint(endpoint.getUserEndpoint()); try listener.addEndpoint(endpoint.getUserEndpoint());
try listener.addEndpoint(stopEp.getEndpoint());
// fake some users // fake some users
var uid: usize = undefined; var uid: usize = undefined;
@ -58,3 +64,8 @@ pub fn main() !void {
.workers = 1, .workers = 1,
}); });
} }
// show potential memory leaks when ZAP is shut down
const has_leaked = gpa.detectLeaks();
std.log.debug("Has leaked: {}\n", .{has_leaked});
}

View file

@ -0,0 +1,29 @@
const std = @import("std");
const zap = @import("zap");
/// A simple endpoint listening on the /stop route that shuts down zap
/// the main thread usually continues at the instructions after the call to zap.start().
pub const Self = @This();
endpoint: zap.SimpleEndpoint = undefined,
pub fn init(
path: []const u8,
) Self {
return .{
.endpoint = zap.SimpleEndpoint.init(.{
.path = path,
.get = get,
}),
};
}
pub fn getEndpoint(self: *Self) *zap.SimpleEndpoint {
return &self.endpoint;
}
fn get(e: *zap.SimpleEndpoint, r: zap.SimpleRequest) void {
_ = e;
_ = r;
zap.stop();
}