diff --git a/report/headers.sty b/report/headers.sty
new file mode 100644
index 0000000..5f7cd00
--- /dev/null
+++ b/report/headers.sty
@@ -0,0 +1,107 @@
+\usepackage{float}
+\usepackage{array}
+\usepackage[inkscapelatex=false]{svg}
+\usepackage{graphicx}
+\usepackage{mwe}
+\usepackage{subfig}
+\graphicspath{ {./img/} }
+
+\usepackage{xcolor}
+\definecolor{maincolor}{RGB}{0,118,190}
+
+\usepackage[nocheck]{fancyhdr}
+\usepackage[a4paper, total={6in, 10in}]{geometry}
+\RequirePackage{hyperref}
+\hypersetup{colorlinks=true, linktoc=all, linkcolor=maincolor}
+
+\usepackage{titlesec}
+\usepackage{titletoc}
+\usepackage{multicol}
+
+% pour le code
+\usepackage[final]{listings}
+\lstdefinestyle{code}{
+ frame=single,
+ belowcaptionskip=1\baselineskip,
+ breaklines=true,
+ frame=single,
+ xleftmargin=\parindent,
+ language=SQL,
+ showstringspaces=false,
+ basicstyle=\footnotesize\ttfamily,
+ keywordstyle=\bfseries\color{green!40!black},
+ commentstyle=\itshape\color{purple!40!black},
+ stringstyle=\color{orange},
+}
+\lstset{style=code, language=SQL}
+\usepackage{minted}
+
+
+% Pour les extraits de code
+\RequirePackage{tcolorbox}
+\tcbuselibrary{skins,theorems,breakable,listings}
+\lstdefinelanguage{JavaScript}{
+ morekeywords=[1]{type, break, continue, delete, else, for, function, if, in,
+ new, return, this, typeof, var, void, while, with, District, const},
+ % Literals, primitive types, and reference types.
+ morekeywords=[2]{false, null, true, boolean, number, undefined,
+ Array, Boolean, Date, Math, Number, String, Object},
+ % Built-ins.
+ morekeywords=[3]{eval, parseInt, parseFloat, escape, unescape},
+ sensitive,
+ morecomment=[s]{/*}{*/},
+ morecomment=[l]//,
+ morecomment=[s]{/**}{*/}, % JavaDoc style comments
+ morestring=[b]',
+ morestring=[b]"
+}[keywords, comments, strings]
+\lstset{basicstyle=\ttfamily,language=SQL,keywordstyle=\color{blue},belowskip=0.5\baselineskip}
+
+\RequirePackage[inline]{enumitem}
+\setlist{font=\color{maincolor}\sffamily\bfseries}
+
+\tcbset{colback=white, colframe=maincolor}
+\setcounter{tocdepth}{3}
+\newcommand{\marginsecnumber}[1]{\makebox[0pt][r]{#1\hspace{1ex}}}
+\newcommand{\achiev}[1]{\emph{achievement} #1}
+\renewcommand*\contentsname{Sommaire}
+
+\newcommand{\code}[1]{{\sffamily\color{maincolor}\texttt{#1}}} % type some 'code' like text
+
+%define page style
+\pagestyle{fancy}
+\renewcommand{\headrulewidth}{.5pt}
+\renewcommand{\footrulewidth}{.5pt}
+\renewcommand{\headrule}{{\color{maincolor}\hrule width\headwidth height\headrulewidth \vskip-\headrulewidth}}
+\renewcommand{\footrule}{{\color{maincolor}\vskip-\footruleskip\vskip-\footrulewidth\hrule width\headwidth height\footrulewidth\vskip\footruleskip}}
+
+%
+\lhead{}
+\chead{}
+\rhead{\textcolor{maincolor}{\leftmark}}
+\lfoot{}
+\cfoot{}
+\rfoot{\sffamily\textcolor{maincolor}{\thepage}}
+
+% Define maincolor variable
+
+\renewcommand{\title}[1]{\noindent\textbf{\color{maincolor}\sffamily\Huge #1}\par\bigskip}
+
+% Change section format
+\titleformat{\section}[block]{\huge\sffamily\bfseries\color{maincolor}}{\marginsecnumber\thesection}{0pt}{}
+\titlespacing{\section}{0pt}{*2.5}{.5ex plus .5ex}
+
+% Change subsection format
+\titleformat{\subsection}{\Large\sffamily\bfseries\color{maincolor}}{\marginsecnumber\thesubsection}{0pt}{}
+\titlespacing{\subsection}{0pt}{*1.5}{.5ex plus .5ex}
+
+
+% Change subsection format
+\titleformat{\subsubsection}{\Large\sffamily\bfseries\color{maincolor}}{\marginsecnumber\thesubsubsection}{0pt}{}
+\titlespacing{\subsubsection}{0pt}{*1.2}{.5ex plus .5ex}
+
+% Change paragraph format
+\titleformat{\paragraph}[runin]{\normalfont\normalsize\bfseries}{\theparagraph}{1em}{}
+\titlespacing*{\paragraph}{0pt}{1ex plus .5ex minus .5ex}{1em}\setcounter{secnumdepth}{4}
+
+\newcommand{\ligne}[0]{{\color{maincolor}\hrule}}
\ No newline at end of file
diff --git a/report/img/graphs/21-create-many.svg b/report/img/graphs/21-create-many.svg
new file mode 100644
index 0000000..7ca68a6
--- /dev/null
+++ b/report/img/graphs/21-create-many.svg
@@ -0,0 +1,320 @@
+
+
+
diff --git a/report/img/graphs/22-create-many-recursive-deadlock.svg b/report/img/graphs/22-create-many-recursive-deadlock.svg
new file mode 100644
index 0000000..0a1833e
--- /dev/null
+++ b/report/img/graphs/22-create-many-recursive-deadlock.svg
@@ -0,0 +1,359 @@
+
+
+
diff --git a/report/img/graphs/22-create-many-recursive.svg b/report/img/graphs/22-create-many-recursive.svg
new file mode 100644
index 0000000..9e352c3
--- /dev/null
+++ b/report/img/graphs/22-create-many-recursive.svg
@@ -0,0 +1,307 @@
+
+
+
diff --git a/report/img/graphs/23-create-many-once.svg b/report/img/graphs/23-create-many-once.svg
new file mode 100644
index 0000000..22794bf
--- /dev/null
+++ b/report/img/graphs/23-create-many-once.svg
@@ -0,0 +1,320 @@
+
+
+
diff --git a/report/img/graphs/51-fibonacci.svg b/report/img/graphs/51-fibonacci.svg
new file mode 100644
index 0000000..e4583cc
--- /dev/null
+++ b/report/img/graphs/51-fibonacci.svg
@@ -0,0 +1,305 @@
+
+
+
diff --git a/report/img/logo_em.jpg b/report/img/logo_em.jpg
new file mode 100644
index 0000000..c2db19e
Binary files /dev/null and b/report/img/logo_em.jpg differ
diff --git a/report/main.tex b/report/main.tex
new file mode 100644
index 0000000..7f9fc56
--- /dev/null
+++ b/report/main.tex
@@ -0,0 +1,20 @@
+\documentclass[french]{article}
+
+\usepackage{headers}
+
+\begin{document}
+
+\include{parts/title}
+
+\setcounter{tocdepth}{3}
+\tableofcontents
+
+\pagebreak
+\sffamily
+\input{parts/introduction}
+\input{parts/part1}
+\input{parts/part2}
+\input{parts/part3}
+\input{parts/part4}
+
+\end{document}
diff --git a/report/parts/introduction.tex b/report/parts/introduction.tex
new file mode 100644
index 0000000..e0608f6
--- /dev/null
+++ b/report/parts/introduction.tex
@@ -0,0 +1,3 @@
+\section{Introduction}
+
+\indent Construire une bibliothèque de \textit{threads} dans le monde utilisateur peut être utile pour l'optimisation de certains aspects calculatoires spécifiques. En effet, les calculs en moins que ne fera pas le \textit{kernel} augmentera la performance globale du code, mais en contrepartie cela nécessitera de devoir implémenter des fonctions inhérentes que pouvait remplir le \textit{kernel} jusqu'alors. Ce rapport mi-parcours vise à appuyer notre vision sur l'implémentation de cette bibliothèque de \textit{threads}. Cette vision qui est axée sur la \textit{performance}, la \textit{sûreté} et pour l'instant sur cette constante \textit{remise en question}: Quels sont les avantages d'une implémentation de \textit{pthread} sans préemption? Comment détecter un deadlock? Quelles optimisations spécifiques au calcul de \textit{Fibonacci} peuvent être actuellement mises en place?
\ No newline at end of file
diff --git a/report/parts/part1.tex b/report/parts/part1.tex
new file mode 100644
index 0000000..a0c8f9e
--- /dev/null
+++ b/report/parts/part1.tex
@@ -0,0 +1,52 @@
+\section{Implémentation}
+
+L'implémentation se distingue en deux parties mais avec une grosse base commune décrite dans \ref{sec:impl_general}.
+
+\subsection{Générale}\label{sec:impl_general}
+
+Nous utilisons une file qui ne contient que les threads non finis et non en attente.
+Lorsque qu'un thread fini, il met celui qui l'attend dans la file.
+On a une file de threads à utiliser pour ne pas libérer/allouer en permanence. Celui qui attend un thread le met dans la file lorsqu'il peut reprendre la main.
+On préalloue 2000 threads au début pour être tranquille. Voir graphes de performances figure \ref{fig:create-many}
+
+\begin{figure}[h!]
+ \centering
+ \begin{minipage}[b]{0.49\linewidth}
+ \centering
+ \subfloat[]{
+ \includesvg[width=\linewidth]{img/graphs/21-create-many.svg}
+ }
+ \end{minipage}
+ \begin{minipage}[b]{0.49\linewidth}
+ \centering
+ \subfloat[]{
+ \includesvg[width=\linewidth]{img/graphs/22-create-many-recursive.svg}
+ }
+ \end{minipage}\par\medskip
+ \begin{minipage}[b]{0.49\linewidth}
+ \centering
+ \subfloat[]{
+ \includesvg[width=\linewidth]{img/graphs/23-create-many-once.svg}
+ }
+ \end{minipage}
+ \caption{Performances sur la création de multiples threads}
+ \label{fig:create-many}
+\end{figure}
+
+Les graphiques montrent une grande différence entre \code{pthread} et nos threads, cela s'explique par le fait que \code{pthread} s'exécute en multi-coeurs et il y a un gros coût de performance à faire cela. On s'attend à un sur-coût équivalent lors de notre future implémentation des threads noyaux.
+
+\subsection{Fibonacci}
+
+L'implémentation pour Fibonacci ne se distingue que sur un aspect important : la technique d'
+ordonnancement. Si dans le cas général nous utilisons une file, pour Fibonacci nous passons à une pile. Cela permet de parcourir l'arbre des appels en profondeur et non en largeur. De fait, nous avons au maximum $h$ threads en même temps, où $h$ est la hauteur de l'arbre des appels, \emph{id est} $n$ pour l'exécution de {\ttfamily fibo(n)}.
+
+En plus de cela, nous trichons \emph{légèrement} sur l'ordonnancement en rendant le premier appel à \code{thread\_yield} inutile. C'est-à-dire que l'ordonnanceur regarde si le thread en court d'exécution a déjà fait un appel à \code{thread\_yield}. Le cas échéant il basculera sur un nouveau thread, sinon celui courant garde la main.
+
+\begin{figure}[h]
+ \centering
+ \includesvg{img/graphs/51-fibonacci.svg}
+ \caption{Performances sur Fibonacci}
+ \label{fig:fibo}
+\end{figure}
+
+Grâce à la comparaison sur la figure \ref{fig:fibo}, nous pouvons voir que notre bibliothèque est bien plus performante que \code{pthreads}. Cela s'explique par notre optimisation pour ce test uniquement là où la glibc est bien plus générale. De plus, cette-dernière utilise les threads noyaux, plus gourmands, qui explorent plusieurs branches en même temps.
\ No newline at end of file
diff --git a/report/parts/part2.tex b/report/parts/part2.tex
new file mode 100644
index 0000000..38c4e58
--- /dev/null
+++ b/report/parts/part2.tex
@@ -0,0 +1,11 @@
+\section{Les mutex}
+
+Les mutex ont été mis en \oe{}uvre à l'aide d'un entier dans une structure, si le mutex est libre, alors cet entier est égal \texttt{1}, sinon il est égal à \texttt{0}. La fonction \texttt{\_\_sync\_bool\_compare\_and\_swap} est utilisée afin de tester la nullité de l'entier codant l'état du mutex et de réserver ce dernier atomiquement.
+
+La difficulté réside dans la mise en \oe{}uvre du comportement à avoir lorsque le mutex est déjà réservé.
+
+Une structure de mutex stocke une FIFO mise en \oe{}uvre à l'aide de \texttt{STAILQ}. Cette FIFO stocke quant à elle des threads en attente de la fin de l'utilisation du mutex en question.
+
+Lorsqu'un thread demande l'accès à un mutex déjà réservé, il est retiré de la liste d'attente de l'ordonnanceur, puis est mis dans la FIFO du mutex. Lorsque le thread qui est en train d'utiliser le mutex libère ce dernier, il prend le premier thread de la FIFO du mutex et le rajoute dans la liste d'attente de l'ordonanceur.
+
+Ce système permet de ne pas donner la main à un thread en train d'attendre l'accès à un mutex, et donc d'économiser des changements de contextes. De plus, il permet de choisir un thread attendant un mutex à libérer en temps constant, pour ensuite le rajouter dans la liste d'attente de l'ordonnanceur.
\ No newline at end of file
diff --git a/report/parts/part3.tex b/report/parts/part3.tex
new file mode 100644
index 0000000..ef3c632
--- /dev/null
+++ b/report/parts/part3.tex
@@ -0,0 +1,19 @@
+\section{Les deadlocks}
+Les deadlocks se produisent lorsque qu'un thread essaye de s'attendre lui même directement ou par l'intermédiaire de d'autre threads. Il est donc nécessaire de savoir quel thread est effectivement attendu lors d'un join.
+
+
+Lorsque qu'un thread est attendu, on stocke dans le champ \code{retvalue} le pointeur vers le thread qui attend. C'est notamment utile pour remettre le thread qui attend dans la fifo principal pour qu'il soit réordonnancé. Mais on peut également l'utiliser, et c'était notre première idée, pour itérer sur la liste des threads qui s'attendent entre eux et récupérer le "dernier thread" attendu afin de s'assurer qu'il ne s'agit pas de celui qui essaye de join.
+
+Cependant cette technique, bien que simple, n'est pas optimisée et est de complexité linéaire par rapport au nombre de thread qui s'attendent entre eux. On peut notamment voir ce manque de performance dans le test \code{22-create-many-recursive}.
+
+Pour résoudre ça, on rajoute un champ vers un pointeur d'une nouvelle structure \code{last\_thread\_t} dans notre structure \code{thread\_entry\_t} qui va permettre de designer le dernier thread qui est attendu.
+Pour récapituler, chaque thread attendu possède une référence vers une structure qui elle pointe vers le dernier thread attendu du groupe. Ainsi la mise à jour et la consultation du dernier thread attendu lors d'un join se fait en temps constant. On peut voir cette structure comme un pointeur d'un pointeur de \code{last\_thread\_t} mais il a été choisi d'introduire une structure pour garder le nombre de références vers cette structure pour pouvoir la free lorsque qu'elle n'est plus utilisée.
+
+\begin{figure}[h]
+ \centering
+ \includesvg[width=\linewidth]{img/graphs/22-create-many-recursive-deadlock.svg}
+ \caption{Comparaison version itérative et version optimisée}
+ \label{fig:deadlock-comparaison}
+\end{figure}
+
+La figure \ref{fig:deadlock-comparaison} nous montre le très net bénéfice de faire intervenir une structure annexe pour consulter le dernier thread attendu. L'écart entre les deux méthodes est aussi prononcé que la différence de performance entre nos threads et ceux de Brieuc.
\ No newline at end of file
diff --git a/report/parts/part4.tex b/report/parts/part4.tex
new file mode 100644
index 0000000..93d29ad
--- /dev/null
+++ b/report/parts/part4.tex
@@ -0,0 +1,25 @@
+\section{Conclusion et prévisions pour la suite}
+
+Même si nous avons une base plutôt avancée, nous pouvons améliorer certains aspects, notamment par l'ajout de fonctionnalités facultatives. Nous pensons ajouter le support des signaux, et surtout de la préemption et le support multicoeurs. Mais il y a un ordre !
+
+\vspace{1\baselineskip}
+Par exemple, implémenter la \textit{préemption} nécessite de:
+
+\vspace{-0.35\baselineskip}
+\begin{enumerate}
+ \item Pouvoir \textbf{déclencher des interruptions asynchrones}. Nous allons choisir l'implémentation de \textit{setitimer} qui enverra le signal \textit{SIGALARM} au processus à intervalle de temps régulier.
+\vspace{-0.5\baselineskip}
+ \item Pouvoir \textbf{gérer le signal envoyé lors de l'interruption}, et ainsi bénéficier d'un \textit{handler} qui va effectuer un changement de contexte.
+ \vspace{-0.5\baselineskip}
+ \item Pouvoir \textbf{protéger des parties communes} à tous les \textit{threads}. Pour \textit{free} ou \textit{yield} par exemple.
+\end{enumerate}
+
+\vspace{-0.35\baselineskip}
+Ainsi, avant d'implémenter cette \textit{préemption}, il sera nécessaire de savoir gérer le signal \textit{SIGALARM}, et ainsi de configurer au préalable un \textit{gestionnaire de signaux}.
+Néanmoins, il n'est pas nécesaire d'implémenter tous les signaux pour cette dernière.
+
+\vspace{0.35\baselineskip}
+On peut s'attendre aussi à une baisse des performances pour les calculs de \textit{Fibonacci}.
+
+\vspace{1\baselineskip}
+En ce qui concerne le \textit{support des machines multicoeurs}, nous avons déjà implémenté les \textit{mutex}. Plusieurs questions subsistent encore concernant l'efficacité de l'ordonnanceur, mais aussi concernant des problèmes de \textit{fausse concurrence}, engendrant une diminution de la performance du code.
\ No newline at end of file
diff --git a/report/parts/title.tex b/report/parts/title.tex
new file mode 100644
index 0000000..15c7b32
--- /dev/null
+++ b/report/parts/title.tex
@@ -0,0 +1,39 @@
+\begin{titlepage}
+ \begin{center}
+ \vspace*{\stretch{1.5}}
+
+ \begin{figure}
+ \centering
+ \includegraphics[scale=0.6]{logo_em}
+ \label{logo:logo_em}
+ \end{figure}
+ \vspace*{\stretch{0.25}}
+
+ \ligne
+ \vspace*{\stretch{0.2}}
+ \title{Rapport intermédiaire IT 202}
+ {\color{maincolor}\large(G1-E2-26137)}
+ \vspace*{12pt}
+ \ligne
+
+ \vspace*{\stretch{0.8}}
+
+ Encadrant:\\
+ \begin{tabular}{rl}
+ \textbf{Mathieu} & \textbf{Faverge} \\
+ \end{tabular}
+
+ \vspace*{\stretch{0.15}}
+ Équipe :\\
+ \begin{tabular}{rl}
+ \textbf{Martin} & \textbf{Eyben} \\
+ \textbf{Nemo} & \textbf{D'Acremont} \\
+ \textbf{Alessandre} & \textbf{Laguierce} \\
+ \textbf{Damien} & \textbf{Delpy} \\
+ \textbf{Victor} & \textbf{Rosada-Canesin}
+ \end{tabular}
+
+ \vspace*{\stretch{2.2}}
+ ENSEIRB-MATMECA \\ Informatique \\ 2024-2025
+ \end{center}
+\end{titlepage}
\ No newline at end of file