Linux |
CentOS 4.8 |
|
makecontext(3) |
makecontext, swapcontext − Manipulation du contexte utilisateur. |
#include <ucontext.h> void makecontext(ucontext_t *ucp, void
*func(), int argc, ...); |
Dans un environnement de type SysV, on dispose du type ucontext_t défini dans <ucontext.h> et des quatre fonctions getcontext(), setcontext(), makecontext() et swapcontext() qui permettent, au niveau utilisateur, des permutations de contextes entre plusieurs threads de contrôle au sein d’un processus. Pour le type et les deux premières fonctions, voir getcontext(2). La fonction makecontext() modifie le contexte pointé par ucp ( qui a été obtenu par un appel à getcontext()). Avant d’appeler makecontext(), il faut allouer une nouvelle pile pour ce contexte, l’affectant à ucp->uc_stack, et définir un contexte successeur, l’affectant à ucp->uc_link. Lorsque ce contexte est activé par la suite (en utilisant setcontext() ou swapcontext()), alors, la fonction func est tout d’abord appelée avec les arguments spécifiés à la suite de argc (où argc doit préciser le nombre de ces arguments), et lorsque cette fonction s’achève, le contexte successeur est activé. Quand le pointeur sur le contexte successeur vaut NULL, le thread se termine. La fonction swapcontext() sauvegarde le contexte actuel dans la structure pointée par oucp et active ensuite le contexte pointé par ucp. |
En cas de succès, makecontext() renvoie 0 tandis que swapcontext() ne rend pas la main à l’appelant. (On peut toutefois revenir à l’appelant en cas d’activation de oucp. Dans un tel cas, swapcontext() se comporte comme si elle renvoyait 0.) En cas d’erreur, les deux fonctions renvoient −1 et positionnent errno de façon appropriée. |
ENOMEM |
Espace de pile disponible insuffisant. |
L’interprétation de ucp->uc_stack est exactement la même que pour sigaltstack(2), à savoir, cette structure contient l’adresse de départ et la longueur d’une zone mémoire destinée à être utilisée comme pile, et ce, sans considération sur le sens d’expansion de la pile. Il n’est donc pas nécessaire pour le programme utilisateur de se soucier de ce sens. |
SUSv2, POSIX 1003.1-2001. |
getcontext(2), sigaction(2), sigaltstack(2), sigprocmask(2), sigsetjmp(3) |
Stéphan Rafin, 2002. |
makecontext(3) |