提交 343ef749 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

random inserts/removes

上级 224c53b4
...@@ -99,11 +99,13 @@ struct proc { ...@@ -99,11 +99,13 @@ struct proc {
u32 cpuid; u32 cpuid;
u32 pid; u32 pid;
char name[32]; char name[32];
void (*f) (void*);
void *farg;
}; };
struct cpu { struct cpu {
u32 id; u32 id;
u32 ncli;
}; };
extern pthread_key_t myproc_key; extern pthread_key_t myproc_key;
...@@ -124,22 +126,8 @@ mycpu() ...@@ -124,22 +126,8 @@ mycpu()
return (cpu*) &cpus[myproc()->cpuid]; return (cpu*) &cpus[myproc()->cpuid];
} }
void cli(); static inline void pushcli() {}
void sti(); static inline void popcli() {}
static inline void
pushcli()
{
cli();
mycpu()->ncli++;
}
static inline void
popcli()
{
if (--mycpu()->ncli == 0)
sti();
}
void threadpin(void (*fn)(void*), void *arg, const char *name, int cpu); void threadpin(void (*fn)(void*), void *arg, const char *name, int cpu);
#include <unistd.h> #include <unistd.h>
#include <signal.h>
#include <getopt.h>
#include "crange_arch.hh" #include "crange_arch.hh"
#include "gc.hh" #include "gc.hh"
#include "crange.hh" #include "crange.hh"
#include "atomic_util.hh" #include "atomic_util.hh"
#include "ns.hh" #include "ns.hh"
#include "rnd.hh"
u64 u64
proc_hash(const u32 &pid) proc_hash(const u32 &pid)
...@@ -18,69 +21,137 @@ u32 ncpu; ...@@ -18,69 +21,137 @@ u32 ncpu;
u64 ticks; u64 ticks;
xns<u32, proc*, proc_hash> *xnspid; xns<u32, proc*, proc_hash> *xnspid;
struct makeproc_info {
void (*f) (void*);
void *farg;
const char *name;
int cpu;
};
void
cli()
{
/* suspend all threads with the same cpuid */
}
void
sti()
{
/* resume all threads with the same cpuid */
}
static void* static void*
makeproc_start(void *arg) proc_start(void *arg)
{ {
makeproc_info *mpi = (makeproc_info *) arg; proc *p = (proc *) arg;
proc *p = new proc();
pthread_setspecific(myproc_key, p); pthread_setspecific(myproc_key, p);
p->pid = pthread_self(); p->pid = pthread_self();
p->cpuid = mpi->cpu;
snprintf(p->name, sizeof(p->name), "%s", mpi->name);
initprocgc(p); initprocgc(p);
xnspid->insert(p->pid, p); xnspid->insert(p->pid, p);
mpi->f(mpi->farg); p->f(p->farg);
delete mpi;
return 0; return 0;
} }
void void
makeproc(makeproc_info *mpi) makeproc(proc *p)
{ {
pthread_t tid; pthread_t tid;
makeproc_info *mcopy = new makeproc_info(*mpi); pthread_create(&tid, 0, &proc_start, p);
pthread_create(&tid, 0, &makeproc_start, mcopy);
} }
void void
threadpin(void (*fn)(void*), void *arg, const char *name, int cpu) threadpin(void (*fn)(void*), void *arg, const char *name, int cpu)
{ {
makeproc_info mpi = { fn, arg, name, cpu }; proc *p = new proc();
makeproc(&mpi); memset(p, 0, sizeof(*p));
p->f = fn;
p->farg = arg;
snprintf(p->name, sizeof(p->name), "%s", name);
p->cpuid = cpu;
makeproc(p);
}
static pthread_barrier_t worker_b, populate_b;
enum { iter_total = 10000000 };
enum { crange_items = 1024 };
static void
worker(void *arg)
{
crange *cr = (crange*) arg;
for (u32 i = 0; i < iter_total / ncpu; i++) {
u64 k = 1 + rnd() % (crange_items * 2);
auto span = cr->search_lock(k, 1);
if (rnd() & 1)
span.replace(0);
else
span.replace(new range(cr, k, 1));
}
pthread_barrier_wait(&worker_b);
}
static void
populate(void *arg)
{
crange *cr = (crange*) arg;
for (u32 i = 0; i < crange_items; i++)
cr->search_lock(1 + 2*i, 1).replace(new range(cr, 1+2*i, 1));
pthread_barrier_wait(&populate_b);
}
static const struct option long_opts[] = {
{ "ncpu", required_argument, 0, 'n' },
{ 0, no_argument, 0, 0 }
};
static u32
l2(u64 v)
{
u32 l = 0;
while (v) {
v = v>>1;
l++;
}
return l;
} }
int int
main(int ac, char **av) main(int ac, char **av)
{ {
ncpu = NCPU;
for (;;) {
int long_idx;
int opt = getopt_long(ac, av, "n:", long_opts, &long_idx);
if (opt == -1)
break;
switch (opt) {
case 'n':
ncpu = atoi(optarg);
assert(ncpu <= NCPU);
break;
case '?':
printf("Options:\n");
for (u32 i = 0; long_opts[i].name; i++)
printf(" -%c / --%s%s\n",
long_opts[i].val,
long_opts[i].name,
long_opts[i].has_arg == required_argument ? " ARG" :
long_opts[i].has_arg == optional_argument ? " [ARG]" : "");
exit(-1);
}
}
assert(0 == pthread_key_create(&myproc_key, 0)); assert(0 == pthread_key_create(&myproc_key, 0));
for (u32 i = 0; i < NCPU; i++) for (u32 i = 0; i < NCPU; i++)
cpus[i].id = i; cpus[i].id = i;
ncpu = NCPU;
xnspid = new xns<u32, proc*, proc_hash>(false);
xnspid = new xns<u32, proc*, proc_hash>(false);
initgc(); initgc();
printf("Hello world!\n"); pthread_barrier_init(&populate_b, 0, 2);
sleep(100); crange cr(l2(crange_items));
threadpin(populate, &cr, "populate", 0);
pthread_barrier_wait(&populate_b);
pthread_barrier_init(&worker_b, 0, ncpu+1);
for (u32 i = 0; i < ncpu; i++) {
char buf[32];
sprintf(buf, "worker%d", i);
threadpin(worker, &cr, buf, i);
}
pthread_barrier_wait(&worker_b);
printf("exiting\n");
} }
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论