📄 richards.js.svn-base
字号:
}/** * 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 + -