diff options
| -rw-r--r-- | contrib/getdents-debug/getdents_c/Makefile | 2 | ||||
| -rw-r--r-- | contrib/getdents-debug/getdents_c/getdents.c | 65 | 
2 files changed, 50 insertions, 17 deletions
| diff --git a/contrib/getdents-debug/getdents_c/Makefile b/contrib/getdents-debug/getdents_c/Makefile index 95e47dc..1a9d4d2 100644 --- a/contrib/getdents-debug/getdents_c/Makefile +++ b/contrib/getdents-debug/getdents_c/Makefile @@ -1,2 +1,2 @@  getdents_c: *.c Makefile -	gcc getdents.c -o getdents_c +	gcc getdents.c -lpthread -o getdents_c diff --git a/contrib/getdents-debug/getdents_c/getdents.c b/contrib/getdents-debug/getdents_c/getdents.c index 936bd0b..d504976 100644 --- a/contrib/getdents-debug/getdents_c/getdents.c +++ b/contrib/getdents-debug/getdents_c/getdents.c @@ -1,6 +1,7 @@  // See ../getdents/getdents.go for some info on why  // this exists. +#define _GNU_SOURCE  #include <fcntl.h>  #include <stdio.h>  #include <unistd.h> @@ -9,6 +10,38 @@  #include <sys/stat.h>  #include <sys/syscall.h>  #include <errno.h> +#include <pthread.h> + +static pthread_mutex_t mutex; +static int sum; + +struct up { +    pthread_mutex_t *my_mutex; +    pthread_mutex_t *other_mutex; +    int fd; +}; + +void *reader(void *arg) { +    struct up* up = (struct up*)arg; +    int fd = up->fd; +    char tmp[10000]; +    while(1) { +        pthread_mutex_lock(up->my_mutex); +        int n = syscall(SYS_getdents64, fd, tmp, sizeof(tmp)); +        if (n > 0) { +            printf("t%ld: n=%d\n", gettid(), n); +        } else { +            printf("t%ld: n=0 errno=%d total %d bytes\n", gettid(), errno, sum); +            if (n < 0) { +                exit(1); +            } +            pthread_mutex_unlock(up->other_mutex); +            break; +        } +        sum += n; +        pthread_mutex_unlock(up->other_mutex); +    } +}  int main(int argc, char *argv[])  { @@ -21,28 +54,28 @@ int main(int argc, char *argv[])      const char *path = argv[1];      for (int i = 1 ; ; i ++ ) { +        sum = 0;          int fd = open(path, O_RDONLY);          if (fd == -1) {              perror("open");              exit(1);          } - -        char tmp[10000]; -        int sum = 0; -        printf("%3d: getdents64: ", i); -        for ( ; ; ) { -            int n = syscall(SYS_getdents64, fd, tmp, sizeof(tmp)); -            printf("n=%d; ", n); -            if (n <= 0) { -                printf("errno=%d total %d bytes\n", errno, sum); -                if (n < 0) { -                    exit(1); -                } -                break; -            } -            sum += n; -        } +        pthread_t reader1_thread, reader2_thread; +        pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER, m2 = PTHREAD_MUTEX_INITIALIZER; +        pthread_mutex_lock(&m2); +        struct up up1, up2; +        up1.fd = fd; +        up1.my_mutex = &m1; +        up1.other_mutex = &m2; +        up2.fd = fd; +        up2.my_mutex = &m2; +        up2.other_mutex = &m1; +        pthread_create(&reader1_thread, NULL, reader, &up1); +        pthread_create(&reader2_thread, NULL, reader, &up2); +        pthread_join(reader1_thread, NULL); +        pthread_join(reader2_thread, NULL);          close(fd); +        printf("---\n");          usleep(100000);      }  } | 
