summaryrefslogtreecommitdiff
path: root/notxv6/barrier.c
diff options
context:
space:
mode:
authorSanjit Bhat <[email protected]>2023-09-13 02:01:38 -0400
committerSanjit Bhat <[email protected]>2023-09-13 02:01:38 -0400
commit87470490676ee6dc087e3ebe2a3ce3cfbd4afbd9 (patch)
tree64398d88609ac3b9fc045071ae6703269c97ce26 /notxv6/barrier.c
parent74c1eba516fdb0ec1a17b16be7e76613ccba92bf (diff)
downloadxv6-labs-87470490676ee6dc087e3ebe2a3ce3cfbd4afbd9.tar.gz
xv6-labs-87470490676ee6dc087e3ebe2a3ce3cfbd4afbd9.tar.bz2
xv6-labs-87470490676ee6dc087e3ebe2a3ce3cfbd4afbd9.zip
release lab thread
Diffstat (limited to 'notxv6/barrier.c')
-rw-r--r--notxv6/barrier.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/notxv6/barrier.c b/notxv6/barrier.c
new file mode 100644
index 0000000..12793e8
--- /dev/null
+++ b/notxv6/barrier.c
@@ -0,0 +1,78 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <assert.h>
+#include <pthread.h>
+
+static int nthread = 1;
+static int round = 0;
+
+struct barrier {
+ pthread_mutex_t barrier_mutex;
+ pthread_cond_t barrier_cond;
+ int nthread; // Number of threads that have reached this round of the barrier
+ int round; // Barrier round
+} bstate;
+
+static void
+barrier_init(void)
+{
+ assert(pthread_mutex_init(&bstate.barrier_mutex, NULL) == 0);
+ assert(pthread_cond_init(&bstate.barrier_cond, NULL) == 0);
+ bstate.nthread = 0;
+}
+
+static void
+barrier()
+{
+ // YOUR CODE HERE
+ //
+ // Block until all threads have called barrier() and
+ // then increment bstate.round.
+ //
+
+}
+
+static void *
+thread(void *xa)
+{
+ long n = (long) xa;
+ long delay;
+ int i;
+
+ for (i = 0; i < 20000; i++) {
+ int t = bstate.round;
+ assert (i == t);
+ barrier();
+ usleep(random() % 100);
+ }
+
+ return 0;
+}
+
+int
+main(int argc, char *argv[])
+{
+ pthread_t *tha;
+ void *value;
+ long i;
+ double t1, t0;
+
+ if (argc < 2) {
+ fprintf(stderr, "%s: %s nthread\n", argv[0], argv[0]);
+ exit(-1);
+ }
+ nthread = atoi(argv[1]);
+ tha = malloc(sizeof(pthread_t) * nthread);
+ srandom(0);
+
+ barrier_init();
+
+ for(i = 0; i < nthread; i++) {
+ assert(pthread_create(&tha[i], NULL, thread, (void *) i) == 0);
+ }
+ for(i = 0; i < nthread; i++) {
+ assert(pthread_join(tha[i], &value) == 0);
+ }
+ printf("OK; passed\n");
+}