diff options
Diffstat (limited to 'src/timeout.c')
-rw-r--r-- | src/timeout.c | 73 |
1 files changed, 33 insertions, 40 deletions
diff --git a/src/timeout.c b/src/timeout.c index dcc2105..74ba968 100644 --- a/src/timeout.c +++ b/src/timeout.c | |||
@@ -46,8 +46,7 @@ static luaL_reg func[] = { | |||
46 | /*-------------------------------------------------------------------------*\ | 46 | /*-------------------------------------------------------------------------*\ |
47 | * Initialize structure | 47 | * Initialize structure |
48 | \*-------------------------------------------------------------------------*/ | 48 | \*-------------------------------------------------------------------------*/ |
49 | void tm_init(p_tm tm, int block, int total) | 49 | void tm_init(p_tm tm, double block, double total) { |
50 | { | ||
51 | tm->block = block; | 50 | tm->block = block; |
52 | tm->total = total; | 51 | tm->total = total; |
53 | } | 52 | } |
@@ -60,18 +59,17 @@ void tm_init(p_tm tm, int block, int total) | |||
60 | * Returns | 59 | * Returns |
61 | * the number of ms left or -1 if there is no time limit | 60 | * the number of ms left or -1 if there is no time limit |
62 | \*-------------------------------------------------------------------------*/ | 61 | \*-------------------------------------------------------------------------*/ |
63 | int tm_get(p_tm tm) | 62 | double tm_get(p_tm tm) { |
64 | { | 63 | if (tm->block < 0.0 && tm->total < 0.0) { |
65 | if (tm->block < 0 && tm->total < 0) { | ||
66 | return -1; | 64 | return -1; |
67 | } else if (tm->block < 0) { | 65 | } else if (tm->block < 0.0) { |
68 | int t = tm->total - tm_gettime() + tm->start; | 66 | double t = tm->total - tm_gettime() + tm->start; |
69 | return MAX(t, 0); | 67 | return MAX(t, 0.0); |
70 | } else if (tm->total < 0) { | 68 | } else if (tm->total < 0.0) { |
71 | return tm->block; | 69 | return tm->block; |
72 | } else { | 70 | } else { |
73 | int t = tm->total - tm_gettime() + tm->start; | 71 | double t = tm->total - tm_gettime() + tm->start; |
74 | return MIN(tm->block, MAX(t, 0)); | 72 | return MIN(tm->block, MAX(t, 0.0)); |
75 | } | 73 | } |
76 | } | 74 | } |
77 | 75 | ||
@@ -82,8 +80,7 @@ int tm_get(p_tm tm) | |||
82 | * Returns | 80 | * Returns |
83 | * start field of structure | 81 | * start field of structure |
84 | \*-------------------------------------------------------------------------*/ | 82 | \*-------------------------------------------------------------------------*/ |
85 | int tm_getstart(p_tm tm) | 83 | double tm_getstart(p_tm tm) { |
86 | { | ||
87 | return tm->start; | 84 | return tm->start; |
88 | } | 85 | } |
89 | 86 | ||
@@ -95,19 +92,18 @@ int tm_getstart(p_tm tm) | |||
95 | * Returns | 92 | * Returns |
96 | * the number of ms left or -1 if there is no time limit | 93 | * the number of ms left or -1 if there is no time limit |
97 | \*-------------------------------------------------------------------------*/ | 94 | \*-------------------------------------------------------------------------*/ |
98 | int tm_getretry(p_tm tm) | 95 | double tm_getretry(p_tm tm) { |
99 | { | 96 | if (tm->block < 0.0 && tm->total < 0.0) { |
100 | if (tm->block < 0 && tm->total < 0) { | ||
101 | return -1; | 97 | return -1; |
102 | } else if (tm->block < 0) { | 98 | } else if (tm->block < 0.0) { |
103 | int t = tm->total - tm_gettime() + tm->start; | 99 | double t = tm->total - tm_gettime() + tm->start; |
104 | return MAX(t, 0); | 100 | return MAX(t, 0.0); |
105 | } else if (tm->total < 0) { | 101 | } else if (tm->total < 0.0) { |
106 | int t = tm->block - tm_gettime() + tm->start; | 102 | double t = tm->block - tm_gettime() + tm->start; |
107 | return MAX(t, 0); | 103 | return MAX(t, 0.0); |
108 | } else { | 104 | } else { |
109 | int t = tm->total - tm_gettime() + tm->start; | 105 | double t = tm->total - tm_gettime() + tm->start; |
110 | return MIN(tm->block, MAX(t, 0)); | 106 | return MIN(tm->block, MAX(t, 0.0)); |
111 | } | 107 | } |
112 | } | 108 | } |
113 | 109 | ||
@@ -116,8 +112,7 @@ int tm_getretry(p_tm tm) | |||
116 | * Input | 112 | * Input |
117 | * tm: timeout control structure | 113 | * tm: timeout control structure |
118 | \*-------------------------------------------------------------------------*/ | 114 | \*-------------------------------------------------------------------------*/ |
119 | p_tm tm_markstart(p_tm tm) | 115 | p_tm tm_markstart(p_tm tm) { |
120 | { | ||
121 | tm->start = tm_gettime(); | 116 | tm->start = tm_gettime(); |
122 | return tm; | 117 | return tm; |
123 | } | 118 | } |
@@ -128,24 +123,23 @@ p_tm tm_markstart(p_tm tm) | |||
128 | * time in ms. | 123 | * time in ms. |
129 | \*-------------------------------------------------------------------------*/ | 124 | \*-------------------------------------------------------------------------*/ |
130 | #ifdef _WIN32 | 125 | #ifdef _WIN32 |
131 | int tm_gettime(void) | 126 | double tm_gettime(void) { |
132 | { | 127 | FILETIME ft; |
133 | return GetTickCount(); | 128 | GetSystemTimeAsFileTime(&ft); |
129 | return ft.dwLowDateTime/1.0e7 + ft.dwHighDateTime*(4294967296.0/1.0e7); | ||
134 | } | 130 | } |
135 | #else | 131 | #else |
136 | int tm_gettime(void) | 132 | double tm_gettime(void) { |
137 | { | ||
138 | struct timeval v; | 133 | struct timeval v; |
139 | gettimeofday(&v, (struct timezone *) NULL); | 134 | gettimeofday(&v, (struct timezone *) NULL); |
140 | return v.tv_sec * 1000 + v.tv_usec/1000; | 135 | return v.tv_sec + v.tv_usec/1.0e6; |
141 | } | 136 | } |
142 | #endif | 137 | #endif |
143 | 138 | ||
144 | /*-------------------------------------------------------------------------*\ | 139 | /*-------------------------------------------------------------------------*\ |
145 | * Initializes module | 140 | * Initializes module |
146 | \*-------------------------------------------------------------------------*/ | 141 | \*-------------------------------------------------------------------------*/ |
147 | int tm_open(lua_State *L) | 142 | int tm_open(lua_State *L) { |
148 | { | ||
149 | luaL_openlib(L, NULL, func, 0); | 143 | luaL_openlib(L, NULL, func, 0); |
150 | return 0; | 144 | return 0; |
151 | } | 145 | } |
@@ -156,16 +150,15 @@ int tm_open(lua_State *L) | |||
156 | * time: time out value in seconds | 150 | * time: time out value in seconds |
157 | * mode: "b" for block timeout, "t" for total timeout. (default: b) | 151 | * mode: "b" for block timeout, "t" for total timeout. (default: b) |
158 | \*-------------------------------------------------------------------------*/ | 152 | \*-------------------------------------------------------------------------*/ |
159 | int tm_meth_settimeout(lua_State *L, p_tm tm) | 153 | int tm_meth_settimeout(lua_State *L, p_tm tm) { |
160 | { | 154 | double t = luaL_optnumber(L, 2, -1); |
161 | int ms = lua_isnil(L, 2) ? -1 : (int) (luaL_checknumber(L, 2)*1000.0); | ||
162 | const char *mode = luaL_optstring(L, 3, "b"); | 155 | const char *mode = luaL_optstring(L, 3, "b"); |
163 | switch (*mode) { | 156 | switch (*mode) { |
164 | case 'b': | 157 | case 'b': |
165 | tm->block = ms; | 158 | tm->block = t; |
166 | break; | 159 | break; |
167 | case 'r': case 't': | 160 | case 'r': case 't': |
168 | tm->total = ms; | 161 | tm->total = t; |
169 | break; | 162 | break; |
170 | default: | 163 | default: |
171 | luaL_argcheck(L, 0, 3, "invalid timeout mode"); | 164 | luaL_argcheck(L, 0, 3, "invalid timeout mode"); |
@@ -183,7 +176,7 @@ int tm_meth_settimeout(lua_State *L, p_tm tm) | |||
183 | \*-------------------------------------------------------------------------*/ | 176 | \*-------------------------------------------------------------------------*/ |
184 | static int tm_lua_gettime(lua_State *L) | 177 | static int tm_lua_gettime(lua_State *L) |
185 | { | 178 | { |
186 | lua_pushnumber(L, tm_gettime()/1000.0); | 179 | lua_pushnumber(L, tm_gettime()); |
187 | return 1; | 180 | return 1; |
188 | } | 181 | } |
189 | 182 | ||