40 lines
849 B
D
40 lines
849 B
D
|
|
module patch.sync;
|
||
|
|
|
||
|
|
import core.sys.posix.time : clock_gettime, CLOCK_MONOTONIC, timespec;
|
||
|
|
import patches : isPatchEnabled;
|
||
|
|
|
||
|
|
// Define TIMEDIFF macro
|
||
|
|
long TIMEDIFF(timespec t1, timespec t2) {
|
||
|
|
return (t1.tv_sec - t2.tv_sec) * 1000 + (t1.tv_nsec - t2.tv_nsec) / 1_000_000;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Define these globals for sync patch
|
||
|
|
__gshared {
|
||
|
|
int su = 0;
|
||
|
|
int twrite_aborted = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
static if (isPatchEnabled!"SYNC_PATCH") {
|
||
|
|
timespec sutv;
|
||
|
|
|
||
|
|
void tsync_begin() {
|
||
|
|
clock_gettime(CLOCK_MONOTONIC, &sutv);
|
||
|
|
su = 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
void tsync_end() {
|
||
|
|
su = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int tinsync(uint timeout) {
|
||
|
|
timespec now;
|
||
|
|
if (su && !clock_gettime(CLOCK_MONOTONIC, &now)
|
||
|
|
&& TIMEDIFF(now, sutv) >= timeout)
|
||
|
|
su = 0;
|
||
|
|
return su;
|
||
|
|
}
|
||
|
|
|
||
|
|
int ttyread_pending() {
|
||
|
|
return twrite_aborted;
|
||
|
|
}
|
||
|
|
}
|