Fix Remote Braille ordering and lease cleanup
This commit is contained in:
1 parent
1c8ec3ce10
commit
952d3c8204
4 files changed
+123
-14
No files matched your search
@@ -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()
|
||||
|
||||
Reference in new issue
Block a user