diff options
author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2003-11-27 00:30:54 +0000 |
---|---|---|
committer | Diego Nehab <diego@tecgraf.puc-rio.br> | 2003-11-27 00:30:54 +0000 |
commit | 3febb302ad28fd25de51cbc686739469b92d8921 (patch) | |
tree | 0a8d9a1070a7c1f2566c22562693fb27963037d9 /src/timeout.c | |
parent | 9bc4e0648ab4a177293a94425594bdc54c9a84fa (diff) | |
download | luasocket-3febb302ad28fd25de51cbc686739469b92d8921.tar.gz luasocket-3febb302ad28fd25de51cbc686739469b92d8921.tar.bz2 luasocket-3febb302ad28fd25de51cbc686739469b92d8921.zip |
Killed a few bugs found by Tomas.
Diffstat (limited to 'src/timeout.c')
-rw-r--r-- | src/timeout.c | 74 |
1 files changed, 48 insertions, 26 deletions
diff --git a/src/timeout.c b/src/timeout.c index 38d1135..5d6de99 100644 --- a/src/timeout.c +++ b/src/timeout.c | |||
@@ -16,8 +16,8 @@ | |||
16 | #ifdef WIN32 | 16 | #ifdef WIN32 |
17 | #include <windows.h> | 17 | #include <windows.h> |
18 | #else | 18 | #else |
19 | #include <sys/time.h> | ||
19 | #include <sys/times.h> | 20 | #include <sys/times.h> |
20 | #include <time.h> | ||
21 | #include <unistd.h> | 21 | #include <unistd.h> |
22 | #endif | 22 | #endif |
23 | 23 | ||
@@ -46,40 +46,62 @@ void tm_init(p_tm tm, int block, int total) | |||
46 | } | 46 | } |
47 | 47 | ||
48 | /*-------------------------------------------------------------------------*\ | 48 | /*-------------------------------------------------------------------------*\ |
49 | * Set and get timeout limits | 49 | * Determines how much time we have left for the next system call, |
50 | * if the previous call was successful | ||
51 | * Input | ||
52 | * tm: timeout control structure | ||
53 | * Returns | ||
54 | * the number of ms left or -1 if there is no time limit | ||
55 | \*-------------------------------------------------------------------------*/ | ||
56 | int tm_getsuccess(p_tm tm) | ||
57 | { | ||
58 | if (tm->block < 0 && tm->total < 0) { | ||
59 | return -1; | ||
60 | } else if (tm->block < 0) { | ||
61 | int t = tm->total - tm_gettime() + tm->start; | ||
62 | return MAX(t, 0); | ||
63 | } else if (tm->total < 0) { | ||
64 | return tm->block; | ||
65 | } else { | ||
66 | int t = tm->total - tm_gettime() + tm->start; | ||
67 | return MIN(tm->block, MAX(t, 0)); | ||
68 | } | ||
69 | } | ||
70 | |||
71 | /*-------------------------------------------------------------------------*\ | ||
72 | * Returns time since start of operation | ||
73 | * Input | ||
74 | * tm: timeout control structure | ||
75 | * Returns | ||
76 | * start field of structure | ||
50 | \*-------------------------------------------------------------------------*/ | 77 | \*-------------------------------------------------------------------------*/ |
51 | void tm_setblock(p_tm tm, int block) | ||
52 | { tm->block = block; } | ||
53 | void tm_settotal(p_tm tm, int total) | ||
54 | { tm->total = total; } | ||
55 | int tm_getblock(p_tm tm) | ||
56 | { return tm->block; } | ||
57 | int tm_gettotal(p_tm tm) | ||
58 | { return tm->total; } | ||
59 | int tm_getstart(p_tm tm) | 78 | int tm_getstart(p_tm tm) |
60 | { return tm->start; } | 79 | { |
80 | return tm->start; | ||
81 | } | ||
61 | 82 | ||
62 | /*-------------------------------------------------------------------------*\ | 83 | /*-------------------------------------------------------------------------*\ |
63 | * Determines how much time we have left for the current operation | 84 | * Determines how much time we have left for the next system call, |
85 | * if the previous call was a failure | ||
64 | * Input | 86 | * Input |
65 | * tm: timeout control structure | 87 | * tm: timeout control structure |
66 | * Returns | 88 | * Returns |
67 | * the number of ms left or -1 if there is no time limit | 89 | * the number of ms left or -1 if there is no time limit |
68 | \*-------------------------------------------------------------------------*/ | 90 | \*-------------------------------------------------------------------------*/ |
69 | int tm_get(p_tm tm) | 91 | int tm_getfailure(p_tm tm) |
70 | { | 92 | { |
71 | /* no timeout */ | 93 | if (tm->block < 0 && tm->total < 0) { |
72 | if (tm->block < 0 && tm->total < 0) | ||
73 | return -1; | 94 | return -1; |
74 | /* there is no block timeout, we use the return timeout */ | 95 | } else if (tm->block < 0) { |
75 | else if (tm->block < 0) | 96 | int t = tm->total - tm_gettime() + tm->start; |
76 | return MAX(tm->total - tm_gettime() + tm->start, 0); | 97 | return MAX(t, 0); |
77 | /* there is no return timeout, we use the block timeout */ | 98 | } else if (tm->total < 0) { |
78 | else if (tm->total < 0) | 99 | int t = tm->block - tm_gettime() + tm->start; |
79 | return tm->block; | 100 | return MAX(t, 0); |
80 | /* both timeouts are specified */ | 101 | } else { |
81 | else return MIN(tm->block, | 102 | int t = tm->total - tm_gettime() + tm->start; |
82 | MAX(tm->total - tm_gettime() + tm->start, 0)); | 103 | return MIN(tm->block, MAX(t, 0)); |
104 | } | ||
83 | } | 105 | } |
84 | 106 | ||
85 | /*-------------------------------------------------------------------------*\ | 107 | /*-------------------------------------------------------------------------*\ |
@@ -131,10 +153,10 @@ int tm_meth_settimeout(lua_State *L, p_tm tm) | |||
131 | const char *mode = luaL_optstring(L, 3, "b"); | 153 | const char *mode = luaL_optstring(L, 3, "b"); |
132 | switch (*mode) { | 154 | switch (*mode) { |
133 | case 'b': | 155 | case 'b': |
134 | tm_setblock(tm, ms); | 156 | tm->block = ms; |
135 | break; | 157 | break; |
136 | case 'r': case 't': | 158 | case 'r': case 't': |
137 | tm_settotal(tm, ms); | 159 | tm->total = ms; |
138 | break; | 160 | break; |
139 | default: | 161 | default: |
140 | luaL_argcheck(L, 0, 3, "invalid timeout mode"); | 162 | luaL_argcheck(L, 0, 3, "invalid timeout mode"); |