whoqueue.d

来自「Sun Solaris 10 中的 DTrace 组件的源代码。请参看: htt」· D 代码 · 共 70 行

D
70
字号
#pragma D option quiet#pragma D option nspec=4#pragma D option specsize=100kint maxlen;int spec[int];sched:::enqueue{	this->len = ++qlen[this->cpu = args[2]->cpu_id];	in[args[0]->pr_addr] = timestamp;}sched:::enqueue/this->len > maxlen && spec[this->cpu]/{	/*	 * There is already a speculation for this CPU.  We just set a new	 * record, so we'll discard the old one.	 */	discard(spec[this->cpu]);}sched:::enqueue/this->len > maxlen/{	/*	 * We have a winner.  Set the new maximum length and set the timestamp	 * of the longest length.	 */	maxlen = this->len;	longtime[this->cpu] = timestamp;		/*	 * Now start a new speculation, and speculatively trace the length.	 */	this->spec = spec[this->cpu] = speculation();	speculate(this->spec);	printf("Run queue of length %d:\n", this->len);}sched:::dequeue/(this->in = in[args[0]->pr_addr]) &&    this->in <= longtime[this->cpu = args[2]->cpu_id]/{	speculate(spec[this->cpu]);	printf("  %d/%d (%s)\n", 	    args[1]->pr_pid, args[0]->pr_lwpid,	    stringof(args[1]->pr_fname));}sched:::dequeue/qlen[args[2]->cpu_id]/{	in[args[0]->pr_addr] = 0;	this->len = --qlen[args[2]->cpu_id];}sched:::dequeue/this->len == 0 && spec[this->cpu]/{	/*	 * We just processed the last thread that was enqueued at the time	 * of longest length; commit the speculation, which by now contains	 * each thread that was enqueued when the queue was longest.	 */	commit(spec[this->cpu]);	spec[this->cpu] = 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?