Fix Remote Braille ordering and lease cleanup

This commit is contained in:
ak47 committed 2026-11-06 19:01:25 -05:00
1 parent 1c8ec3ce10
commit 952d3c8204
4 files changed
+123 -14

No files matched your search

+14 -7
View File
@@ -9,7 +9,7 @@ import (
"context"
"encoding/json"
"errors"
"io"
"os"
"os/exec"
"slices"
"time"
@@ -29,7 +29,7 @@ type virtualBraille interface {
type processVirtualBraille struct {
cmd *exec.Cmd
stdin io.WriteCloser
stdin *os.File
encoder *json.Encoder
responses chan braille.VirtualResponse
done chan struct{}
@@ -45,12 +45,13 @@ func start_virtual_braille(path string) (virtualBraille, error) {
}
stdout, err := cmd.StdoutPipe()
if err != nil {
_ = stdin.Close()
return nil, err
}
if err := cmd.Start(); err != nil {
return nil, err
}
helper := &processVirtualBraille{cmd: cmd, stdin: stdin, encoder: json.NewEncoder(stdin),
helper := &processVirtualBraille{cmd: cmd, stdin: stdin.(*os.File), encoder: json.NewEncoder(stdin),
responses: make(chan braille.VirtualResponse, 16), done: make(chan struct{})}
go func() {
defer close(helper.responses)
@@ -72,6 +73,10 @@ func start_virtual_braille(path string) (virtualBraille, error) {
}
func (helper *processVirtualBraille) Send(request braille.VirtualRequest) error {
// A wedged translator must not prevent lease cleanup or owner shutdown.
if err := helper.stdin.SetWriteDeadline(time.Now().Add(time.Second)); err != nil {
return err
}
return helper.encoder.Encode(request)
}
@@ -197,9 +202,7 @@ func (runtime *tentacleRuntime) start_remote_braille(ctx context.Context, sessio
continue
}
helper, responses, exportLease, exportDone = started, started.Responses(), delivery.Lease, delivery.Context.Done()
if frame, ok := worker.SetRemoteExport(offer); ok {
offer(frame)
}
worker.SetRemoteExport(offer)
}
width := value.Width
if helper.Send(braille.VirtualRequest{Width: &width}) != nil {
@@ -240,7 +243,11 @@ func (runtime *tentacleRuntime) start_remote_braille(ctx context.Context, sessio
continue
}
if response.Route != nil {
worker.RouteExported(ctx, *response.Route)
// A buffered helper response can race lease revocation.
leaseCtx, err := session.RemoteContext(exportLease, "braille-stream")
if err == nil && allowed() {
worker.RouteExported(leaseCtx, *response.Route)
}
} else if len(response.Cells) != 0 && allowed() {
if errors.Is(session.PublishRemoteBraille(exportLease, tentaclewire.RemoteBraille{Op: "cells", Cells: response.Cells}), tentacle.ErrLimit) {
stopExport()