(n *Nylon, rw *bufio.ReadWriter)
| 470 | } |
| 471 | |
| 472 | func handleTrace(n *Nylon, rw *bufio.ReadWriter) error { |
| 473 | if !n.DBG_trace_tc { |
| 474 | if err := writeResponse(rw, errResponse("tracing not enabled; restart with --dbg-trace-tc")); err != nil { |
| 475 | return err |
| 476 | } |
| 477 | return device.ErrIPCStatusHandled |
| 478 | } |
| 479 | // Send initial OK |
| 480 | if err := writeResponse(rw, &protocol.IpcResponse{Ok: true}); err != nil { |
| 481 | return err |
| 482 | } |
| 483 | ctx, cancel := context.WithCancel(context.Background()) |
| 484 | go func() { |
| 485 | _, _ = rw.ReadByte() // wait for EOF / disconnect |
| 486 | cancel() |
| 487 | }() |
| 488 | ch := make(chan interface{}) |
| 489 | n.Trace.Register(ch) |
| 490 | defer n.Trace.Unregister(ch) |
| 491 | for { |
| 492 | select { |
| 493 | case <-ctx.Done(): |
| 494 | return device.ErrIPCStatusHandled |
| 495 | case msg := <-ch: |
| 496 | if str, ok := msg.(string); ok { |
| 497 | resp := &protocol.IpcResponse{ |
| 498 | Ok: true, |
| 499 | Response: &protocol.IpcResponse_Trace{Trace: &protocol.TraceEvent{Line: str}}, |
| 500 | } |
| 501 | if err := writeResponse(rw, resp); err != nil { |
| 502 | return device.ErrIPCStatusHandled |
| 503 | } |
| 504 | } |
| 505 | } |
| 506 | } |
| 507 | } |
no test coverage detected