IMPALA-4246: SleepForMs() utility function has undefined behavior for > 1s
Our SleepForMs() function relied on usleep() which sleeps for 'n' microseconds. However, the manpage for usleep() specifies that this may not work for values > 1000000 us (or 1s). This patch removes the use of usleep() and uses std::this_thread::sleep_for() instead, which was introduced with C++11. Change-Id: I06c55b1be287b264e7601c9c89788ae5929571cf Reviewed-on: http://gerrit.cloudera.org:8080/4622 Reviewed-by: Sailesh Mukil <[email protected]> Tested-by: Internal Jenkins Project: http://git-wip-us.apache.org/repos/asf/incubator-impala/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-impala/commit/3be113cb Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/3be113cb Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/3be113cb Branch: refs/heads/master Commit: 3be113cb9fd6460a80b8198a50f3619c4b9539a2 Parents: 112ff68 Author: Sailesh Mukil <[email protected]> Authored: Tue Oct 4 15:31:58 2016 -0700 Committer: Internal Jenkins <[email protected]> Committed: Wed Oct 5 03:29:03 2016 +0000 ---------------------------------------------------------------------- be/src/util/time.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/3be113cb/be/src/util/time.cc ---------------------------------------------------------------------- diff --git a/be/src/util/time.cc b/be/src/util/time.cc index b7d31ad..e6530de 100644 --- a/be/src/util/time.cc +++ b/be/src/util/time.cc @@ -15,13 +15,14 @@ // specific language governing permissions and limitations // under the License. -#include <unistd.h> +#include <chrono> +#include <thread> #include "util/time.h" using namespace impala; +using namespace std; void impala::SleepForMs(const int64_t duration_ms) { - // TODO: Replace with sleep_for when we upgrade to recent boost / C++11? - usleep(duration_ms * 1000L); + this_thread::sleep_for(chrono::milliseconds(duration_ms)); }
