This is an automated email from the git hooks/post-receive script.
civodul pushed a commit to branch master
in repository maintenance.
The following commit(s) were added to refs/heads/master by this push:
new fd95c8df talks: Add FOSDEM Shepherd talk.
fd95c8df is described below
commit fd95c8df7428eeed8c9ac601e205a2cd07406a5f
Author: Ludovic Courtès <[email protected]>
AuthorDate: Tue Jan 28 23:52:29 2025 +0100
talks: Add FOSDEM Shepherd talk.
* talks/fosdem-2025/shepherd: New directory.
---
talks/beamer-manifest.scm | 4 +-
.../shepherd/images/accept-read-commands.pdf | Bin 0 -> 45556 bytes
talks/fosdem-2025/shepherd/images/fibers-leak1.png | Bin 0 -> 43658 bytes
talks/fosdem-2025/shepherd/images/fibers-leak2.png | Bin 0 -> 40230 bytes
.../shepherd/images/fork+exec-SIGCHLD.pdf | Bin 0 -> 23332 bytes
.../shepherd/images/fork+exec-pid-file.pdf | Bin 0 -> 73518 bytes
.../shepherd/images/linux-magazine-headline.png | Bin 0 -> 42591 bytes
.../shepherd/images/linux-magazine-logo.png | Bin 0 -> 3082 bytes
.../shepherd/images/romanian-shepherd.jpg | Bin 0 -> 306599 bytes
.../fosdem-2025/shepherd/images/service-states.pdf | Bin 0 -> 51642 bytes
.../fosdem-2025/shepherd/images/shepherd-logo.pdf | Bin 0 -> 3582 bytes
.../shepherd/images/spritely-shepherd.jpg | Bin 0 -> 322451 bytes
.../shepherd/images/systemd-auto-restart.png | Bin 0 -> 71898 bytes
talks/fosdem-2025/shepherd/outline.org | 27 +
talks/fosdem-2025/shepherd/talk.tex | 674 +++++++++++++++++++++
15 files changed, 704 insertions(+), 1 deletion(-)
diff --git a/talks/beamer-manifest.scm b/talks/beamer-manifest.scm
index 0848439c..0f9801f9 100644
--- a/talks/beamer-manifest.scm
+++ b/talks/beamer-manifest.scm
@@ -1,5 +1,5 @@
;;; Released under the GNU GPLv3 or any later version.
-;;; Copyright © 2021, 2023-2024 Ludovic Courtès <[email protected]>
+;;; Copyright © 2021, 2023-2025 Ludovic Courtès <[email protected]>
;; Manifest to create an environment to build LaTeX/Beamer slides. Inspired
;; by <https://github.com/etu/presentations/blob/master/shell.nix#L4-L15>.
@@ -16,6 +16,8 @@
"texlive-xkeyval" "texlive-mweights" "texlive-fontaxes"
"texlive-textpos" "texlive-fancyvrb" "texlive-xifthen"
"texlive-ifmtarg" "texlive-upquote"
+ "texlive-verbatimbox" "texlive-readarray" "texlive-forloop"
+ "texlive-listofitems"
"texlive-babel-french"
;; Additional fonts.
diff --git a/talks/fosdem-2025/shepherd/images/accept-read-commands.pdf
b/talks/fosdem-2025/shepherd/images/accept-read-commands.pdf
new file mode 100644
index 00000000..c2978d8c
Binary files /dev/null and
b/talks/fosdem-2025/shepherd/images/accept-read-commands.pdf differ
diff --git a/talks/fosdem-2025/shepherd/images/fibers-leak1.png
b/talks/fosdem-2025/shepherd/images/fibers-leak1.png
new file mode 100644
index 00000000..eb973f48
Binary files /dev/null and b/talks/fosdem-2025/shepherd/images/fibers-leak1.png
differ
diff --git a/talks/fosdem-2025/shepherd/images/fibers-leak2.png
b/talks/fosdem-2025/shepherd/images/fibers-leak2.png
new file mode 100644
index 00000000..f0fbe498
Binary files /dev/null and b/talks/fosdem-2025/shepherd/images/fibers-leak2.png
differ
diff --git a/talks/fosdem-2025/shepherd/images/fork+exec-SIGCHLD.pdf
b/talks/fosdem-2025/shepherd/images/fork+exec-SIGCHLD.pdf
new file mode 100644
index 00000000..84f4e8e3
Binary files /dev/null and
b/talks/fosdem-2025/shepherd/images/fork+exec-SIGCHLD.pdf differ
diff --git a/talks/fosdem-2025/shepherd/images/fork+exec-pid-file.pdf
b/talks/fosdem-2025/shepherd/images/fork+exec-pid-file.pdf
new file mode 100644
index 00000000..a790ce89
Binary files /dev/null and
b/talks/fosdem-2025/shepherd/images/fork+exec-pid-file.pdf differ
diff --git a/talks/fosdem-2025/shepherd/images/linux-magazine-headline.png
b/talks/fosdem-2025/shepherd/images/linux-magazine-headline.png
new file mode 100644
index 00000000..ca2eb304
Binary files /dev/null and
b/talks/fosdem-2025/shepherd/images/linux-magazine-headline.png differ
diff --git a/talks/fosdem-2025/shepherd/images/linux-magazine-logo.png
b/talks/fosdem-2025/shepherd/images/linux-magazine-logo.png
new file mode 100644
index 00000000..d548fc01
Binary files /dev/null and
b/talks/fosdem-2025/shepherd/images/linux-magazine-logo.png differ
diff --git a/talks/fosdem-2025/shepherd/images/romanian-shepherd.jpg
b/talks/fosdem-2025/shepherd/images/romanian-shepherd.jpg
new file mode 100644
index 00000000..6a9ca44c
Binary files /dev/null and
b/talks/fosdem-2025/shepherd/images/romanian-shepherd.jpg differ
diff --git a/talks/fosdem-2025/shepherd/images/service-states.pdf
b/talks/fosdem-2025/shepherd/images/service-states.pdf
new file mode 100644
index 00000000..ed8aa845
Binary files /dev/null and
b/talks/fosdem-2025/shepherd/images/service-states.pdf differ
diff --git a/talks/fosdem-2025/shepherd/images/shepherd-logo.pdf
b/talks/fosdem-2025/shepherd/images/shepherd-logo.pdf
new file mode 100644
index 00000000..54e07335
Binary files /dev/null and
b/talks/fosdem-2025/shepherd/images/shepherd-logo.pdf differ
diff --git a/talks/fosdem-2025/shepherd/images/spritely-shepherd.jpg
b/talks/fosdem-2025/shepherd/images/spritely-shepherd.jpg
new file mode 100644
index 00000000..dc26e5d2
Binary files /dev/null and
b/talks/fosdem-2025/shepherd/images/spritely-shepherd.jpg differ
diff --git a/talks/fosdem-2025/shepherd/images/systemd-auto-restart.png
b/talks/fosdem-2025/shepherd/images/systemd-auto-restart.png
new file mode 100644
index 00000000..e2059dab
Binary files /dev/null and
b/talks/fosdem-2025/shepherd/images/systemd-auto-restart.png differ
diff --git a/talks/fosdem-2025/shepherd/outline.org
b/talks/fosdem-2025/shepherd/outline.org
new file mode 100644
index 00000000..dc8b51d3
--- /dev/null
+++ b/talks/fosdem-2025/shepherd/outline.org
@@ -0,0 +1,27 @@
+#+TITLE: Outline
+
+- what it is
+ - CLI demo: `herd status` & co.
+ - fork+exec service
+ - inetd-style
+ - systemd-style
+ - timer
+ - config
+ - fork+exec, inetd, systemd, timer
+ - extensibility: file systems, containerized, etc.
+- what it does
+ - single-threaded: fork() in the road
+ - concurrency: wait for SIGCHLD, wait for PID files, wait for
+ incoming connections, do SIGTERM + wait + SIGKILL, etc.
+ - how one does it in C (systemd examples)
+ - [[file:/data/src/systemd/src/core/service.c::if (allow_restart)
{][auto-restart (respawning a service)]]
+ - [[file:/data/src/systemd/src/core/service.c::kill_operation =
state_to_kill_operation(s, state);][kill with grace period]]
+ - [[file:/data/src/systemd/src/core/service.c::case
SERVICE_START_POST:][waiting for PID file]]
+ - how one does it with Fibers (CSP)
+- threats
+ - GC
+ - continuation barriers
+ - blocking: get-message/put-message
+ - `thread apply all bt`
+- the future
+ - Goblins
diff --git a/talks/fosdem-2025/shepherd/talk.tex
b/talks/fosdem-2025/shepherd/talk.tex
new file mode 100644
index 00000000..6ef530db
--- /dev/null
+++ b/talks/fosdem-2025/shepherd/talk.tex
@@ -0,0 +1,674 @@
+% Make sure URLs are broken on hyphens.
+% See <https://tex.stackexchange.com/questions/3033/forcing-linebreaks-in-url>.
+\RequirePackage[hyphens]{url}
+
+\documentclass[aspectratio=169]{beamer}
+
+\usetheme{default}
+
+\usefonttheme{structurebold}
+
+% Nice sans-serif font.
+\usepackage[sfdefault,lining]{FiraSans} %% option 'sfdefault' activates Fira
Sans as the default text font
+\renewcommand*\oldstylenums[1]{{\firaoldstyle #1}}
+
+% Nice monospace font.
+\usepackage{inconsolata}
+%% \renewcommand*\familydefault{\ttdefault} %% Only if the base font of the
document is to be typewriter style
+%% \usepackage[T1]{fontenc}
+
+\usepackage[utf8]{inputenc}
+\PassOptionsToPackage{hyphens}{url}\usepackage{hyperref,xspace,multicol}
+
+\usecolortheme{seagull} % white on black
+\usepackage[absolute,overlay]{textpos}
+\usepackage{tikz,verbatimbox}
+\usetikzlibrary{arrows,shapes,trees,shadows,positioning}
+\usepackage{fancyvrb} % for '\Verb'
+\usepackage{xifthen} % for '\isempty'
+
+% Remember the position of every picture.
+\tikzstyle{every picture}+=[remember picture]
+
+\tikzset{onslide/.code args={<#1>#2}{%
+ \only<#1>{\pgfkeysalso{#2}} % \pgfkeysalso doesn't change the path
+}}
+
+% Colors.
+\definecolor{guixred1}{RGB}{226,0,38} % red P
+\definecolor{guixorange1}{RGB}{243,154,38} % guixorange P
+\definecolor{guixyellow}{RGB}{254,205,27} % guixyellow P
+\definecolor{guixred2}{RGB}{230,68,57} % red S
+\definecolor{guixred3}{RGB}{115,34,27} % dark red
+\definecolor{guixorange2}{RGB}{236,117,40} % guixorange S
+\definecolor{guixtaupe}{RGB}{134,113,127} % guixtaupe S
+\definecolor{guixgrey}{RGB}{91,94,111} % guixgrey S
+\definecolor{guixdarkgrey}{RGB}{46,47,55} % guixdarkgrey S
+\definecolor{guixblue1}{RGB}{38,109,131} % guixblue S
+\definecolor{guixblue2}{RGB}{10,50,80} % guixblue S
+\definecolor{guixgreen1}{RGB}{133,146,66} % guixgreen S
+\definecolor{guixgreen2}{RGB}{157,193,7} % guixgreen S
+
+\definecolor{rescienceyellow}{RGB}{254,246,91}
+
+\setbeamerfont{title}{size=\huge}
+\setbeamerfont{frametitle}{size=\huge}
+\setbeamerfont{normal text}{size=\Large}
+
+% White-on-black color theme.
+\setbeamercolor{structure}{fg=guixorange1,bg=black}
+\setbeamercolor{title}{fg=white,bg=black}
+\setbeamercolor{date}{fg=guixorange1,bg=black}
+\setbeamercolor{frametitle}{fg=white,bg=black}
+\setbeamercolor{titlelike}{fg=white,bg=black}
+\setbeamercolor{normal text}{fg=white,bg=black}
+\setbeamercolor{alerted text}{fg=guixyellow,bg=black}
+\setbeamercolor{section in toc}{fg=white,bg=black}
+\setbeamercolor{section in toc shaded}{fg=white,bg=black}
+\setbeamercolor{subsection in toc}{fg=guixorange1,bg=black}
+\setbeamercolor{subsection in toc shaded}{fg=white,bg=black}
+\setbeamercolor{subsubsection in toc}{fg=guixorange1,bg=black}
+\setbeamercolor{subsubsection in toc shaded}{fg=white,bg=black}
+\setbeamercolor{frametitle in toc}{fg=white,bg=black}
+\setbeamercolor{local structure}{fg=guixorange1,bg=black}
+
+\newcommand{\highlight}[1]{\alert{\textbf{#1}}}
+
+\title{Reproducible Software Deployment with GNU Guix}
+
+\author{Ludovic Courtès}
+\date{10 January 2025}
+
+\setbeamertemplate{navigation symbols}{} % remove the navigation bar
+
+\AtBeginSection[]{
+ \begin{frame}
+ \frametitle{}
+ \tableofcontents[currentsection]
+ \end{frame}
+}
+
+
+\newcommand{\screenshot}[2][width=\paperwidth]{
+ \begin{frame}[plain]
+ \begin{tikzpicture}[remember picture, overlay]
+ \node [at=(current page.center), inner sep=0pt]
+ {\includegraphics[{#1}]{#2}};
+ \end{tikzpicture}
+ \end{frame}
+}
+
+\newcommand{\screenshotwithurl}[3][width=\paperwidth]{
+ \begin{frame}[plain]
+ \begin{tikzpicture}[overlay]
+ \node [at=(current page.center), inner sep=0pt]
+ {\includegraphics[{#1}]{#2}};
+ \node [at=(current page.south), anchor=south, rounded corners,
+ inner sep=3mm, fill=guixdarkgrey, text opacity=1, opacity=.6,
+ text=white, outer sep=1mm] {
+ \url{#3}
+ };
+ \end{tikzpicture}
+ \end{frame}
+}
+
+\begin{document}
+
+%
https://fosdem.org/2025/schedule/event/fosdem-2025-5720-the-shepherd-minimalism-in-pid-1/
+\begin{frame}[plain, fragile]
+ \begin{tikzpicture}[overlay]
+ % https://commons.wikimedia.org/wiki/File:Rumunia_5806.jpg
+ \node [at=(current page.center), fill=black, opacity=.9] {
+ \includegraphics[width=1.2\textwidth]{images/romanian-shepherd}
+ };
+ \end{tikzpicture}
+
+ \vspace{35mm}
+ \Huge{\textbf{The Shepherd: \\ Minimalism in PID 1}}
+ \\[6mm]
+ \large{Ludovic Courtès}
+ \\[2mm]
+ \oldstylenums{FOSDEM, 2 February 2025}
+\end{frame}
+
+\begin{frame}[plain, fragile]
+ \begin{tikzpicture}[overlay]
+ % https://commons.wikimedia.org/wiki/File:Rumunia_5806.jpg
+ \node [at=(current page.center), fill=black, opacity=.3] {
+ \includegraphics[width=1.2\textwidth]{images/romanian-shepherd}
+ };
+ \end{tikzpicture}
+
+ \begin{semiverbatim}
+\textbf{From}: Wolfgang Jaehrling
+\textbf{Subject}: Announcement: dmd -0.7
+\textbf{Date}: Wed, 2 Apr 2003 21:44:52 +0200
+;; Announcement: dmd -0.7 -*- scheme -*-
+
+(define about-this-release
+ "This is the second public release of dmd, the `Daemon managing
+Daemons' (or `Daemons-managing Daemon'?). This version adds many
+convenient features and is thus a huge step forward, but still it is
+experimental software and you should expect it to break.")
+
+(define about-the-software
+ "The dmd program is a service manager, i.e. on the GNU system (which
+is the primary target), it replaces /sbin/init completely, on systems
+which are similar to Unix (e.g. GNU/Linux) it replaces the part of
+/sbin/init that is responsible for switching runlevels (/etc/rc?.d and
+/etc/init.d come to mind), respawning services (/etc/inittab comes to
+mind) and similar things.")
+ \end{semiverbatim}
+
+ \begin{tikzpicture}[overlay,
+ box/.style = { inner sep=5mm, rotate=-10, rounded corners=2mm,
+ fill=guixorange1, text=white, opacity=1,
+ drop shadow={opacity=0.4} } ]
+ \node<2-> (revived) at (current page) [box] {
+ \LARGE{\textbf{Revived in 2013!}}
+ };
+ \node<3-> [below=of revived] [box, rotate=10] {
+ \Huge{\textbf{1.0 in December 2024!}}
+ };
+ \end{tikzpicture}
+\end{frame}
+
+
+\setbeamercolor{normal text}{bg=guixblue1}
+\begin{frame}
+ \begin{overlayarea}{\textwidth}{8cm}
+ \begin{tikzpicture}[kernel/.style = {
+ text width=10cm, minimum height=1.4cm,
+ text centered,
+ rounded corners=2mm,
+ fill=white, text=black
+ },
+ userland/.style = {
+ draw=guixorange1, very thick,
+ fill=white, text=black, text width=6cm,
+ rounded corners=2mm, minimum height=1.4cm,
+ text centered
+ }]
+ \matrix[row sep=6mm, column sep=1cm] {
+ \node(kernel)[kernel]{\textbf{\Large{Linux-libre}}};
+ \\
+
+ \node<2->(initrd)[userland]{\textbf{\Large{initial RAM disk}}};
+ \\
+
+ \node<4->(shepherd)[userland]{\textbf{\Large{PID 1: The Shepherd!}}
+ \\ services...};
+ \\
+
+ \node<6->(user)[userland, dashed]{\textbf{\Large{applications}}};
+ \\
+ };
+
+ \path[->, very thick, draw=white]<2->
+ (kernel) edge (initrd);
+ \path[->, very thick, draw=white]<4->
+ (initrd) edge (shepherd);
+ \path[->, very thick, draw=white]<6->
+ (shepherd) edge (user);
+
+ \end{tikzpicture}
+ \end{overlayarea}
+
+ \begin{tikzpicture}[overlay,
+ guile/.style = {
+ fill=guixyellow, text=black, rotate=30,
+ rounded corners=4mm, text width=3cm,
+ opacity=.75, text opacity=1, text centered,
+ minimum height=1.3cm
+ }]
+ \node<3->(labelinitrd) [guile] at (initrd.east) {%
+ \Large{Guile}
+ };
+ \node<5->(labelinitrd) [guile] at (shepherd.east) {%
+ \Large{Guile}
+ };
+ \end{tikzpicture}
+\end{frame}
+
+\setbeamercolor{normal text}{bg=guixdarkgrey}
+\begin{frame}[plain, fragile]
+ \begin{tikzpicture}[overlay]
+ \node[shape=star, star points=9, fill=guixorange2,
+ inner sep=5mm, at=(current page.center),
+ font=\Huge] {
+ \textbf{Demo time!}
+ };
+ \end{tikzpicture}
+\end{frame}
+
+\begin{frame}[fragile, plain]
+ \large{
+ \begin{semiverbatim}
+(\alert{define} sshd
+ (\alert{service}
+ '(sshd ssh-daemon) ;for convenience, give it two names
+ \alert{#:start} (make-forkexec-constructor
+ '("/usr/sbin/sshd" "-D")
+ \alert{#:pid-file} "/etc/ssh/sshd.pid")
+ \alert{#:stop} (make-kill-destructor)
+ \alert{#:respawn?} #t))
+
+(register-services (list sshd))
+(start-in-the-background '(sshd))
+ \end{semiverbatim}
+ }
+\end{frame}
+
+\begin{frame}[fragile, plain]
+ \large{
+ \begin{semiverbatim}
+(\alert{define} sshd
+ (\alert{service}
+ '(sshd ssh-daemon)
+ \alert{#:start} (make-inetd-constructor
+ '("/usr/sbin/sshd" "-D" "-i")
+ (list (\alert{endpoint}
+ (make-socket-address AF_INET INADDR_ANY 22))
+ (\alert{endpoint}
+ (make-socket-address AF_INET6 IN6ADDR_ANY 22)))
+ \alert{#:max-connections} 10)
+ \alert{#:stop} (make-inetd-destructor)
+ \alert{#:respawn?} #t))
+ \end{semiverbatim}
+ }
+\end{frame}
+
+\begin{frame}[fragile, plain]
+ \begin{semiverbatim}
+(\alert{use-modules} (shepherd service timer))
+
+(\alert{define} updatedb ;for 'locate'
+ (\alert{service}
+ '(updatedb)
+ \alert{#:start} (make-timer-constructor
+ ;; Fire at midnight and noon everyday.
+ (calendar-event \alert{#:hours} '(0 12) \alert{#:minutes} '(0))
+ (command '("/usr/bin/updatedb"
+ "--prunepaths=/tmp")))
+ \alert{#:stop} (make-timer-destructor)
+ \alert{#:actions} (list timer-trigger-action)))
+ \end{semiverbatim}
+\end{frame}
+
+% config sample: socket activation
+
+\begin{frame}[fragile, plain]
+ \large{
+ \begin{semiverbatim}
+(\alert{define} file-system-/mnt/disk
+ (\alert{service}
+ '(file-system-/mnt/disk)
+ \alert{#:start} (\alert{lambda} _
+ (mount "/dev/sdb2" "/mnt/disk" "ext4"))
+ \alert{#:stop} (\alert{lambda} _
+ (umount "/mnt/disk"))))
+ \end{semiverbatim}
+ }
+\end{frame}
+
+\setbeamercolor{normal text}{bg=guixblue1}
+\begin{frame}[fragile, plain]
+ \Huge{\textbf{Blurring the line \\[2mm]
+ between users and developers \\[2mm]
+ to increase \alert{user autonomy}.
+ }}
+\end{frame}
+
+%% \setbeamercolor{normal text}{bg=white}
+%% \begin{frame}[plain, fragile]
+%% \begin{tikzpicture}[shorten >=1pt, node distance=2cm,
+%% on grid, auto, text=black, draw=black,
+%% state/.style = { rounded corners=2mm, inner sep=2mm,
+%% draw=guixorange1, font=\Large },
+%% start/.style = { draw=none },
+%% accepting/.style = { draw=guixorange2, text=black }
+%% ]
+%% \draw[help lines] (0,0) grid (6,3);
+
+%% \node[state] (fork) {spawn};
+%% \node[state] (accept) [at=(current page.center)] {accept};
+%% \node (readcommand) [right=of accept] {read command};
+
+%% \node[state, below=of fork] (stopped) {stopped};
+%% \node[state, below right=of stopped] (starting) {starting};
+%% \node[state, below left=of starting] (started) {started};
+%% \node[state, below left=of stopped] (stopping) {stopping};
+
+%% \path[->] (fork) edge [loop below] node {\texttt{SIGCHLD}} ()
+%% (accept) edge [loop below] node {} ();
+
+%% \path[->] (stopped) edge (starting);
+%% \path[->] (started) edge (stopping);
+%% \path[->] (stopped) edge (stopped);
+%% \end{tikzpicture}
+%% \end{frame}
+
+\setbeamercolor{normal text}{bg=white}
+\screenshot[height=0.8\textheight]{images/fork+exec-SIGCHLD}
+\screenshot[height=0.8\textheight]{images/accept-read-commands}
+\screenshot[height=0.8\textheight]{images/fork+exec-pid-file}
+\screenshot[height=0.8\textheight]{images/service-states}
+% TODO terminate with grace period
+\begin{frame}[plain, fragile]
+ \begin{tikzpicture}
+ \matrix [row sep=6mm, column sep=30mm] {
+ \node{\includegraphics[height=0.4\textheight]{images/fork+exec-SIGCHLD}};
+ &
+
\node{\includegraphics[height=0.4\textheight]{images/accept-read-commands}};
+ \\
+
+ \node{\includegraphics[height=0.4\textheight]{images/service-states}};
+ &
+
\node{\includegraphics[height=0.45\textheight]{images/fork+exec-pid-file}};
+ \\
+ };
+ \end{tikzpicture}
+\end{frame}
+
+\setbeamercolor{normal text}{bg=guixdarkgrey}
+\begin{frame}[plain]
+ \Large{
+ \begin{semiverbatim}
+After a \alert{fork()} in a multithreaded program, the child can safely
+call only async-signal-safe functions (see \alert{signal-safety(7)})
+until such time as it calls \alert{execve(2)}.
+ \end{semiverbatim}
+ }
+\end{frame}
+
+\setbeamercolor{normal text}{bg=black}
+\screenshot{images/systemd-auto-restart}
+
+\setbeamercolor{normal text}{bg=guixdarkgrey}
+
+\begin{frame}[plain, fragile]
+ \begin{tikzpicture}[overlay]
+ \node [at=(current page.north east), anchor=north east, inner sep=3mm] {
+ \includegraphics[height=0.8\textheight]{images/fork+exec-SIGCHLD}
+ };
+ \end{tikzpicture}
+
+ \large{
+ \begin{semiverbatim}
+(\alert{let} loop ()
+ (handle-signal-port signal-port)
+ (loop))
+\pause
+(\alert{define} (handle-signal-port port)
+ (let ((signal (consume-signalfd-siginfo
\tikz[baseline]{\node[anchor=base](port){port};})))
+ (if (= SIGCHLD signal)
+ (match (\alert{waitpid} WAIT_ANY WNOHANG)
+ ((pid . status)
+ (put-message (current-process-monitor)
+ `(handle-process-termination ,pid ,status))))
+ \textrm\dots{})))
+ \end{semiverbatim}
+ }
+
+ \begin{tikzpicture}[overlay]
+ \node<2->[above right=of port, fill=white, text=black, rounded
+ corners=2mm, inner sep=3mm, anchor=south] (box) {
+ \textbf{reading won't block!}
+ };
+ \path<2->[->, very thick, draw=white] (box) edge (port);
+ \end{tikzpicture}
+\end{frame}
+
+\begin{frame}[plain, fragile]
+ \begin{tikzpicture}[overlay]
+ \node [at=(current page.north east), anchor=north east, inner sep=3mm] {
+ \includegraphics[height=0.8\textheight]{images/accept-read-commands}
+ };
+ \end{tikzpicture}
+
+ \large{
+ \begin{semiverbatim}
+(\alert{let} next-client ()
+ (match (\alert{accept} sock (logior SOCK_NONBLOCK SOCK_CLOEXEC))
+ ((command-source . client-address)
+ (\alert{spawn-fiber}
+ (lambda ()
+ ;; Read and execute client commands concurrently.
+ (process-connection command-source)))))
+ (next-client))
+ \end{semiverbatim}
+ }
+\end{frame}
+
+\begin{frame}[plain, fragile]
+ \large{
+ \begin{semiverbatim}
+(\alert{define*} (terminate-process pid signal
+ #:key (grace-period 5))
+ ;; Send signal to PID, or SIGKILL after grace period.
+ (let ((reply (make-channel)))
+ (\alert{put-message} (current-process-monitor)
+ `(\alert{await} ,pid ,reply))
+ (catch-system-error (\alert{kill} pid signal))
+
+ (match (\alert{get-message*} reply grace-period #f)
+ (#f
+ ;; Grace period is over, send SIGKILL.
+ (catch-system-error (\alert{kill} pid SIGKILL))
+ (\alert{get-message} reply))
+ (status
+ ;; Terminated on time!
+ status))))
+ \end{semiverbatim}
+ }
+\end{frame}
+
+\begin{frame}[plain, fragile]
+ \begin{tikzpicture}[overlay]
+ \node [at=(current page.north east), anchor=north east, inner sep=3mm] {
+ \includegraphics[height=0.8\textheight]{images/service-states}
+ };
+ \end{tikzpicture}
+
+ \large{
+ \begin{semiverbatim}
+(\alert{define} (service-controller channel)
+ (let loop ((status 'stopped)
+ (value #f)
+ ...)
+ (match (\alert{get-message} channel)
+ (('status reply) ;return the current status
+ (put-message reply status)
+ (loop status value ...))
+ (('start reply) ;start the service
+ ...)
+ (('stop reply) ;stop it
+ ...)
+ ...)))
+ \end{semiverbatim}
+ }
+\end{frame}
+
+\setbeamercolor{normal text}{bg=white}
+\begin{frame}[plain, fragile]
+ \begin{tikzpicture}
+ \matrix [row sep=6mm, column sep=25mm] {
+ \node{\includegraphics[height=0.4\textheight]{images/service-states}};
+ &
+ \node{\includegraphics[height=0.4\textheight]{images/service-states}};
+ &
+ \node{\includegraphics[height=0.4\textheight]{images/service-states}};
+ &
+ \\
+ \node{\includegraphics[height=0.4\textheight]{images/service-states}};
+ &
+ \node{\includegraphics[height=0.4\textheight]{images/service-states}};
+ &
+ \node{\includegraphics[height=0.4\textheight]{images/service-states}};
+ &
+ \\
+ };
+ \node<2-> [at=(current page.center), text=black] {
+ \Huge{\textbf{Concurrent sequential processes.}}
+ };
+ \end{tikzpicture}
+\end{frame}
+
+\setbeamercolor{normal text}{bg=guixred1}
+\begin{frame}[plain]
+ \Huge{\textbf{Sweat \& tears.}}
+\end{frame}
+
+\setbeamercolor{normal text}{bg=guixred3}
+\begin{frame}[plain, fragile]
+ \begin{myverbbox}{\sONE}
+(define (alice channel)
+ (let loop ()
+ (match (get-message channel)
+ (('say-hi-to-me reply)
+ (put-message reply 'hi!)))))
+ \end{myverbbox}
+
+ \begin{myverbbox}{\sTWO}
+(define (bob friend)
+ (let ((reply (make-channel)))
+ (put-message friend
+ `(say-hi-to-me ,reply))
+ 'bye-bye!))
+ \end{myverbbox}
+
+ \begin{tikzpicture}[overlay]
+ \node (alice) [at=(current page.center), anchor=east] {\sONE};
+ \node (bob) [right=of alice] {\sTWO};
+
+ \node<2->[at=(current page.center), fill=guixorange2, text=white,
+ rounded corners=2mm, inner sep=5mm, font=\LARGE] {
+ \textbf{Do not miss a rendez-vous.}
+ };
+ \end{tikzpicture}
+\end{frame}
+
+\begin{frame}[fragile]
+ \begin{quotation}
+ \Huge{
+ ``Hello, I wrote my own service \\ and now \texttt{herd status}
+ hangs.''
+ }
+ \end{quotation}
+\end{frame}
+
+\setbeamercolor{normal text}{bg=guixblue2}
+\begin{frame}[fragile]
+ \Huge{\texttt{thread apply all bt}}
+ \\[10mm]
+ ... would be nice.
+\end{frame}
+
+\setbeamercolor{normal text}{bg=white}
+\begin{frame}[plain, fragile]
+ \begin{tikzpicture}[
+ screenshot/.style = { drop shadow={opacity=0.4},
+ text=black }
+ ]
+
+ \node[screenshot,
+ rotate=5]{\includegraphics[height=0.6\textheight]{images/fibers-leak1}};
+ \node<2->[screenshot,
+
rotate=-10]{\includegraphics[height=0.5\textheight]{images/fibers-leak2}};
+
+ \node<3->[text=guixred3,
+ inner sep=0mm, at=(current page.center), font=\Huge] {
+ \textbf{Uh-oh!}
+ };
+
+ \end{tikzpicture}
+\end{frame}
+
+\setbeamercolor{normal text}{bg=guixgreen1}
+\begin{frame}[plain, fragile]
+ \center{\Huge{\texttt{herd status}}}
+\end{frame}
+
+\setbeamercolor{normal text}{bg=white}
+\begin{frame}[plain, fragile]
+ \begin{tikzpicture}[overlay]
+ \node (logo) [at=(current page.center), anchor=south]
{\includegraphics[width=0.4\textwidth]{images/linux-magazine-logo}};
+ \node [at=(current page.center), anchor=north]
{\includegraphics[width=1.1\textwidth]{images/linux-magazine-headline}};
+ \end{tikzpicture}
+\end{frame}
+
+\setbeamercolor{normal text}{bg=guixtaupe}
+\begin{frame}[fragile]
+ \LARGE{
+ \begin{itemize}
+ \item \highlight{1.0.x} bug-fix releases rolling
+ \item \highlight{Guix integration}: replacing rottlog, mcron,
+ syslogd
+ \item \highlight{Fibers} is solid! (and needs $\heartsuit$)
+ \item \highlight{7.4K lines of code!}
+ \item miss something from systemd? \highlight{let's hack!}
+ \end{itemize}
+ }
+\end{frame}
+
+\screenshot{images/spritely-shepherd}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\setbeamercolor{normal text}{bg=black}
+\begin{frame}[plain]
+
+\vfill{
+ \vspace{3cm}
+ \center{\includegraphics[width=0.5\textwidth]{images/shepherd-logo}}\\[1.0cm]
+ \center{\alert{\url{https://gnu.org/s/shepherd}}} \\[0.2cm]
+ \texttt{[email protected] |} @[email protected]
+ \\[1.2cm]
+}
+\end{frame}
+
+\setbeamercolor{normal text}{bg=black}
+\begin{frame}{}
+ \begin{textblock}{12}(2, 5)
+ \tiny{
+ Copyright \copyright{} 2025 Ludovic Courtès \texttt{[email protected]}.
+ \\[3.0mm]
+ Picture of Shepherd in Făgăraș Mountains, Romania, by ``friend of
+ Darwinek'', under CC-BY-SA 3.0,
+ \url{https://commons.wikimedia.org/wiki/File:Rumunia_5806.jpg}
+ \\[2.0mm]
+ Goblins + Spritely drawing by Spritely Institute,
+
\url{https://spritely.institute/news/spritely-nlnet-grants-december-2023.html}
+ \\[2.0mm]
+ Shepherd logo by Luis Felipe López Acevedo, under CC-BY-SA 4.0,
+ \url{https://git.savannah.gnu.org/cgit/shepherd/graphics.git}.
+ \\[3.0mm]
+ This work is licensed under the \alert{Creative Commons
+ Attribution-Share Alike 3.0} License. To view a copy of this
+ license, visit
+ \url{https://creativecommons.org/licenses/by-sa/3.0/} or send a
+ letter to Creative Commons, 171 Second Street, Suite 300, San
+ Francisco, California, 94105, USA.
+ \\[2.0mm]
+ At your option, you may instead copy, distribute and/or modify
+ this document under the terms of the \alert{GNU Free Documentation
+ License, Version 1.3 or any later version} published by the Free
+ Software Foundation; with no Invariant Sections, no Front-Cover
+ Texts, and no Back-Cover Texts. A copy of the license is
+ available at \url{https://www.gnu.org/licenses/gfdl.html}.
+ \\[2.0mm]
+ % Give a link to the 'Transparent Copy', as per Section 3 of the GFDL.
+ The source of this document is available from
+ \url{https://git.sv.gnu.org/cgit/guix/maintenance.git}.
+ }
+ \end{textblock}
+\end{frame}
+
+\end{document}
+
+% Local Variables:
+% coding: utf-8
+% comment-start: "%"
+% comment-end: ""
+% ispell-local-dictionary: "american"
+% compile-command: "guix shell -m ../../beamer-manifest.scm -- rubber --pdf
talk.tex"
+% End: