# IOBuffer becomes not writable after \`run\`

**URL:** <https://discourse.julialang.org/t/iobuffer-becomes-not-writable-after-run/92323>\
**Category:** General Usage\
**Created:** [December 30, 2022, 5:56pm UTC](https://discourse.julialang.org/t/iobuffer-becomes-not-writable-after-run/92323 "2022-12-30T17:56:23Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![felipenoris](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/felipenoris/32/553_2.png) [@felipenoris](https://discourse.julialang.org/u/felipenoris)\
**Post date:** [December 30, 2022, 5:56pm UTC](https://discourse.julialang.org/t/iobuffer-becomes-not-writable-after-run/92323/1 "2022-12-30T17:56:23Z")

</div>

Hi! When upgrading from Julia v1.7 to Julia v1.8, I noticed this change of behavior when using `run` passing an `IOBuffer` as `stdout` kwarg.

On Julia v1.7, I could pass the same instance of the `IOBuffer` to consecutive `run` calls, as follows:

```julia
julia> VERSION
v"1.7.2"

julia> io = IOBuffer()
IOBuffer(data=UInt8[...], readable=true, writable=true, seekable=true, append=false, size=0, maxsize=Inf, ptr=1, mark=-1)

julia> run(pipeline(`ls`, stdout=io))
Process(`ls`, ProcessExited(0))

julia> iswritable(io)
true

julia> run(pipeline(`ls`, stdout=io))
Process(`ls`, ProcessExited(0))

```

Upgrading to Julia v1.8, the `IOBuffer` becomes not writable after the first call to `run`, which yields an error if I use it on another `run` call.

```julia
julia> VERSION
v"1.8.4"

julia> io = IOBuffer()
IOBuffer(data=UInt8[...], readable=true, writable=true, seekable=true, append=false, size=0, maxsize=Inf, ptr=1, mark=-1)

julia> run(pipeline(`ls`, stdout=io))
Process(`ls`, ProcessExited(0))

julia> iswritable(io)
false

julia> run(pipeline(`ls`, stdout=io))
┌ Warning: Process I/O error
│ exception =
│ ArgumentError: ensureroom failed, IOBuffer is not writeable
│ Stacktrace:
│ [1] ensureroom_slowpath(io::IOBuffer, nshort::UInt64)
│ @ Base ./iobuffer.jl:303
│ [2] ensureroom
│ @ ./iobuffer.jl:325 [inlined]
│ [3] unsafe_write(to::IOBuffer, p::Ptr{UInt8}, nb::UInt64)
│ @ Base ./iobuffer.jl:424
│ [4] unsafe_write
│ @ ./io.jl:683 [inlined]
│ [5] write
│ @ ./io.jl:706 [inlined]
│ [6] write(to::IOBuffer, from::Base.PipeEndpoint)
│ @ Base ./io.jl:753
│ [7] (::Base.var"#729#730"{IOBuffer, Bool, Base.PipeEndpoint, IOBuffer, Base.PipeEndpoint})()
│ @ Base ./task.jl:484
└ @ Base process.jl:302
Process(`ls`, ProcessExited(0))

```

Is there a way to use the same `IOBuffer` instance as `stdout` on consecutive `run` calls on Julia v1.8?

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [December 30, 2022, 9:37pm UTC](https://discourse.julialang.org/t/iobuffer-becomes-not-writable-after-run/92323/2 "2022-12-30T21:37:32Z")

</div>

> [@felipenoris](#):
>
> Is there a way to use the same `IOBuffer` instance as `stdout` on consecutive `run` calls on Julia v1.8?

Just setting `io.writable = true` in between the successive `run` calls works, though it seems like a bit of a hack.

---

<div class="post-metadata">

**Author:** ![jameson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jameson/32/23_2.png) [@jameson](https://discourse.julialang.org/u/jameson)\
**Post date:** [January 2, 2023, 3:06am UTC](https://discourse.julialang.org/t/iobuffer-becomes-not-writable-after-run/92323/3 "2023-01-02T03:06:07Z")

</div>

That makes a data race, which may go very very badly for you—as in randomly occasionally corrupt your whole computer kinds of ways (which is why this now does not function as before)
