# Copyright 2005-2007 Kevin Reid, under the terms of the MIT X license # found at http://www.opensource.org/licenses/mit-license.html ................ This test exists for the purpose of exercising the general file-descriptor-stream code in E-on-CL. ? pragma.enable("dot-props") > def ALL := EIO::ALL > null XXX to be reviewed: makePipe should probably not be in the privilegedScope top level, but we have no suitable namespace for it as yet x ? makePipe x # value: ? interp.waitAtTop(def pipe := makePipe <- run(throw)) ? def [i, o] := pipe # value: [<-, ->] ? o.reserve() <- resolve([9]); null ? o.flush() ? interp.waitAtTop(def r := i.takeAtMost(ALL)) ? [r] # value: [[9]] closure propagation, write-to-read ? o.reserve() <- resolve(null); null ? interp.waitAtTop(def r := i.takeAtMost(ALL)) ? [r] # value: [null] closure propagation, read-to-write ? interp.waitAtTop(def pipe := makePipe <- run(throw)) ? def [i, o] := pipe # value: [<-, ->] ? i.close(); null ? o.reserve() <- resolve([10]); o.flush() # XXX done solely to trigger a write which will notice the failure -- necessary? ? interp.waitAtTop(o.terminates()) ? o.terminates() # value: XXX review wording of error (this one is inherited from SBCL errno handling) closing write end does not discard data ? interp.waitAtTop(def pipe := makePipe <- run(throw)) ? def [i, o] := pipe; null attempt to stuff all buffers ? var written := 0 > def t := timer.now() + 2000 > var r := null > while (r := o.reserve() > Ref.isNear(r)) { > written += 65536 > r.resolve([233] * 65536) > o.flush() > } > r <- resolve(null) > trace(`$written elements stuffed`) > null ? var read := 0 > def r() :any { > trace(`$read`) > def done > when (def v := i.takeAtMost(ALL)) -> { trace(`taken`); bind done := switch (v) {match l :List { read += l.size(); trace(`recurring`); r()} match _ {trace(`stopping`);null}} } > return done > } > interp.waitAtTop(r()) ? read - written # value: 0 taking 0, no data ? interp.waitAtTop(def pipe := makePipe <- run(throw)) ? def [i, o] := pipe; null ? interp.waitAtTop(def r := i <- takeAtMost(0)) ? r # value: [] taking 0, with data ? interp.waitAtTop(def pipe := makePipe <- run(throw)) ? def [i, o] := pipe; null ? o.reserve() <- resolve([73]); null ? interp.waitAtTop(def r := i <- takeAtMost(0)) ? r # value: [] taking 0, closed ? interp.waitAtTop(def pipe := makePipe <- run(throw)) ? def [i, o] := pipe; null ? o.reserve() <- resolve(null); null ? interp.waitAtTop(def r := i <- takeAtMost(0)) ? r # value: [] XXX this should be null instead File descriptor GC test ? pragma.enable("accumulator") ? var n := 1024 > interp.waitAtTop(def r := def loop() { > return if ((n -= 1) >= 0) { > when (makePipe <- run(throw)) -> { > loop() > } > } else { true } > }.run()) ? Ref.fulfillment(r) # value: true