Changeset View
Changeset View
Standalone View
Standalone View
tools/regression/posixsem/posixsem.c
Show First 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | |||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include <time.h> | #include <time.h> | ||||
#include <unistd.h> | #include <unistd.h> | ||||
#include "test.h" | #include "test.h" | ||||
/* Cut and pasted from kernel header, bah! */ | |||||
/* Operations on timespecs */ | |||||
#define timespecclear(tvp) ((tvp)->tv_sec = (tvp)->tv_nsec = 0) | |||||
#define timespecisset(tvp) ((tvp)->tv_sec || (tvp)->tv_nsec) | |||||
#define timespeccmp(tvp, uvp, cmp) \ | |||||
(((tvp)->tv_sec == (uvp)->tv_sec) ? \ | |||||
((tvp)->tv_nsec cmp (uvp)->tv_nsec) : \ | |||||
((tvp)->tv_sec cmp (uvp)->tv_sec)) | |||||
#define timespecadd(vvp, uvp) \ | |||||
do { \ | |||||
(vvp)->tv_sec += (uvp)->tv_sec; \ | |||||
(vvp)->tv_nsec += (uvp)->tv_nsec; \ | |||||
if ((vvp)->tv_nsec >= 1000000000) { \ | |||||
(vvp)->tv_sec++; \ | |||||
(vvp)->tv_nsec -= 1000000000; \ | |||||
} \ | |||||
} while (0) | |||||
#define timespecsub(vvp, uvp) \ | |||||
do { \ | |||||
(vvp)->tv_sec -= (uvp)->tv_sec; \ | |||||
(vvp)->tv_nsec -= (uvp)->tv_nsec; \ | |||||
if ((vvp)->tv_nsec < 0) { \ | |||||
(vvp)->tv_sec--; \ | |||||
(vvp)->tv_nsec += 1000000000; \ | |||||
} \ | |||||
} while (0) | |||||
#define TEST_PATH "/tmp/posixsem_regression_test" | #define TEST_PATH "/tmp/posixsem_regression_test" | ||||
#define ELAPSED(elapsed, limit) (abs((elapsed) - (limit)) < 100) | #define ELAPSED(elapsed, limit) (abs((elapsed) - (limit)) < 100) | ||||
/* Macros for passing child status to parent over a pipe. */ | /* Macros for passing child status to parent over a pipe. */ | ||||
#define CSTAT(class, error) ((class) << 16 | (error)) | #define CSTAT(class, error) ((class) << 16 | (error)) | ||||
#define CSTAT_CLASS(stat) ((stat) >> 16) | #define CSTAT_CLASS(stat) ((stat) >> 16) | ||||
#define CSTAT_ERROR(stat) ((stat) & 0xffff) | #define CSTAT_ERROR(stat) ((stat) & 0xffff) | ||||
▲ Show 20 Lines • Show All 691 Lines • ▼ Show 20 Lines | timedwait(semid_t id, u_int msec, u_int *delta, int error) | ||||
struct timespec start, end; | struct timespec start, end; | ||||
if (clock_gettime(CLOCK_REALTIME, &start) < 0) { | if (clock_gettime(CLOCK_REALTIME, &start) < 0) { | ||||
fail_errno("clock_gettime(CLOCK_REALTIME)"); | fail_errno("clock_gettime(CLOCK_REALTIME)"); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
end.tv_sec = msec / 1000; | end.tv_sec = msec / 1000; | ||||
end.tv_nsec = msec % 1000 * 1000000; | end.tv_nsec = msec % 1000 * 1000000; | ||||
timespecadd(&end, &start); | timespecadd(&end, &start, &end); | ||||
if (ksem_timedwait(id, &end) < 0) { | if (ksem_timedwait(id, &end) < 0) { | ||||
if (errno != error) { | if (errno != error) { | ||||
fail_errno("ksem_timedwait"); | fail_errno("ksem_timedwait"); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
} else if (error != 0) { | } else if (error != 0) { | ||||
fail_err("ksem_timedwait() didn't fail"); | fail_err("ksem_timedwait() didn't fail"); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
if (clock_gettime(CLOCK_REALTIME, &end) < 0) { | if (clock_gettime(CLOCK_REALTIME, &end) < 0) { | ||||
fail_errno("clock_gettime(CLOCK_REALTIME)"); | fail_errno("clock_gettime(CLOCK_REALTIME)"); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
timespecsub(&end, &start); | timespecsub(&end, &start, &end); | ||||
*delta = end.tv_nsec / 1000000; | *delta = end.tv_nsec / 1000000; | ||||
*delta += end.tv_sec * 1000; | *delta += end.tv_sec * 1000; | ||||
return (0); | return (0); | ||||
} | } | ||||
static void | static void | ||||
unlocked_timedwait(void) | unlocked_timedwait(void) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 122 Lines • ▼ Show 20 Lines | testwait(semid_t id, u_int *delta) | ||||
if (ksem_wait(id) < 0) { | if (ksem_wait(id) < 0) { | ||||
fail_errno("ksem_wait"); | fail_errno("ksem_wait"); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
if (clock_gettime(CLOCK_REALTIME, &end) < 0) { | if (clock_gettime(CLOCK_REALTIME, &end) < 0) { | ||||
fail_errno("clock_gettime(CLOCK_REALTIME)"); | fail_errno("clock_gettime(CLOCK_REALTIME)"); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
timespecsub(&end, &start); | timespecsub(&end, &start, &end); | ||||
*delta = end.tv_nsec / 1000000; | *delta = end.tv_nsec / 1000000; | ||||
*delta += end.tv_sec * 1000; | *delta += end.tv_sec * 1000; | ||||
return (0); | return (0); | ||||
} | } | ||||
static void | static void | ||||
unlocked_wait(void) | unlocked_wait(void) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 488 Lines • Show Last 20 Lines |