Mercurial > prosody-hg
annotate util-src/time.c @ 14229:ce31fdde0ad1 default tip
net.unbound: Simplify conditional
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 13 Jun 2026 11:35:18 +0200 |
| parents | 973609bad40a |
| children |
| rev | line source |
|---|---|
|
9164
35807f02bdc7
util.time: Allow for already set constant
Kim Alvefur <zash@zash.se>
parents:
9163
diff
changeset
|
1 #ifndef _POSIX_C_SOURCE |
|
9680
a374905e99ff
util.time: Bump POSIX_C_SOURCE to ensure visibility of CLOCK_MONOTONIC on FreeBSD (fixes #1253)
Matthew Wild <mwild1@gmail.com>
parents:
9164
diff
changeset
|
2 #define _POSIX_C_SOURCE 200809L |
|
9164
35807f02bdc7
util.time: Allow for already set constant
Kim Alvefur <zash@zash.se>
parents:
9163
diff
changeset
|
3 #endif |
| 9162 | 4 |
| 5 #include <time.h> | |
| 6 #include <lua.h> | |
|
14080
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
7 #include <lauxlib.h> |
| 9162 | 8 |
|
10480
94cacf9fd0ae
util.*.c: Add static qualifiers everywhere
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9680
diff
changeset
|
9 static lua_Number tv2number(struct timespec *tv) { |
| 9162 | 10 return tv->tv_sec + tv->tv_nsec * 1e-9; |
| 11 } | |
| 12 | |
|
10480
94cacf9fd0ae
util.*.c: Add static qualifiers everywhere
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9680
diff
changeset
|
13 static int lc_time_realtime(lua_State *L) { |
| 9162 | 14 struct timespec t; |
| 15 clock_gettime(CLOCK_REALTIME, &t); | |
| 16 lua_pushnumber(L, tv2number(&t)); | |
| 17 return 1; | |
| 18 } | |
| 19 | |
|
10480
94cacf9fd0ae
util.*.c: Add static qualifiers everywhere
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9680
diff
changeset
|
20 static int lc_time_monotonic(lua_State *L) { |
| 9163 | 21 struct timespec t; |
| 22 clock_gettime(CLOCK_MONOTONIC, &t); | |
| 23 lua_pushnumber(L, tv2number(&t)); | |
| 24 return 1; | |
| 25 } | |
| 26 | |
|
14080
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
27 /* This function has been imported from luasocket */ |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
28 static int lc_sleep(lua_State *L) { |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
29 double n = luaL_checknumber(L, 1); |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
30 struct timespec t, r; |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
31 if (n < 0.0) n = 0.0; |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
32 if (n > INT_MAX) n = INT_MAX; |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
33 t.tv_sec = (int) n; |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
34 n -= t.tv_sec; |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
35 t.tv_nsec = (int) (n * 1000000000); |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
36 if (t.tv_nsec >= 1000000000) t.tv_nsec = 999999999; |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
37 while (nanosleep(&t, &r) != 0) { |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
38 t.tv_sec = r.tv_sec; |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
39 t.tv_nsec = r.tv_nsec; |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
40 } |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
41 return 0; |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
42 } |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
43 |
|
12976
a187600ec7d6
util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents:
10480
diff
changeset
|
44 int luaopen_prosody_util_time(lua_State *L) { |
| 9162 | 45 lua_createtable(L, 0, 2); |
| 46 { | |
| 47 lua_pushcfunction(L, lc_time_realtime); | |
| 48 lua_setfield(L, -2, "now"); | |
| 9163 | 49 lua_pushcfunction(L, lc_time_monotonic); |
| 50 lua_setfield(L, -2, "monotonic"); | |
|
14080
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
51 lua_pushcfunction(L, lc_sleep); |
|
973609bad40a
util.time: Import sleep from luasocket
Link Mauve <linkmauve@linkmauve.fr>
parents:
12976
diff
changeset
|
52 lua_setfield(L, -2, "sleep"); |
| 9162 | 53 } |
| 54 return 1; | |
| 55 } | |
|
12976
a187600ec7d6
util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents:
10480
diff
changeset
|
56 int luaopen_util_time(lua_State *L) { |
|
a187600ec7d6
util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents:
10480
diff
changeset
|
57 return luaopen_prosody_util_time(L); |
|
a187600ec7d6
util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents:
10480
diff
changeset
|
58 } |
