convert clock() to clock_gettime() for improved precision (and accuracy?)
authortedu <tedu@openbsd.org>
Mon, 5 Jan 2015 13:10:10 +0000 (13:10 +0000)
committertedu <tedu@openbsd.org>
Mon, 5 Jan 2015 13:10:10 +0000 (13:10 +0000)
guenther suggested using thread time, which actually may improve accuracy
if somebody puts this in a threaded program.

lib/libc/crypt/bcrypt.c

index abcbe13..1114eae 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bcrypt.c,v 1.47 2014/12/30 10:27:24 tedu Exp $        */
+/*     $OpenBSD: bcrypt.c,v 1.48 2015/01/05 13:10:10 tedu Exp $        */
 
 /*
  * Copyright (c) 2014 Ted Unangst <tedu@openbsd.org>
@@ -231,24 +231,26 @@ bcrypt_checkpass(const char *pass, const char *goodhash)
 int
 bcrypt_autorounds(void)
 {
-       clock_t before, after;
+       struct timespec before, after;
        int r = 8;
        char buf[_PASSWORD_LEN];
        int duration;
 
-       before = clock();
+       clock_gettime(CLOCK_THREAD_CPUTIME_ID, &before);
        bcrypt_newhash("testpassword", r, buf, sizeof(buf));
-       after = clock();
+       clock_gettime(CLOCK_THREAD_CPUTIME_ID, &after);
 
-       duration = after - before;
+       duration = after.tv_sec - before.tv_sec;
+       duration *= 1000000;
+       duration += (after.tv_nsec - before.tv_nsec) / 1000;
 
        /* too quick? slow it down. */
-       while (r < 16 && duration <= CLOCKS_PER_SEC / 4) {
+       while (r < 16 && duration <= 1000000 / 4) {
                r += 1;
                duration *= 2;
        }
        /* too slow? speed it up. */
-       while (r > 4 && duration > CLOCKS_PER_SEC / 2) {
+       while (r > 4 && duration > 1000000 / 2) {
                r -= 1;
                duration /= 2;
        }