Skip to content

Commit 8e6b5da

Browse files
committed
complete Building a Multithreaded Web Server
1 parent eaded3e commit 8e6b5da

File tree

49 files changed

+1061
-81
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1061
-81
lines changed

.DS_Store

0 Bytes
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
2+
\PYG{k}{struct} \PYG{n+nc}{Worker}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
3+
\PYG{+w}{ }\PYG{n}{id}: \PYG{k+kt}{usize}\PYG{p}{,}
4+
\PYG{+w}{ }\PYG{n}{thread}: \PYG{n+nc}{thread}::\PYG{n}{JoinHandle}\PYG{o}{\PYGZlt{}}\PYG{p}{()}\PYG{o}{\PYGZgt{}}\PYG{p}{,}
5+
\PYG{p}{\PYGZcb{}}
6+
\PYG{k}{impl}\PYG{+w}{ }\PYG{n}{Worker}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
7+
\PYG{+w}{ }\PYG{k}{fn} \PYG{n+nf}{new}\PYG{p}{(}\PYG{n}{id}: \PYG{k+kt}{usize}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{receiver}: \PYG{n+nc}{Arc}\PYG{o}{\PYGZlt{}}\PYG{n}{Mutex}\PYG{o}{\PYGZlt{}}\PYG{n}{mpsc}::\PYG{n}{Receiver}\PYG{o}{\PYGZlt{}}\PYG{n}{Job}\PYG{o}{\PYGZgt{}\PYGZgt{}\PYGZgt{}}\PYG{p}{)}\PYG{+w}{ }\PYGZhy{}\PYGZgt{} \PYG{n+nc}{Worker}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
8+
\PYG{+w}{ }\PYG{c+c1}{// \PYGZhy{}\PYGZhy{}snip\PYGZhy{}\PYGZhy{}}
9+
\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{n}{thread}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{thread}::\PYG{n}{spawn}\PYG{p}{(}\PYG{o}{||}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
10+
\PYG{+w}{ }\PYG{n}{receiver}\PYG{p}{;}
11+
\PYG{+w}{ }\PYG{p}{\PYGZcb{});}
12+
13+
\PYG{+w}{ }\PYG{n}{Worker}\PYG{+w}{ }\PYG{p}{\PYGZob{}}\PYG{+w}{ }\PYG{n}{id}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{thread}\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
14+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
15+
\PYG{p}{\PYGZcb{}}
16+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
2+
\PYG{k}{use}\PYG{+w}{ }\PYG{n}{std}::\PYG{n}{thread}\PYG{p}{;}
3+
4+
\PYG{k}{pub}\PYG{+w}{ }\PYG{k}{struct} \PYG{n+nc}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
5+
\PYG{+w}{ }\PYG{n}{threads}: \PYG{n+nb}{Vec}\PYG{o}{\PYGZlt{}}\PYG{n}{thread}::\PYG{n}{JoinHandle}\PYG{o}{\PYGZlt{}}\PYG{p}{()}\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{p}{,}
6+
\PYG{p}{\PYGZcb{}}
7+
8+
\PYG{k}{impl}\PYG{+w}{ }\PYG{n}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
9+
\PYG{+w}{ }\PYG{c+c1}{// \PYGZhy{}\PYGZhy{}snip\PYGZhy{}\PYGZhy{}}
10+
\PYG{+w}{ }\PYG{k}{pub}\PYG{+w}{ }\PYG{k}{fn} \PYG{n+nf}{new}\PYG{p}{(}\PYG{n}{size}: \PYG{k+kt}{usize}\PYG{p}{)}\PYG{+w}{ }\PYGZhy{}\PYGZgt{} \PYG{n+nc}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
11+
\PYG{+w}{ }\PYG{n+nf+fm}{assert!}\PYG{p}{(}\PYG{n}{size}\PYG{+w}{ }\PYG{o}{\PYGZgt{}}\PYG{+w}{ }\PYG{l+m+mi}{0}\PYG{p}{);}
12+
13+
\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{k}{mut}\PYG{+w}{ }\PYG{n}{threads}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n+nb}{Vec}::\PYG{n}{with\PYGZus{}capacity}\PYG{p}{(}\PYG{n}{size}\PYG{p}{);}
14+
15+
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{n}{\PYGZus{}}\PYG{+w}{ }\PYG{k}{in}\PYG{+w}{ }\PYG{l+m+mi}{0}\PYG{o}{..}\PYG{n}{size}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
16+
\PYG{+w}{ }\PYG{c+c1}{// create some threads and store them in the vector}
17+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
18+
19+
\PYG{+w}{ }\PYG{n}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}\PYG{+w}{ }\PYG{n}{threads}\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
20+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
21+
\PYG{+w}{ }\PYG{c+c1}{// \PYGZhy{}\PYGZhy{}snip\PYGZhy{}\PYGZhy{}}
22+
\PYG{p}{\PYGZcb{}}
23+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
2+
\PYG{k}{impl}\PYG{+w}{ }\PYG{n+nb}{Drop}\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{n}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
3+
\PYG{+w}{ }\PYG{k}{fn} \PYG{n+nf}{drop}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{k}{mut}\PYG{+w}{ }\PYG{n+nb+bp}{self}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
4+
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{n}{worker}\PYG{+w}{ }\PYG{k}{in}\PYG{+w}{ }\PYG{o}{\PYGZam{}}\PYG{k}{mut}\PYG{+w}{ }\PYG{n+nb+bp}{self}\PYG{p}{.}\PYG{n}{workers}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
5+
\PYG{+w}{ }\PYG{n+nf+fm}{println!}\PYG{p}{(}\PYG{l+s}{\PYGZdq{}Shutting down worker \PYGZob{}\PYGZcb{}\PYGZdq{}}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{worker}\PYG{p}{.}\PYG{n}{id}\PYG{p}{);}
6+
\PYG{+w}{ }\PYG{n}{worker}\PYG{p}{.}\PYG{n}{thread}\PYG{p}{.}\PYG{n}{join}\PYG{p}{().}\PYG{n}{unwrap}\PYG{p}{();}
7+
\PYG{+w}{ }\PYG{c+c1}{// \PYGZca{}\PYGZca{}\PYGZca{}\PYGZca{}\PYGZca{}\PYGZca{}\PYGZca{}\PYGZca{}`worker.thread` moved due to this method call}
8+
\PYG{+w}{ }\PYG{c+c1}{// join function takes ownership of the receiver `self`, which moves `worker.thread`}
9+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
10+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
11+
\PYG{p}{\PYGZcb{}}
12+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
2+
\PYG{k}{pub}\PYG{+w}{ }\PYG{k}{struct} \PYG{n+nc}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
3+
\PYG{+w}{ }\PYG{n}{workers}: \PYG{n+nb}{Vec}\PYG{o}{\PYGZlt{}}\PYG{n}{Worker}\PYG{o}{\PYGZgt{}}\PYG{p}{,}
4+
\PYG{+w}{ }\PYG{n}{sender}: \PYG{n+nb}{Option}\PYG{o}{\PYGZlt{}}\PYG{n}{mpsc}::\PYG{n}{Sender}\PYG{o}{\PYGZlt{}}\PYG{n}{Job}\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{p}{,}\PYG{+w}{ }\PYG{c+c1}{// Change!}
5+
\PYG{p}{\PYGZcb{}}
6+
\PYG{c+c1}{// \PYGZhy{}\PYGZhy{}snip\PYGZhy{}\PYGZhy{}}
7+
\PYG{k}{impl}\PYG{+w}{ }\PYG{n}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
8+
\PYG{+w}{ }\PYG{k}{pub}\PYG{+w}{ }\PYG{k}{fn} \PYG{n+nf}{new}\PYG{p}{(}\PYG{n}{size}: \PYG{k+kt}{usize}\PYG{p}{)}\PYG{+w}{ }\PYGZhy{}\PYGZgt{} \PYG{n+nc}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
9+
\PYG{+w}{ }\PYG{c+c1}{// \PYGZhy{}\PYGZhy{}snip\PYGZhy{}\PYGZhy{}}
10+
11+
\PYG{+w}{ }\PYG{n}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
12+
\PYG{+w}{ }\PYG{n}{workers}\PYG{p}{,}
13+
\PYG{+w}{ }\PYG{n}{sender}: \PYG{n+nb}{Some}\PYG{p}{(}\PYG{n}{sender}\PYG{p}{),}\PYG{+w}{ }\PYG{c+c1}{// Change!}
14+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
15+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
16+
17+
\PYG{+w}{ }\PYG{k}{pub}\PYG{+w}{ }\PYG{k}{fn} \PYG{n+nf}{execute}\PYG{o}{\PYGZlt{}}\PYG{n}{F}\PYG{o}{\PYGZgt{}}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{n+nb+bp}{self}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{f}: \PYG{n+nc}{F}\PYG{p}{)}
18+
\PYG{+w}{ }\PYG{k}{where}
19+
\PYG{+w}{ }\PYG{n}{F}: \PYG{n+nb}{FnOnce}\PYG{p}{()}\PYG{+w}{ }\PYG{o}{+}\PYG{+w}{ }\PYG{n+nb}{Send}\PYG{+w}{ }\PYG{o}{+}\PYG{+w}{ }\PYG{o}{\PYGZsq{}}\PYG{n+nb}{static}\PYG{p}{,}
20+
\PYG{+w}{ }\PYG{p}{\PYGZob{}}
21+
\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{n}{job}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n+nb}{Box}::\PYG{n}{new}\PYG{p}{(}\PYG{n}{f}\PYG{p}{);}
22+
23+
\PYG{+w}{ }\PYG{n+nb+bp}{self}\PYG{p}{.}\PYG{n}{sender}\PYG{p}{.}\PYG{n}{as\PYGZus{}ref}\PYG{p}{().}\PYG{n}{unwrap}\PYG{p}{().}\PYG{n}{send}\PYG{p}{(}\PYG{n}{job}\PYG{p}{).}\PYG{n}{unwrap}\PYG{p}{();}\PYG{+w}{ }\PYG{c+c1}{// Change!}
24+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
25+
\PYG{p}{\PYGZcb{}}
26+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
2+
\PYG{k}{pub}\PYG{+w}{ }\PYG{k}{struct} \PYG{n+nc}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
3+
\PYG{+w}{ }\PYG{n}{workers}: \PYG{n+nb}{Vec}\PYG{o}{\PYGZlt{}}\PYG{n}{Worker}\PYG{o}{\PYGZgt{}}\PYG{p}{,}
4+
\PYG{+w}{ }\PYG{n}{sender}: \PYG{n+nc}{mpsc}::\PYG{n}{Sender}\PYG{o}{\PYGZlt{}}\PYG{n}{Job}\PYG{o}{\PYGZgt{}}\PYG{p}{,}
5+
\PYG{p}{\PYGZcb{}}
6+
\PYG{k}{struct} \PYG{n+nc}{Job}\PYG{p}{;}
7+
\PYG{k}{impl}\PYG{+w}{ }\PYG{n}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
8+
\PYG{+w}{ }\PYG{k}{pub}\PYG{+w}{ }\PYG{k}{fn} \PYG{n+nf}{new}\PYG{p}{(}\PYG{n}{size}: \PYG{k+kt}{usize}\PYG{p}{)}\PYG{+w}{ }\PYGZhy{}\PYGZgt{} \PYG{n+nc}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
9+
\PYG{+w}{ }\PYG{n+nf+fm}{assert!}\PYG{p}{(}\PYG{n}{size}\PYG{+w}{ }\PYG{o}{\PYGZgt{}}\PYG{+w}{ }\PYG{l+m+mi}{0}\PYG{p}{);}
10+
11+
\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{p}{(}\PYG{n}{sender}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{receiver}\PYG{p}{)}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{mpsc}::\PYG{n}{channel}\PYG{p}{();}
12+
\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{n}{receiver}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{Arc}::\PYG{n}{new}\PYG{p}{(}\PYG{n}{Mutex}::\PYG{n}{new}\PYG{p}{(}\PYG{n}{receiver}\PYG{p}{));}
13+
\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{k}{mut}\PYG{+w}{ }\PYG{n}{workers}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n+nb}{Vec}::\PYG{n}{with\PYGZus{}capacity}\PYG{p}{(}\PYG{n}{size}\PYG{p}{);}
14+
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{n}{id}\PYG{+w}{ }\PYG{k}{in}\PYG{+w}{ }\PYG{l+m+mi}{0}\PYG{o}{..}\PYG{n}{size}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
15+
\PYG{+w}{ }\PYG{n}{workers}\PYG{p}{.}\PYG{n}{push}\PYG{p}{(}\PYG{n}{Worker}::\PYG{n}{new}\PYG{p}{(}\PYG{n}{id}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{Arc}::\PYG{n}{clone}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{n}{receiver}\PYG{p}{)));}
16+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
17+
\PYG{+w}{ }\PYG{n}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}\PYG{+w}{ }\PYG{n}{workers}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{sender}\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
18+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
19+
\PYG{+w}{ }\PYG{c+c1}{// \PYGZhy{}\PYGZhy{}snip\PYGZhy{}\PYGZhy{}}
20+
\PYG{+w}{ }\PYG{k}{pub}\PYG{+w}{ }\PYG{k}{fn} \PYG{n+nf}{execute}\PYG{o}{\PYGZlt{}}\PYG{n}{F}\PYG{o}{\PYGZgt{}}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{n+nb+bp}{self}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{f}: \PYG{n+nc}{F}\PYG{p}{)}
21+
\PYG{+w}{ }\PYG{k}{where}
22+
\PYG{+w}{ }\PYG{n}{F}: \PYG{n+nb}{FnOnce}\PYG{p}{()}\PYG{+w}{ }\PYG{o}{+}\PYG{+w}{ }\PYG{n+nb}{Send}\PYG{+w}{ }\PYG{o}{+}\PYG{+w}{ }\PYG{o}{\PYGZsq{}}\PYG{n+nb}{static}\PYG{p}{,}
23+
\PYG{+w}{ }\PYG{p}{\PYGZob{}}
24+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
25+
\PYG{p}{\PYGZcb{}}
26+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
2+
3+
\PYG{k}{struct} \PYG{n+nc}{Worker}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
4+
\PYG{+w}{ }\PYG{n}{id}: \PYG{k+kt}{usize}\PYG{p}{,}
5+
\PYG{+w}{ }\PYG{n}{thread}: \PYG{n+nc}{thread}::\PYG{n}{JoinHandle}\PYG{o}{\PYGZlt{}}\PYG{p}{()}\PYG{o}{\PYGZgt{}}\PYG{p}{,}
6+
\PYG{p}{\PYGZcb{}}
7+
8+
\PYG{k}{impl}\PYG{+w}{ }\PYG{n}{Worker}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
9+
\PYG{+w}{ }\PYG{k}{fn} \PYG{n+nf}{new}\PYG{p}{(}\PYG{n}{id}: \PYG{k+kt}{usize}\PYG{p}{)}\PYG{+w}{ }\PYGZhy{}\PYGZgt{} \PYG{n+nc}{Worker}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
10+
\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{n}{thread}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{thread}::\PYG{n}{spawn}\PYG{p}{(}\PYG{o}{||}\PYG{+w}{ }\PYG{p}{\PYGZob{}\PYGZcb{});}
11+
12+
\PYG{+w}{ }\PYG{n}{Worker}\PYG{+w}{ }\PYG{p}{\PYGZob{}}\PYG{+w}{ }\PYG{n}{id}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{thread}\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
13+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
14+
\PYG{p}{\PYGZcb{}}
15+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
2+
\PYG{k}{impl}\PYG{+w}{ }\PYG{n+nb}{Drop}\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{n}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
3+
\PYG{+w}{ }\PYG{k}{fn} \PYG{n+nf}{drop}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{k}{mut}\PYG{+w}{ }\PYG{n+nb+bp}{self}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
4+
\PYG{+w}{ }\PYG{n+nb}{drop}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{p}{.}\PYG{n}{sender}\PYG{p}{.}\PYG{n}{take}\PYG{p}{());}\PYG{+w}{ }\PYG{c+c1}{// New!}
5+
6+
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{n}{worker}\PYG{+w}{ }\PYG{k}{in}\PYG{+w}{ }\PYG{o}{\PYGZam{}}\PYG{k}{mut}\PYG{+w}{ }\PYG{n+nb+bp}{self}\PYG{p}{.}\PYG{n}{workers}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
7+
\PYG{+w}{ }\PYG{n+nf+fm}{println!}\PYG{p}{(}\PYG{l+s}{\PYGZdq{}Shutting down worker \PYGZob{}\PYGZcb{}\PYGZdq{}}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{worker}\PYG{p}{.}\PYG{n}{id}\PYG{p}{);}
8+
9+
\PYG{+w}{ }\PYG{k}{if}\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{n+nb}{Some}\PYG{p}{(}\PYG{n}{thread}\PYG{p}{)}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{worker}\PYG{p}{.}\PYG{n}{thread}\PYG{p}{.}\PYG{n}{take}\PYG{p}{()}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
10+
\PYG{+w}{ }\PYG{n}{thread}\PYG{p}{.}\PYG{n}{join}\PYG{p}{().}\PYG{n}{unwrap}\PYG{p}{();}
11+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
12+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
13+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
14+
\PYG{p}{\PYGZcb{}}
15+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
2+
\PYG{k}{impl}\PYG{+w}{ }\PYG{n+nb}{Drop}\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{n}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
3+
\PYG{+w}{ }\PYG{k}{fn} \PYG{n+nf}{drop}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{k}{mut}\PYG{+w}{ }\PYG{n+nb+bp}{self}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
4+
\PYG{+w}{ }\PYG{n+nb}{drop}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{p}{.}\PYG{n}{sender}\PYG{p}{.}\PYG{n}{take}\PYG{p}{());}\PYG{+w}{ }\PYG{c+c1}{// New!}
5+
6+
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{n}{worker}\PYG{+w}{ }\PYG{k}{in}\PYG{+w}{ }\PYG{o}{\PYGZam{}}\PYG{k}{mut}\PYG{+w}{ }\PYG{n+nb+bp}{self}\PYG{p}{.}\PYG{n}{workers}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
7+
\PYG{+w}{ }\PYG{n+nf+fm}{println!}\PYG{p}{(}\PYG{l+s}{\PYGZdq{}Shutting down worker \PYGZob{}\PYGZcb{}\PYGZdq{}}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{worker}\PYG{p}{.}\PYG{n}{id}\PYG{p}{);}
8+
9+
\PYG{+w}{ }\PYG{k}{if}\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{n+nb}{Some}\PYG{p}{(}\PYG{n}{thread}\PYG{p}{)}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{worker}\PYG{p}{.}\PYG{n}{thread}\PYG{p}{.}\PYG{n}{take}\PYG{p}{()}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
10+
\PYG{+w}{ }\PYG{n}{thread}\PYG{p}{.}\PYG{n}{join}\PYG{p}{().}\PYG{n}{unwrap}\PYG{p}{();}
11+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
12+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
13+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
14+
\PYG{p}{\PYGZcb{}}
15+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
2+
\PYG{k}{struct} \PYG{n+nc}{Worker}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
3+
\PYG{+w}{ }\PYG{n}{id}: \PYG{k+kt}{usize}\PYG{p}{,}
4+
\PYG{+w}{ }\PYG{n}{thread}: \PYG{n+nb}{Option}\PYG{o}{\PYGZlt{}}\PYG{n}{thread}::\PYG{n}{JoinHandle}\PYG{o}{\PYGZlt{}}\PYG{p}{()}\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{p}{,}\PYG{+w}{ }\PYG{c+c1}{// Chanage!}
5+
\PYG{p}{\PYGZcb{}}
6+
\PYG{k}{impl}\PYG{+w}{ }\PYG{n}{Worker}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
7+
\PYG{+w}{ }\PYG{k}{fn} \PYG{n+nf}{new}\PYG{p}{(}\PYG{n}{id}: \PYG{k+kt}{usize}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{receiver}: \PYG{n+nc}{Arc}\PYG{o}{\PYGZlt{}}\PYG{n}{Mutex}\PYG{o}{\PYGZlt{}}\PYG{n}{mpsc}::\PYG{n}{Receiver}\PYG{o}{\PYGZlt{}}\PYG{n}{Job}\PYG{o}{\PYGZgt{}\PYGZgt{}\PYGZgt{}}\PYG{p}{)}\PYG{+w}{ }\PYGZhy{}\PYGZgt{} \PYG{n+nc}{Worker}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
8+
\PYG{+w}{ }\PYG{c+c1}{// \PYGZhy{}\PYGZhy{}snip\PYGZhy{}\PYGZhy{}}
9+
\PYG{+w}{ }\PYG{n}{Worker}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
10+
\PYG{+w}{ }\PYG{n}{id}\PYG{p}{,}
11+
\PYG{+w}{ }\PYG{n}{thread}: \PYG{n+nb}{Some}\PYG{p}{(}\PYG{n}{thread}\PYG{p}{),}\PYG{+w}{ }\PYG{c+c1}{// Chanage!}
12+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
13+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
14+
\PYG{p}{\PYGZcb{}}
15+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
2+
\PYG{c+c1}{// \PYGZhy{}\PYGZhy{}snip\PYGZhy{}\PYGZhy{}}
3+
4+
\PYG{k}{type} \PYG{n+nc}{Job}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n+nb}{Box}\PYG{o}{\PYGZlt{}}\PYG{k}{dyn}\PYG{+w}{ }\PYG{n+nb}{FnOnce}\PYG{p}{()}\PYG{+w}{ }\PYG{o}{+}\PYG{+w}{ }\PYG{n+nb}{Send}\PYG{+w}{ }\PYG{o}{+}\PYG{+w}{ }\PYG{o}{\PYGZsq{}}\PYG{n+nb}{static}\PYG{o}{\PYGZgt{}}\PYG{p}{;}
5+
6+
\PYG{k}{impl}\PYG{+w}{ }\PYG{n}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
7+
\PYG{+w}{ }\PYG{c+c1}{// \PYGZhy{}\PYGZhy{}snip\PYGZhy{}\PYGZhy{}}
8+
9+
\PYG{+w}{ }\PYG{k}{pub}\PYG{+w}{ }\PYG{k}{fn} \PYG{n+nf}{execute}\PYG{o}{\PYGZlt{}}\PYG{n}{F}\PYG{o}{\PYGZgt{}}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{n+nb+bp}{self}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{f}: \PYG{n+nc}{F}\PYG{p}{)}
10+
\PYG{+w}{ }\PYG{k}{where}
11+
\PYG{+w}{ }\PYG{n}{F}: \PYG{n+nb}{FnOnce}\PYG{p}{()}\PYG{+w}{ }\PYG{o}{+}\PYG{+w}{ }\PYG{n+nb}{Send}\PYG{+w}{ }\PYG{o}{+}\PYG{+w}{ }\PYG{o}{\PYGZsq{}}\PYG{n+nb}{static}\PYG{p}{,}
12+
\PYG{+w}{ }\PYG{p}{\PYGZob{}}
13+
\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{n}{job}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n+nb}{Box}::\PYG{n}{new}\PYG{p}{(}\PYG{n}{f}\PYG{p}{);}
14+
15+
\PYG{+w}{ }\PYG{n+nb+bp}{self}\PYG{p}{.}\PYG{n}{sender}\PYG{p}{.}\PYG{n}{send}\PYG{p}{(}\PYG{n}{job}\PYG{p}{).}\PYG{n}{unwrap}\PYG{p}{();}
16+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
17+
\PYG{p}{\PYGZcb{}}
18+
19+
\PYG{c+c1}{// \PYGZhy{}\PYGZhy{}snip\PYGZhy{}\PYGZhy{}}
20+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
2+
\PYG{k}{impl}\PYG{+w}{ }\PYG{n+nb}{Drop}\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{n}{ThreadPool}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
3+
\PYG{+w}{ }\PYG{k}{fn} \PYG{n+nf}{drop}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{k}{mut}\PYG{+w}{ }\PYG{n+nb+bp}{self}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
4+
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{n}{worker}\PYG{+w}{ }\PYG{k}{in}\PYG{+w}{ }\PYG{o}{\PYGZam{}}\PYG{k}{mut}\PYG{+w}{ }\PYG{n+nb+bp}{self}\PYG{p}{.}\PYG{n}{workers}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
5+
\PYG{+w}{ }\PYG{n+nf+fm}{println!}\PYG{p}{(}\PYG{l+s}{\PYGZdq{}Shutting down worker \PYGZob{}\PYGZcb{}\PYGZdq{}}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{worker}\PYG{p}{.}\PYG{n}{id}\PYG{p}{);}
6+
\PYG{+w}{ }\PYG{c+c1}{// Chanage!}
7+
\PYG{+w}{ }\PYG{k}{if}\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{n+nb}{Some}\PYG{p}{(}\PYG{n}{thread}\PYG{p}{)}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{worker}\PYG{p}{.}\PYG{n}{thread}\PYG{p}{.}\PYG{n}{take}\PYG{p}{()}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
8+
\PYG{+w}{ }\PYG{n}{thread}\PYG{p}{.}\PYG{n}{join}\PYG{p}{().}\PYG{n}{unwrap}\PYG{p}{();}
9+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
10+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
11+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
12+
\PYG{p}{\PYGZcb{}}
13+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
2+
\PYG{k}{use}\PYG{+w}{ }\PYG{n}{std}::\PYG{p}{\PYGZob{}}
3+
\PYG{+w}{ }\PYG{n}{io}::\PYG{p}{\PYGZob{}}\PYG{n}{prelude}::\PYG{o}{*}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{BufReader}\PYG{p}{\PYGZcb{},}
4+
\PYG{+w}{ }\PYG{n}{net}::\PYG{p}{\PYGZob{}}\PYG{n}{TcpListener}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{TcpStream}\PYG{p}{\PYGZcb{},}
5+
\PYG{p}{\PYGZcb{};}
6+
\PYG{k}{fn} \PYG{n+nf}{main}\PYG{p}{()}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
7+
\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{n}{listener}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{TcpListener}::\PYG{n}{bind}\PYG{p}{(}\PYG{l+s}{\PYGZdq{}127.0.0.1:7878\PYGZdq{}}\PYG{p}{).}\PYG{n}{unwrap}\PYG{p}{();}
8+
\PYG{+w}{ }\PYG{k}{for}\PYG{+w}{ }\PYG{n}{stream}\PYG{+w}{ }\PYG{k}{in}\PYG{+w}{ }\PYG{n}{listener}\PYG{p}{.}\PYG{n}{incoming}\PYG{p}{()}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
9+
\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{n}{stream}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{stream}\PYG{p}{.}\PYG{n}{unwrap}\PYG{p}{();}
10+
11+
\PYG{+w}{ }\PYG{n}{handle\PYGZus{}connection}\PYG{p}{(}\PYG{n}{stream}\PYG{p}{);}
12+
\PYG{+w}{ }\PYG{p}{\PYGZcb{}}
13+
\PYG{p}{\PYGZcb{}}
14+
\PYG{k}{fn} \PYG{n+nf}{handle\PYGZus{}connection}\PYG{p}{(}\PYG{k}{mut}\PYG{+w}{ }\PYG{n}{stream}: \PYG{n+nc}{TcpStream}\PYG{p}{)}\PYG{+w}{ }\PYG{p}{\PYGZob{}}
15+
\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{n}{buf\PYGZus{}reader}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{BufReader}::\PYG{n}{new}\PYG{p}{(}\PYG{o}{\PYGZam{}}\PYG{k}{mut}\PYG{+w}{ }\PYG{n}{stream}\PYG{p}{);}
16+
\PYG{+w}{ }\PYG{k+kd}{let}\PYG{+w}{ }\PYG{n}{http\PYGZus{}request}: \PYG{n+nb}{Vec}\PYG{o}{\PYGZlt{}}\PYG{n}{\PYGZus{}}\PYG{o}{\PYGZgt{}}\PYG{+w}{ }\PYG{o}{=}\PYG{+w}{ }\PYG{n}{buf\PYGZus{}reader}
17+
\PYG{+w}{ }\PYG{p}{.}\PYG{n}{lines}\PYG{p}{()}
18+
\PYG{+w}{ }\PYG{p}{.}\PYG{n}{map}\PYG{p}{(}\PYG{o}{|}\PYG{n}{result}\PYG{o}{|}\PYG{+w}{ }\PYG{n}{result}\PYG{p}{.}\PYG{n}{unwrap}\PYG{p}{())}
19+
\PYG{+w}{ }\PYG{p}{.}\PYG{n}{take\PYGZus{}while}\PYG{p}{(}\PYG{o}{|}\PYG{n}{line}\PYG{o}{|}\PYG{+w}{ }\PYG{o}{!}\PYG{n}{line}\PYG{p}{.}\PYG{n}{is\PYGZus{}empty}\PYG{p}{())}
20+
\PYG{+w}{ }\PYG{p}{.}\PYG{n}{collect}\PYG{p}{();}
21+
22+
\PYG{+w}{ }\PYG{n+nf+fm}{println!}\PYG{p}{(}\PYG{l+s}{\PYGZdq{}Request: \PYGZob{}:\PYGZsh{}?\PYGZcb{}\PYGZdq{}}\PYG{p}{,}\PYG{+w}{ }\PYG{n}{http\PYGZus{}request}\PYG{p}{);}
23+
\PYG{p}{\PYGZcb{}}
24+
\end{Verbatim}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
\begin{Verbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}]
2+
\PYG{n}{take}
3+
\end{Verbatim}

0 commit comments

Comments
 (0)