@@ -171,8 +171,7 @@ let determineFsiPath () =
171171else
172172 raise( SessionError( VFSIstrings.SR.couldNotFindFsiExe fsiRegistryPath))
173173
174- let readLinesAsync ( reader : System.IO.StreamReader ): IEvent < string > =
175- let newLine = Event<_>()
174+ let readLinesAsync ( reader : System.IO.StreamReader ) trigger =
176175let buffer = System.Text.StringBuilder( 1024 )
177176let byteBuffer = Array.zeroCreate128
178177let encoding = System.Text.Encoding.UTF8
@@ -188,7 +187,7 @@ let readLinesAsync(reader: System.IO.StreamReader): IEvent<string> =
188187let c = buffer.[ pos]
189188if c= '\r' || c= '\n' then
190189let line = buffer.ToString( 0 , pos)
191- newLine.Trigger line
190+ trigger line
192191
193192let deletePos =
194193if c= '\r' && ( pos+ 1 ) < buffer.Length&& buffer.[ pos+ 1 ] = '\n' then pos+ 2 else pos+ 1
@@ -211,7 +210,6 @@ let readLinesAsync(reader: System.IO.StreamReader): IEvent<string> =
211210return ! read newPos
212211}
213212 Async.StartImmediate( read0 )
214- newLine.Publish
215213
216214let fsiStartInfo channelName =
217215let procInfo = new ProcessStartInfo()
@@ -251,12 +249,20 @@ let fsiProcess (procInfo:ProcessStartInfo) =
251249let errW , errE = let e = new Event<_>() in e.Trigger, e.Publish
252250let exitE = ( cmdProcess.Exited|> Observable.map( fun x -> x)) // this gives the event the F# "standard" event type IEvent<'a> rather than IEvent<_,_>
253251
254- let _ = cmdProcess.Start()
255- // wire up output (to both stdout and stderr)
256- readLinesAsync cmdProcess.StandardOutput|> catchAll|> Observable.add( fun data ->
252+ let stdOutNewLine = Event<_>()
253+ let stdErrNewLine = Event<_>()
254+
255+ // add subscribers prior to hooking to events to avoid data loss if event is emitted before the subscription
256+ stdOutNewLine.Publish|> catchAll|> Observable.add( fun data ->
257257//System.Windows.Forms.MessageBox.Show (sprintf "OutputDataRecieved '%s'\n" data.Data) |> ignore
258- outW( data));
259- readLinesAsync cmdProcess.StandardError|> catchAll|> Observable.add( fun data -> errW( data));
258+ outW( data)
259+ );
260+ stdErrNewLine.Publish|> catchAll|> Observable.add( fun data -> errW( data))
261+
262+ let _ = cmdProcess.Start()
263+ // hook up stdout\stderr data events
264+ readLinesAsync cmdProcess.StandardOutput stdOutNewLine.Trigger
265+ readLinesAsync cmdProcess.StandardError stdErrNewLine.Trigger
260266
261267// wire up input
262268// Fix 982: Force input to be written in UTF8 regardless of the apparent encoding.