提交 32692beb 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

wq_pushto(), for pushing work to a particular core

上级 9999dcb5
...@@ -4,6 +4,7 @@ class work; ...@@ -4,6 +4,7 @@ class work;
int wq_trywork(void); int wq_trywork(void);
int wq_push(work *w); int wq_push(work *w);
int wq_pushto(work *w, int tcpuid);
void wq_dump(void); void wq_dump(void);
size_t wq_size(void); size_t wq_size(void);
void initwq(void); void initwq(void);
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
class wq { class wq {
public: public:
wq(); wq();
int push(work *w); int push(work *w, int tcpuid);
int trywork(); int trywork();
void dump(); void dump();
...@@ -57,7 +57,13 @@ wq_size(void) ...@@ -57,7 +57,13 @@ wq_size(void)
int int
wq_push(work *w) wq_push(work *w)
{ {
return wq_->push(w); return wq_->push(w, mycpuid());
}
int
wq_pushto(work *w, int tcpuid)
{
return wq_->push(w, tcpuid);
} }
int int
...@@ -128,24 +134,24 @@ wq::declen(int c) ...@@ -128,24 +134,24 @@ wq::declen(int c)
} }
int int
wq::push(work *w) wq::push(work *w, int tcpuid)
{ {
int i; int i;
pushcli(); acquire(&q_[tcpuid].lock);
i = q_->head; i = q_[tcpuid].head;
if ((i - q_->tail) == NSLOTS) { if ((i - q_[tcpuid].tail) == NSLOTS) {
stat_->full++; stat_[tcpuid].full++;
popcli(); release(&q_[tcpuid].lock);
return -1; return -1;
} }
i = i & (NSLOTS-1); i = i & (NSLOTS-1);
q_->w[i] = w; q_[tcpuid].w[i] = w;
barrier(); barrier();
q_->head++; q_[tcpuid].head++;
inclen(mycpuid()); inclen(tcpuid);
stat_->push++; stat_[tcpuid].push++;
popcli(); release(&q_[tcpuid].lock);
return 0; return 0;
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论