⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 richards.js.svn-base

📁 Google浏览器V8内核代码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
}/** * The task is running and is currently scheduled. */var STATE_RUNNING = 0;/** * The task has packets left to process. */var STATE_RUNNABLE = 1;/** * The task is not currently running.  The task is not blocked as such and may* be started by the scheduler. */var STATE_SUSPENDED = 2;/** * The task is blocked and cannot be run until it is explicitly released. */var STATE_HELD = 4;var STATE_SUSPENDED_RUNNABLE = STATE_SUSPENDED | STATE_RUNNABLE;var STATE_NOT_HELD = ~STATE_HELD;TaskControlBlock.prototype.setRunning = function () {  this.state = STATE_RUNNING;};TaskControlBlock.prototype.markAsNotHeld = function () {  this.state = this.state & STATE_NOT_HELD;};TaskControlBlock.prototype.markAsHeld = function () {  this.state = this.state | STATE_HELD;};TaskControlBlock.prototype.isHeldOrSuspended = function () {  return (this.state & STATE_HELD) != 0 || (this.state == STATE_SUSPENDED);};TaskControlBlock.prototype.markAsSuspended = function () {  this.state = this.state | STATE_SUSPENDED;};TaskControlBlock.prototype.markAsRunnable = function () {  this.state = this.state | STATE_RUNNABLE;};/** * Runs this task, if it is ready to be run, and returns the next task to run. */TaskControlBlock.prototype.run = function () {  var packet;  if (this.state == STATE_SUSPENDED_RUNNABLE) {    packet = this.queue;    this.queue = packet.link;    if (this.queue == null) {      this.state = STATE_RUNNING;    } else {      this.state = STATE_RUNNABLE;    }  } else {    packet = null;  }  return this.task.run(packet);};/** * Adds a packet to the worklist of this block's task, marks this as runnable if * necessary, and returns the next runnable object to run (the one * with the highest priority). */TaskControlBlock.prototype.checkPriorityAdd = function (task, packet) {  if (this.queue == null) {    this.queue = packet;    this.markAsRunnable();    if (this.priority > task.priority) return this;  } else {    this.queue = packet.addTo(this.queue);  }  return task;};TaskControlBlock.prototype.toString = function () {  return "tcb { " + this.task + "@" + this.state + " }";};/** * An idle task doesn't do any work itself but cycles control between the two * device tasks. * @param {Scheduler} scheduler the scheduler that manages this task * @param {int} v1 a seed value that controls how the device tasks are scheduled * @param {int} count the number of times this task should be scheduled * @constructor */function IdleTask(scheduler, v1, count) {  this.scheduler = scheduler;  this.v1 = v1;  this.count = count;}IdleTask.prototype.run = function (packet) {  this.count--;  if (this.count == 0) return this.scheduler.holdCurrent();  if ((this.v1 & 1) == 0) {    this.v1 = this.v1 >> 1;    return this.scheduler.release(ID_DEVICE_A);  } else {    this.v1 = (this.v1 >> 1) ^ 0xD008;    return this.scheduler.release(ID_DEVICE_B);  }};IdleTask.prototype.toString = function () {  return "IdleTask"};/** * A task that suspends itself after each time it has been run to simulate * waiting for data from an external device. * @param {Scheduler} scheduler the scheduler that manages this task * @constructor */function DeviceTask(scheduler) {  this.scheduler = scheduler;  this.v1 = null;}DeviceTask.prototype.run = function (packet) {  if (packet == null) {    if (this.v1 == null) return this.scheduler.suspendCurrent();    var v = this.v1;    this.v1 = null;    return this.scheduler.queue(v);  } else {    this.v1 = packet;    return this.scheduler.holdCurrent();  }};DeviceTask.prototype.toString = function () {  return "DeviceTask";};/** * A task that manipulates work packets. * @param {Scheduler} scheduler the scheduler that manages this task * @param {int} v1 a seed used to specify how work packets are manipulated * @param {int} v2 another seed used to specify how work packets are manipulated * @constructor */function WorkerTask(scheduler, v1, v2) {  this.scheduler = scheduler;  this.v1 = v1;  this.v2 = v2;}WorkerTask.prototype.run = function (packet) {  if (packet == null) {    return this.scheduler.suspendCurrent();  } else {    if (this.v1 == ID_HANDLER_A) {      this.v1 = ID_HANDLER_B;    } else {      this.v1 = ID_HANDLER_A;    }    packet.id = this.v1;    packet.a1 = 0;    for (var i = 0; i < DATA_SIZE; i++) {      this.v2++;      if (this.v2 > 26) this.v2 = 1;      packet.a2[i] = this.v2;    }    return this.scheduler.queue(packet);  }};WorkerTask.prototype.toString = function () {  return "WorkerTask";};/** * A task that manipulates work packets and then suspends itself. * @param {Scheduler} scheduler the scheduler that manages this task * @constructor */function HandlerTask(scheduler) {  this.scheduler = scheduler;  this.v1 = null;  this.v2 = null;}HandlerTask.prototype.run = function (packet) {  if (packet != null) {    if (packet.kind == KIND_WORK) {      this.v1 = packet.addTo(this.v1);    } else {      this.v2 = packet.addTo(this.v2);    }  }  if (this.v1 != null) {    var count = this.v1.a1;    var v;    if (count < DATA_SIZE) {      if (this.v2 != null) {        v = this.v2;        this.v2 = this.v2.link;        v.a1 = this.v1.a2[count];        this.v1.a1 = count + 1;        return this.scheduler.queue(v);      }    } else {      v = this.v1;      this.v1 = this.v1.link;      return this.scheduler.queue(v);    }  }  return this.scheduler.suspendCurrent();};HandlerTask.prototype.toString = function () {  return "HandlerTask";};/* --- * * P a c k e t * --- */var DATA_SIZE = 4;/** * A simple package of data that is manipulated by the tasks.  The exact layout * of the payload data carried by a packet is not importaint, and neither is the * nature of the work performed on packets by the tasks. * * Besides carrying data, packets form linked lists and are hence used both as * data and worklists. * @param {Packet} link the tail of the linked list of packets * @param {int} id an ID for this packet * @param {int} kind the type of this packet * @constructor */function Packet(link, id, kind) {  this.link = link;  this.id = id;  this.kind = kind;  this.a1 = 0;  this.a2 = new Array(DATA_SIZE);}/** * Add this packet to the end of a worklist, and return the worklist. * @param {Packet} queue the worklist to add this packet to */Packet.prototype.addTo = function (queue) {  this.link = null;  if (queue == null) return this;  var peek, next = queue;  while ((peek = next.link) != null)    next = peek;  next.link = this;  return queue;};Packet.prototype.toString = function () {  return "Packet";};

⌨️ 快捷键说明

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