Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Windows Backend (IOCP) #42

Merged
merged 5 commits into from
Sep 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 28 additions & 7 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,16 @@ jobs:
x86_64-linux-musl,
aarch64-macos,
x86_64-macos,
wasm32-wasi
wasm32-wasi,
x86_64-windows-gnu

# Broken but not in any obvious way:
# x86-linux-gnu,
# x86-linux-musl,

# Not yet supported:
# i386-windows,
# x86_64-windows-gnu,
# x86-windows,
]
runs-on: ${{ matrix.os }}
needs: test
needs: [test-x86_64-linux, test-x86_64-windows]
steps:
- name: Checkout code
uses: actions/checkout@v3
Expand All @@ -45,7 +43,7 @@ jobs:
- name: test
run: nix develop -c zig build --summary all -Dtarget=${{ matrix.target }}

test:
test-x86_64-linux:
strategy:
matrix:
os: [ubuntu-latest]
Expand Down Expand Up @@ -77,3 +75,26 @@ jobs:

# Run a full build to ensure that works
- run: nix build

test-x86_64-windows:
strategy:
matrix:
os: [windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0

- name: Install zig
uses: goto-bus-stop/setup-zig@v2
with:
version: 0.12.0-dev.256+8b74eae9c

- name: test
run: zig build test --summary all

- name: build all benchmarks and examples
run: zig build -Dexample -Dbench --summary all
16 changes: 11 additions & 5 deletions build.zig
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,16 @@ pub fn build(b: *std.Build) !void {
.target = target,
.optimize = optimize,
});
b.installArtifact(static_lib);

static_lib.linkLibC();

// Link required libraries if targeting Windows
if (target.getOsTag() == .windows) {
static_lib.linkSystemLibrary("ws2_32");
static_lib.linkSystemLibrary("mswsock");
}

b.installArtifact(static_lib);
b.default_step.dependOn(&static_lib.step);

const static_binding_test = b.addExecutable(.{
Expand All @@ -107,10 +115,7 @@ pub fn build(b: *std.Build) !void {
// Dynamic C lib. We only build this if this is the native target so we
// can link to libxml2 on our native system.
if (target.isNative()) {
const dynamic_lib_name = if (target.isWindows())
"xev.dll"
else
"xev";
const dynamic_lib_name = "xev";

const dynamic_lib = b.addSharedLibrary(.{
.name = dynamic_lib_name,
Expand Down Expand Up @@ -169,6 +174,7 @@ pub fn build(b: *std.Build) !void {

b.installFile(file, "share/pkgconfig/libxev.pc");
}

// Benchmarks
_ = try benchTargets(b, target, optimize, bench_install, bench_name);

Expand Down
25 changes: 25 additions & 0 deletions examples/million-timers.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,36 @@ xev_cb_action timer_cb(xev_loop* loop, xev_completion* c, int result, void *user
return XEV_DISARM;
}

#ifdef _WIN32
#include <windows.h>
uint64_t hrtime(void) {
static int initialized = 0;
static LARGE_INTEGER start_timestamp;
static uint64_t qpc_tick_duration;

if (!initialized) {
initialized = 1;

LARGE_INTEGER qpc_freq;
QueryPerformanceFrequency(&qpc_freq);
qpc_tick_duration = 1e9 / qpc_freq.QuadPart;

QueryPerformanceCounter(&start_timestamp);
}

LARGE_INTEGER t;
QueryPerformanceCounter(&t);
t.QuadPart -= start_timestamp.QuadPart;

return (uint64_t)t.QuadPart * qpc_tick_duration;
}
#else
uint64_t hrtime(void) {
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return ts.tv_nsec + (ts.tv_sec * 1e9);
}
#endif

int main(void) {
xev_watcher* timers;
Expand Down
Loading