提交 69cbd10a 创建 作者: Austin Clements's avatar Austin Clements 提交者: Silas Boyd-Wickizer

asharing: Don't start recording until all threads are running

This eliminates a bunch of confusing scopes that come from thread creation
上级 87304b5d
...@@ -8,8 +8,10 @@ ...@@ -8,8 +8,10 @@
#include <sys/mman.h> #include <sys/mman.h>
#include "atomic.hh"
static int cpu; static int cpu;
static pthread_barrier_t bar; std::atomic<int> barrier;
enum { ncore = 8 }; enum { ncore = 8 };
void void
...@@ -23,11 +25,26 @@ next() ...@@ -23,11 +25,26 @@ next()
cpu++; cpu++;
} }
void
ready(void)
{
int slot = --barrier;
if (slot == 1) {
mtenable_type(mtrace_record_ascope, "xv6-asharing");
--barrier;
} else {
while (barrier)
asm volatile("pause");
}
}
void* void*
vmsharing(void* arg) vmsharing(void* arg)
{ {
u64 i = (u64) arg; u64 i = (u64) arg;
ready();
volatile char *p = (char*)(0x40000UL + i * 4096); volatile char *p = (char*)(0x40000UL + i * 4096);
if (mmap((void *) p, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) < 0) if (mmap((void *) p, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) < 0)
die("mmap failed"); die("mmap failed");
...@@ -52,7 +69,7 @@ fssharing(void* arg) ...@@ -52,7 +69,7 @@ fssharing(void* arg)
open(filename, O_CREATE|O_RDWR); open(filename, O_CREATE|O_RDWR);
pthread_barrier_wait(&bar); ready();
for (u64 j = 0; j < ncore; j++) { for (u64 j = 0; j < ncore; j++) {
snprintf(filename, sizeof(filename), "f%d", j); snprintf(filename, sizeof(filename), "f%d", j);
...@@ -73,8 +90,7 @@ main(int ac, char **av) ...@@ -73,8 +90,7 @@ main(int ac, char **av)
fprintf(1, "usage: %s vm|fs\n", av[0]); fprintf(1, "usage: %s vm|fs\n", av[0]);
if (op) { if (op) {
mtenable_type(mtrace_record_ascope, "xv6-asharing"); barrier = ncore + 1;
pthread_barrier_init(&bar, 0, ncore);
for (u64 i = 0; i < ncore; i++) { for (u64 i = 0; i < ncore; i++) {
next(); next();
pthread_t tid; pthread_t tid;
...@@ -83,6 +99,8 @@ main(int ac, char **av) ...@@ -83,6 +99,8 @@ main(int ac, char **av)
for (u64 i = 0; i < ncore; i++) for (u64 i = 0; i < ncore; i++)
wait(); wait();
if (barrier)
die("forgot to call ready()");
mtdisable("xv6-asharing"); mtdisable("xv6-asharing");
} }
} }
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论