Skip to main content

clone_thread

Function clone_thread 

Source
pub unsafe fn clone_thread(
    args: &CloneArgs,
    entry: extern "C" fn(usize),
    arg: usize,
) -> Result<Tid, Errno>
Expand description

Crée un thread (mémoire partagée, CLONE_VM) via clone3(2).

Contrairement à clone3 (réservé au fork), clone_thread ne « retourne pas deux fois » : le nouveau thread exécute le point d’entrée entry(arg) sur sa pile dédiée via un trampoline assembleur, puis — si entry revient — termine le seul thread courant par SYS_exit (jamais exit_group). Seul le parent revient de cette fonction, avec le [Tid] du nouveau thread.

§Join (terminaison observable)

Les threads CLONE_THREAD ne sont pas waitable via waitid. Le join se fait par CLONE_CHILD_CLEARTID : positionner [CloneFlags::CHILD_CLEARTID] et renseigner [CloneArgs::child_tid] sur un mot core::sync::atomic::AtomicU32 partagé. À la mort du thread, le kernel remet ce mot à 0 et émet un FUTEX_WAKE (de portée partagée — sans FUTEX_PRIVATE_FLAG) dessus. Pour initialiser le mot avec le TID sans course, ajouter [CloneFlags::PARENT_SETTID] avec [CloneArgs::parent_tid] sur le même mot (écrit par le kernel, côté parent, avant le retour). Le parent joint alors en bouclant futex_wait jusqu’à lire 0 (cf. la famille futex).

§Errors

  • [Errno::EINVAL] si la validation amont échoue : stack absent, [CloneFlags::VM] absent, adresse de pile nulle, taille < 4096, addr ou size non alignés sur 16, ou sommet de pile en débordement. Le kernel peut aussi rendre EINVAL pour une combinaison de drapeaux incohérente (p. ex. CLONE_THREAD avec un exit_signal).
  • EAGAIN/ENOMEM (stub partiel Errno) : limites système / mémoire kernel.

§Safety

Hautement unsafe. L’appelant doit garantir :

  • Pile. stack désigne une région mémoire valide, possédée, exclusivement réservée au nouveau thread, d’au moins size octets, et non libérée tant que le thread n’est pas joint (sinon use-after-free de la pile).
  • Point d’entrée. entry ne doit exécuter que des opérations sûres dans ce contexte naissant : aucune variable thread_local (sauf [CloneArgs::tls] fourni avec un bloc TLS valide via [CloneFlags::SETTLS]), pas d’unwind/panic traversant le trampoline, pas de dépendance à un état d’initialisation propre au thread. Les écritures en mémoire partagée (VM commune) doivent être thread-safe (Atomic*).
  • arg. Sa signification est définie par entry ; s’il encode un pointeur, la cible doit rester vivante et correctement synchronisée.
  • Join. child_tid/parent_tid (si fournis) pointent un AtomicU32 vivant jusqu’à la fin du join.