Sous-routine pthread_getthrds_np

Objectif

Extrait les informations de registre et de pile pour les unités d'exécution.

Bibliothèque

Bibliothèque d'unités d'exécution (libpthreads.a)

Syntaxe

#include <pthread.h>

int pthread_getthrds_np (thread, mode, buf, bufsize, regbuf, regbufsize)
pthread_t *ptid;
int mode;
struct __pthrdsinfo *buf;
int bufsize;
void *regbuf;
int *regbufsize;

Descriptif

La sous-routine pthread_getthrds_np extrait des informations sur l'état de l'unité d'exécution thread et de son unité d'exécution de noyau sous-jacente, y compris des informations d'enregistrement et de pile. L'unité d'exécution thread doit être à l'état suspendu pour fournir des informations d'enregistrement pour les unités d'exécution.

Paramètres

Tableau 1. Paramètres
Article Descriptif
unité d"exécution Pointeur vers l'unité d'exécution. En entrée, il identifie l'unité d'exécution cible de l'opération, ou 0 pour opérer sur la première entrée de la liste des unités d'exécution. En sortie, il identifie l'entrée suivante de la liste des unités d'exécution, ou 0 si la fin de la liste a été atteinte. pthread_getthrds_np peut être utilisé pour parcourir l'ensemble de la liste des unités d'exécution en commençant par thread pointant vers 0 et en appelant pthread_getthrds_np de manière répétée jusqu'à ce qu'il renvoie thread pointant vers 0.
mode Indique le type de requête. Ces valeurs peuvent être regroupées par bit ou ensemble pour spécifier plusieurs types de requête.
PTHRDSINFO_QUERY_GPRS
obtenir des registres à usage général
PTHRDSINFO_QUERY_SPRS
obtenir des registres spéciaux
PTHRDSINFO_QUERY_FPRS
obtenir des registres à virgule flottante
Pthrdsinfo_query_regs
obtenir tous les registres ci-dessus
PTHRDSINFO_QUERY_TID
obtenir l'ID d'unité d'exécution du noyau
PTHRDSINFO_QUERY_TLS
obtenir les informations sur le stockage local de l'unité d'exécution.

Cette valeur peut être associée à n'importe quelle valeur du paramètre de mode. Les informations de stockage local de l'unité d'exécution sont renvoyées à l'appelant dans une mémoire tampon fournie par l'appelant, regbuf. Si la mémoire tampon est trop petite pour les données, elle est remplie jusqu'à la fin de la mémoire tampon et ERANGE est renvoyé. L'appelant fournit également la taille de la mémoire tampon, regbufsize, qui, en retour, est remplacée par la taille des informations de mémoire locale de l'unité d'exécution, même si elle ne tient pas dans une mémoire tampon.

Les informations de stockage local de l'unité d'exécution sont renvoyées sous la forme d'un tableau de touplets: adresse mémoire et région TLS (numéro unique attribué par le chargeur). La région TLS est également incluse dans la structure d'informations du chargeur renvoyée par loadquery. Si vous avez besoin d'informations supplémentaires, telles que la taille TLS, vous pouvez la trouver dans cette structure.
#typedef struct __pthrdstlsinfo{
        void *pti_vaddr;
        int   pti_region;
    } PTHRDS_TLS_INFO;
PTHRDSINFO_QUERY_EXTCTX
obtenir le contexte étendu de la machine
PTHRDSINFO_QUERY_ALL
obtenir tout (sauf pour le contexte étendu, qui doit être explicitement demandé)
buf Indique l'adresse de la structure __pthrdsinfo qui sera renseignée par pthread_getthrds_np. Au retour, cette structure contient les données suivantes (selon le type de requête demandé):
__pi_ptid
Identificateur d'unité d'exécution de l'unité d'exécution
__pi_tid
ID d'unité d'exécution du noyau de l'unité d'exécution, ou 0 si l'unité d'exécution n'a pas d'unité d'exécution du noyau
__pi_état
Etat de l'unité d'exécution, égal à l'un des suivants:
PTHRDSINFO_STATE_RUN
L'unité d'exécution est en cours d'exécution
PTHRDSINFO_STATE_READY
L'unité d'exécution est prête à être exécutée
PTHRDSINFO_STATE_IDLE
L'unité d'exécution est en cours d'initialisation
PTHRDSINFO_STATE_SLEEP
L'unité d'exécution est en veille
Pthrdsinfo_terme_état
L'unité d'exécution est arrêtée
PTHRDSINFO_STATE_NOTSUP
Error condition
__pi_suspendu
1 si l'unité d'exécution est suspendue, 0 si elle n'est pas
__pi_renvoyé
Statut de retour de l'unité d'exécution
__pi_ustk
Pointeur de pile utilisateur de l'unité d'exécution
__pi_contexte
Contexte de l'unité d'exécution (informations d'enregistrement)

Si le mode PTHRDSINFO_QUERY_EXTCTX est demandé, le buf spécifie l'adresse d'une structure _pthrdsinfox qui, en plus de toutes les informations précédentes, contient également les éléments suivants:

__pi_ec
Contexte étendu de l'unité d'exécution (état de registre étendu)
taillebuf Taille de la structure __pthrdsinfo ou __pthrdsinfox en octets.
regbuf Emplacement de la mémoire tampon pour stocker les données de sauvegarde du registre et pour transmettre les informations TLS à partir du noyau si l'unité d'exécution est dans un appel système.
tailleregbuf Pointeur vers la taille de la mémoire tampon regbuf . En entrée, il identifie la taille maximale de la mémoire tampon en octets. Dans la sortie, il identifie le nombre d'octets de données de sauvegarde de registre et transmet les informations TLS. Si l'unité d'exécution n'est pas dans un appel système, aucune donnée de sauvegarde de registre n'est renvoyée par le noyau et regbufsize a la valeur 0. Si la taille des données de sauvegarde du registre est supérieure à la valeur d'entrée de regbufsize, le nombre d'octets spécifié par la valeur d'entrée de regbufsize est copié dans regbuf, pthread_getthrds_np() renvoie ERANGE et la valeur de sortie de regbufsize indique le nombre d'octets requis pour contenir toutes les données de sauvegarde du registre.

Valeurs renvoyées

En cas de réussite, la fonction pthread_getthrds_np renvoie zéro. Sinon, un numéro d'erreur est renvoyé pour indiquer l'erreur.

Codes d'erreur

La fonction pthread_getthrds_np échoue si:

Tableau 2. Codes d'erreur
Article Descriptif
EINVAL thread ou buf est NULL ou bufsize n'est pas égal à la taille de la structure __pthrdsinfo dans la bibliothèque.
ESRCH Aucune unité d'exécution correspondant à celle spécifiée par l'ID d'unité d'exécution unité d'exécutionn'a été trouvée.
ERANGE regbuf n'était pas assez grand pour traiter toutes les données de sauvegarde du registre.
ENOMEM La mémoire est insuffisante pour effectuer cette opération.