MCPcopy Index your code
hub / github.com/coder/coder / createX11Session

Method createX11Session

agent/agentssh/x11.go:226–264  ·  view source on GitHub ↗

createX11Session creates an X11 forwarding session.

(ctx context.Context, sshSession ssh.Session)

Source from the content-addressed store, hash-verified

224
225// createX11Session creates an X11 forwarding session.
226func (x *x11Forwarder) createX11Session(ctx context.Context, sshSession ssh.Session) (*x11Session, error) {
227 var (
228 ln net.Listener
229 display int
230 err error
231 )
232 // retry listener creation after evictions. Limit to 10 retries to prevent pathological cases looping forever.
233 const maxRetries = 10
234 for try := range maxRetries {
235 ln, display, err = x.createX11Listener(ctx)
236 if err == nil {
237 break
238 }
239 if try == maxRetries-1 {
240 return nil, xerrors.New("max retries exceeded while creating X11 session")
241 }
242 x.logger.Warn(ctx, "failed to create X11 listener; will evict an X11 forwarding session",
243 slog.F("num_current_sessions", x.numSessions()),
244 slog.Error(err))
245 x.evictLeastRecentlyUsedSession()
246 }
247 x.mu.Lock()
248 defer x.mu.Unlock()
249 if x.closing {
250 closeErr := ln.Close()
251 if closeErr != nil {
252 x.logger.Error(ctx, "error closing X11 listener", slog.Error(closeErr))
253 }
254 return nil, xerrors.New("server is closing")
255 }
256 x11Sess := &x11Session{
257 session: sshSession,
258 display: display,
259 listener: ln,
260 usedAt: time.Now(),
261 }
262 x.sessions[x11Sess] = struct{}{}
263 return x11Sess, nil
264}
265
266func (x *x11Forwarder) numSessions() int {
267 x.mu.Lock()

Callers 1

x11HandlerMethod · 0.95

Calls 8

createX11ListenerMethod · 0.95
numSessionsMethod · 0.95
NewMethod · 0.65
CloseMethod · 0.65
ErrorMethod · 0.45
LockMethod · 0.45
UnlockMethod · 0.45

Tested by

no test coverage detected