git ssb

0+

wanderer🌟 / js-primea-hypervisor



Commit c091abb0870d405499f6c16a44b7e83135f443d2

added valid port checks

wanderer committed on 5/15/2017, 9:39:17 PM
Parent: 96e39ab7ae1995be4bbba6a87ca43f4a1e310e4c

Files changed

kernel.jschanged
portManager.jschanged
tests/index.jschanged
kernel.jsView
@@ -115,8 +115,12 @@
115115 }
116116 }
117117
118118 async send (portRef, message) {
119+ if (!this.ports.isValidPort(portRef)) {
120+ throw new Error('invalid port referance')
121+ }
122+
119123 message._fromPort = this.entryPort
120124 message._fromPortTicks = this.ticks
121125
122126 const vm = await this.hypervisor.getInstance(portRef, true, this.entryPort)
portManager.jsView
@@ -14,8 +14,9 @@
1414 } else if (!b) {
1515 return pairA
1616 }
1717
18+ // order by number of ticks if messages have different number of ticks
1819 if (a._fromPortTicks !== b._fromPortTicks) {
1920 return a._fromPortTicks < b._fromPortTicks ? pairA : pairB
2021 } else if (a.priority !== b.priority) {
2122 // decide by priority
@@ -37,9 +38,9 @@
3738
3839 async start () {
3940 // skip the root, since it doesn't have a parent
4041 if (this.parentPort !== undefined) {
41- this._portMap.set(this.parentPort, new Port(ENTRY))
42+ this._mapPort(ENTRY, this.parentPort)
4243 }
4344 // map ports to thier id's
4445 this.ports = await this.hypervisor.graph.get(this.state, 'ports')
4546 Object.keys(this.ports).map(name => {
@@ -60,8 +61,18 @@
6061 get (key) {
6162 return this.ports[key]
6263 }
6364
65+ delete (key) {
66+ const port = this.ports[key]
67+ delete this.ports[key]
68+ this._portMap.delete(port)
69+ }
70+
71+ isValidPort (port) {
72+ return this._portMap.has(port)
73+ }
74+
6475 create (type, name) {
6576 const VM = this.hypervisor._VMs[type]
6677 const parentId = this.entryPort ? this.entryPort.id : null
6778 let nonce = this.state['/'].nonce
@@ -79,9 +90,9 @@
7990 '/': VM.createState()
8091 }
8192 }
8293
83- // create the port instance
94+ // save the port instance
8495 this.ports[name] = portRef
8596 this._mapPort(name, portRef)
8697
8798 // incerment the nonce
@@ -101,13 +112,16 @@
101112 const promises = unkownPorts.map(async ([portRef, port]) => {
102113 // update the port's tick count
103114 port.ticks = await this.hypervisor.wait(portRef, threshold, this.entryPort)
104115 })
116+
105117 return Promise.all(promises)
106118 }
107119
108120 async getNextMessage () {
109- await this.wait(this.kernel.ticks, this.entryPort)
110- const portMap = [...this._portMap].reduce(messageArbiter)
111- return portMap[1].shift()
121+ if (this._portMap.size) {
122+ await this.wait(this.kernel.ticks, this.entryPort)
123+ const portMap = [...this._portMap].reduce(messageArbiter)
124+ return portMap[1].shift()
125+ }
112126 }
113127 }
tests/index.jsView
@@ -201,13 +201,11 @@
201201 tape('traps', async t => {
202202 t.plan(1)
203203 class Root extends BaseContainer {
204204 async run (m) {
205- await Promise.all([
206- this.kernel.ports.create('root', 'one'),
207- this.kernel.ports.create('root', 'two'),
208- this.kernel.ports.create('root', 'three')
209- ])
205+ this.kernel.ports.create('root', 'one')
206+ this.kernel.ports.create('root', 'two')
207+ this.kernel.ports.create('root', 'three')
210208
211209 throw new Error('it is a trap!!!')
212210 }
213211 }
@@ -227,8 +225,38 @@
227225 }
228226 }, 'should revert the state')
229227 })
230228
229+ tape('invalid port referances', async t => {
230+ t.plan(2)
231+ class Root extends BaseContainer {
232+ async run (m) {
233+ const ports = this.kernel.ports.create('root', 'three')
234+ this.kernel.ports.delete('three')
235+ try {
236+ await this.kernel.send(ports, new Message())
237+ } catch (e) {
238+ t.pass()
239+ }
240+ }
241+ }
242+
243+ const hypervisor = new Hypervisor({
244+ dag: node.dag
245+ })
246+
247+ hypervisor.registerContainer('root', Root)
248+ const root = await hypervisor.createInstance('root')
249+ await root.run()
250+
251+ t.deepEquals(root.state, {
252+ '/': {
253+ nonce: [1],
254+ ports: {}
255+ }
256+ })
257+ })
258+
231259 tape('message should arrive in the correct oder if sent in order', async t => {
232260 t.plan(2)
233261
234262 class Root extends BaseContainer {

Built with git-ssb-web