|
@@ -9,9 +9,9 @@ ou IO completion ports, en proposant une implémentation de
|
|
|
\subsection{poll, select}
|
|
|
|
|
|
Comme dans la partie précédente, on dispose d'une fonction \inltype{select}
|
|
|
+\footnote{\url{https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-select}}
|
|
|
capable d'indiquer l'état de chacun des sockets décrits dans un tableau.
|
|
|
|
|
|
-% TODO: https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-select
|
|
|
\begin{code}{c}{Prototype de la fonction select}
|
|
|
int WSAAPI select(
|
|
|
int nfds,
|
|
@@ -26,7 +26,9 @@ Malheureusement celle-ci ne peut être utilisée que sur des sockets venant de
|
|
|
l'API winsock. Il nous sera donc impossible de l'utiliser pour construire la
|
|
|
boucle événementielle sans changer d'IPC.
|
|
|
|
|
|
-De même, \inltype{poll} n'existe pas comme sous Linux et il s'agit d'une
|
|
|
+De même, \inltype{poll}
|
|
|
+\footnote{\url{https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-wsapoll}}
|
|
|
+n'existe pas comme sous Linux et il s'agit d'une
|
|
|
fonction winsock.
|
|
|
|
|
|
\begin{code}{c}{Prototype de la fonction WSAPoll}
|
|
@@ -46,7 +48,9 @@ Pour obtenir le même effet que les fonctions sous Linux, sur des
|
|
|
\inltype{HANDLE} de façon générique, Windows propose une famille de fonctions de
|
|
|
la forme \inltype{WaitFor*}.
|
|
|
|
|
|
-D'abord, \inltype{WaitForSingleObject} attend que le \inltype{HANDLE} soit
|
|
|
+D'abord, \inltype{WaitForSingleObject}
|
|
|
+\footnote{\url{https://docs.microsoft.com/en-us/windows/desktop/api/synchapi/nf-synchapi-waitforsingleobject}}
|
|
|
+attend que le \inltype{HANDLE} soit
|
|
|
signalé, éventuellement en prenant en compte un ultimatum.
|
|
|
|
|
|
\begin{code}{c}{Prototype de WaitForSingleObject sur MSDN}
|
|
@@ -58,9 +62,9 @@ DWORD WaitForSingleObject(
|
|
|
|
|
|
Cependant, cela correspond peu à notre cas d'usage et sera plutôt utilisé pour
|
|
|
les manipulations de processus. On peut donc s'intéresser à la variante nous
|
|
|
-concernant, qui sans surprise s'appelle \inltype{WaitForMultipleObjects}.
|
|
|
+concernant, qui sans surprise s'appelle \inltype{WaitForMultipleObjects}
|
|
|
+\footnote{\url{https://docs.microsoft.com/en-us/windows/desktop/api/synchapi/nf-synchapi-waitformultipleobjects}}.
|
|
|
|
|
|
-%https://docs.microsoft.com/en-us/windows/desktop/api/synchapi/nf-synchapi-waitformultipleobjects
|
|
|
\begin{code}{c}{Prototype de la fonction WaitForMultipleObjects sur MSDN}
|
|
|
DWORD WaitForMultipleObjects(
|
|
|
DWORD nCount,
|
|
@@ -86,11 +90,16 @@ faut donc parcourir à nouveau le tableau pour trouver les autres
|
|
|
\subsection{Overlapped IO}
|
|
|
|
|
|
Windows fournit ensuite un mécanisme bas niveau pour mettre les opérations d'IO
|
|
|
-en «tâche de fond». Ci-dessous, on voit dans les prototypes des fonctions de
|
|
|
-lecture et écriture
|
|
|
-%TODO phrase pas fini au dessus
|
|
|
+en «tâche de fond»
|
|
|
+\footnote{\url{https://docs.microsoft.com/en-us/windows/desktop/sync/synchronization-and-overlapped-input-and-output}}.
|
|
|
+Ci-dessous, on voit l'argument \inltype{lpOverlapped} dans les prototypes des
|
|
|
+fonctions de lecture
|
|
|
+\footnote{\url{https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-readfile}}
|
|
|
+et écriture
|
|
|
+\footnote{\url{https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-writefile}}
|
|
|
+qui va contenir l'état de l'opération lorsqu'elle est réalisée de façon
|
|
|
+asynchrone.
|
|
|
|
|
|
-%TODO https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-writefile
|
|
|
\begin{code}{c}{Prototype de WriteFile sur MSDN}
|
|
|
BOOL WriteFile(
|
|
|
HANDLE hFile,
|
|
@@ -101,8 +110,6 @@ BOOL WriteFile(
|
|
|
);
|
|
|
\end{code}
|
|
|
|
|
|
-
|
|
|
-%TODO https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-readfile
|
|
|
\begin{code}{c}{Prototype de ReadFile sur MSDN}
|
|
|
BOOL ReadFile(
|
|
|
HANDLE hFile,
|
|
@@ -125,9 +132,10 @@ fournit ainsi un moyen de passer d'un modèle par disponibilité à un modèle p
|
|
|
complétion.
|
|
|
|
|
|
Il est possible d'étendre encore le modèle asynchrone en utilisant des
|
|
|
-«completion routines». Il faut alors utiliser la version suivante:
|
|
|
+«completion routines». Il faut alors utiliser la version \inltype{ReadFileEx}
|
|
|
+\footnote{\url{https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-readfileex}}
|
|
|
+pour la lecture.
|
|
|
|
|
|
-%TODO: https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-readfileex
|
|
|
\begin{code}{c}{Prototype de la fonction ReadFileEx sur MSDN}
|
|
|
BOOL ReadFileEx(
|
|
|
HANDLE hFile,
|
|
@@ -138,10 +146,11 @@ BOOL ReadFileEx(
|
|
|
);
|
|
|
\end{code}
|
|
|
|
|
|
-Le paramètre \inltype{lpCompletionRoutine} est un pointeur de fonction du type
|
|
|
+Le paramètre \inltype{lpCompletionRoutine}
|
|
|
+\footnote{\url{https://msdn.microsoft.com/en-us/574eccda-03eb-4e8a-9d74-cfaecc7312ce}}
|
|
|
+est un pointeur de fonction du type
|
|
|
suivant:
|
|
|
|
|
|
-%TODO: https://msdn.microsoft.com/en-us/574eccda-03eb-4e8a-9d74-cfaecc7312ce
|
|
|
\begin{code}{c}{Définition de LPOVERLAPPED\_COMPLETION\_ROUTINE sur MSDN}
|
|
|
typedef VOID (WINAPI *LPOVERLAPPED_COMPLETION_ROUTINE)(
|
|
|
_In_ DWORD dwErrorCode,
|
|
@@ -161,11 +170,11 @@ système similaire à epoll, dans un modèle par complétion, en étendant les
|
|
|
sur beaucoup de points donc elle sera plus longuement décrite ici pour apporter
|
|
|
des explications dans ce rapport.
|
|
|
|
|
|
-Un IOCP peut être créé avec la fonction \inltype{CreateIoCompletionPort} en
|
|
|
-passant \inltype{INVALID_HANDLE_VALUE} comme \inltype{FileHandle} et
|
|
|
+Un IOCP peut être créé avec la fonction \inltype{CreateIoCompletionPort}
|
|
|
+\footnote{\url{https://docs.microsoft.com/en-us/windows/desktop/fileio/createiocompletionport}}
|
|
|
+en passant \inltype{INVALID_HANDLE_VALUE} comme \inltype{FileHandle} et
|
|
|
\inltype{NULL} comme \inltype{ExistingCompletionPort}.
|
|
|
|
|
|
-% TODO: https://docs.microsoft.com/en-us/windows/desktop/fileio/createiocompletionport
|
|
|
\begin{code}{c}{Prototype de CreateIoCompletionPort sur MSDN}
|
|
|
HANDLE WINAPI CreateIoCompletionPort(
|
|
|
_In_ HANDLE FileHandle,
|
|
@@ -195,9 +204,10 @@ construction, mais le cas ne nous intéresse pas pour l'implémentation de
|
|
|
\inltype{vlc_msg_poller_t}.
|
|
|
|
|
|
Une fois les opérations associées au port, on peut utiliser
|
|
|
-\inltype{GetQueuedCompletionStatus} pour récupérer un paquet de complétion.
|
|
|
+\inltype{GetQueuedCompletionStatus}
|
|
|
+\footnote{\url{https://msdn.microsoft.com/en-us/library/Aa364986(v=VS.85).aspx}}
|
|
|
+pour récupérer un paquet de complétion.
|
|
|
|
|
|
-% TODO: https://msdn.microsoft.com/en-us/library/Aa364986(v=VS.85).aspx
|
|
|
\begin{code}{c}{Prototype de GetQueuedCompletionStatus sur MSDN}
|
|
|
BOOL WINAPI GetQueuedCompletionStatus(
|
|
|
_In_ HANDLE CompletionPort,
|
|
@@ -214,10 +224,10 @@ la structure \inltype{OVERLAPPED} contenant les données et informations liées
|
|
|
l'opération effectuée.
|
|
|
|
|
|
Enfin, il sera possible de poster une notification sans effectuer d'opération en
|
|
|
-appelant \inltype{PostQueuedCompletionStatus}, afin de débloquer la boucle
|
|
|
-événementielle par exemple.
|
|
|
+appelant \inltype{PostQueuedCompletionStatus}
|
|
|
+\footnote{\url{https://docs.microsoft.com/en-us/windows/desktop/FileIO/postqueuedcompletionstatus}},
|
|
|
+afin de débloquer la boucle événementielle par exemple.
|
|
|
|
|
|
-% TODO: https://docs.microsoft.com/en-us/windows/desktop/FileIO/postqueuedcompletionstatus
|
|
|
\begin{code}{c}{Prototype de PostQueuedCompletionStatus}
|
|
|
BOOL WINAPI PostQueuedCompletionStatus(
|
|
|
_In_ HANDLE CompletionPort,
|