/* linker: mtime.o test.o stat.o -lm -lpthread -lrt */
#include <pthread.h>
+#include <semaphore.h>
#include <stdio.h>
#include <unistd.h>
int (*parse_arg_ext) (char *) = NULL;
pthread_barrier_t *barrier = NULL;
+sem_t sem;
pthread_mutex_t test = PTHREAD_MUTEX_INITIALIZER;
volatile int shared_flag = 0;
-ts_t ts1, ts2;
-int try = 0;
-int nbtoofast = 0;
+ts_t ts1={0}, ts2={0};
int rc = 0;
#define TIMER 1000
pthread_barrier_wait (barrier);
- while (try < nb_measurements) {
+ for (int i = -1; i < nb_measurements; i++) {
+
+ usleep (TIMER);
pthread_mutex_lock (&test);
+
+ sem_post (&sem);
usleep (TIMER);
- shared_flag = 1;
+
sys_timestamp (&ts1);
pthread_mutex_unlock (&test);
- //shared_flag = 0;
- usleep (TIMER);
}
pthread_exit (NULL);
pthread_barrier_wait (barrier);
- while (try < nb_measurements) {
- ts_t ts;
- sys_timestamp (&ts);
+ for (int i = -1; i < nb_measurements; i++) {
+
+ sem_wait (&sem);
+
pthread_mutex_lock (&test);
- if (shared_flag) {
- sys_timestamp (&ts2);
- if (diff_timestamp (&ts2, &ts) < (9 * TIMER / 10)) {
- nbtoofast++;
- } else {
- deltas[try++] = diff_timestamp (&ts2, &ts1);
- }
- shared_flag = 0;
- }
+ sys_timestamp (&ts2);
+ if (i != -1) deltas[i] = diff_timestamp (&ts2, &ts1);
pthread_mutex_unlock (&test);
}
nb_measurements = nb;
barrier = synchro;
- shared_flag = 1;
+ sem_init (&sem, 0, 1);
return 0;
}
int finish ()
{
- printf ("Too fast: %d\n", nbtoofast);
+ sem_destroy (&sem);
- return rc || nbtoofast;
+ return rc;
}
volatile int shared_flag = 0;
ts_t ts1, ts2;
sem_t sem;
-int try = 0;
-int nbtoofast = 0;
int rc = 0;
#define TIMER 1000
pthread_barrier_wait (barrier);
- while (try < nb_measurements) {
- sem_wait (&sem);
+ for (int i = -1; i < nb_measurements; i++) {
+
usleep (TIMER);
- shared_flag = 1;
sys_timestamp (&ts1);
sem_post (&sem);
- //shared_flag = 0;
- usleep (TIMER);
}
pthread_exit (NULL);
pthread_barrier_wait (barrier);
- while (try < nb_measurements) {
- ts_t ts;
- sys_timestamp (&ts);
+ for (int i = -1; i < nb_measurements; i++) {
+
sem_wait (&sem);
- if (shared_flag) {
- sys_timestamp (&ts2);
- if (diff_timestamp (&ts2, &ts) < (9 * TIMER / 10)) {
- nbtoofast++;
- } else {
- deltas[try++] = diff_timestamp (&ts2, &ts1);
- }
- shared_flag = 0;
- }
- sem_post (&sem);
+ sys_timestamp (&ts2);
+ if (i != -1) deltas[i] = diff_timestamp (&ts2, &ts1);
}
pthread_exit (NULL);
sem_init (&sem, 0, 1);
- shared_flag = 1;
-
return 0;
}
sem_destroy (&sem);
- printf ("Too fast: %d\n", nbtoofast);
-
- return rc || nbtoofast;
+ return rc;
}