OVH Cloud OVH Cloud

va_args et réentrance...

7 réponses
Avatar
Stephane Zuckerman
Bonjour,

En revoyant certains bouts de codes dans quelques programmes, je me suis
souvenu des milliards de warnings levés dans tout autant de milliards de
livres et articles parlant de programmation en C (et plus spécifiquement
UNIX, d'où le follow-up).

Y a-t-il quelque part (dans la norme de C, ou ailleurs) une raison qui
fasse que les va_args ne soient pas thread-safe ? Si non, pourquoi ne pas
avoir réimplémenté les différentes libc avec un mécanisme réentrant ?

--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)

7 réponses

Avatar
DINH Viêt Hoà

Y a-t-il quelque part (dans la norme de C, ou ailleurs) une raison qui
fasse que les va_args ne soient pas thread-safe ?


La norme C ne connaît pas les threads.

Si non, pourquoi ne pas avoir réimplémenté les différentes libc avec
un mécanisme réentrant ?


Cela demanderait de définir une sémantique par rapport aux threads (un
contexte par thread ou pas ?). Si on choisit de mettre un contexte par
thread, cela prendrait évidemment plus de mémoire.
Si on choisit de mettre un contexte partagé, je pense qu'on peut tomber
sur des comportement imprévisibles (du fait de la schedulation des
threads). Et cela demande de mettre un verrou, ce qui dégrade les
performances.

D'ailleurs, je pense que pour régler tous ces problèmes, il existe
va_copy(). Cela devrait largement suffire et on a une sémantique assez
claire.

--
DINH V. Hoa,

"T'aurais pas une question sur le langage C ?" -- Emmanuel Delahaye

Avatar
FAb
DINH Viêt Hoà writes:


Y a-t-il quelque part (dans la norme de C, ou ailleurs) une raison qui
fasse que les va_args ne soient pas thread-safe ?


La norme C ne connaît pas les threads.

Si non, pourquoi ne pas avoir réimplémenté les différentes libc avec
un mécanisme réentrant ?


Cela demanderait de définir une sémantique par rapport aux threads (un
contexte par thread ou pas ?). Si on choisit de mettre un contexte par
thread, cela prendrait évidemment plus de mémoire.
Si on choisit de mettre un contexte partagé, je pense qu'on peut tomber
sur des comportement imprévisibles (du fait de la schedulation des
threads). Et cela demande de mettre un verrou, ce qui dégrade les
performances.

D'ailleurs, je pense que pour régler tous ces problèmes, il existe
va_copy(). Cela devrait largement suffire et on a une sémantique assez
claire.


On peut faire le même reproche pour les tables de hachage...
Par défaut y en a qu'une. Ça limite pas mal.

Fabrice.


Avatar
Laurent Coustet
Stephane Zuckerman wrote:
Bonjour,


Bonjour,

En revoyant certains bouts de codes dans quelques programmes, je me suis
souvenu des milliards de warnings levés dans tout autant de milliards de
livres et articles parlant de programmation en C (et plus spécifiquement
UNIX, d'où le follow-up).

Y a-t-il quelque part (dans la norme de C, ou ailleurs) une raison qui
fasse que les va_args ne soient pas thread-safe ? Si non, pourquoi ne pas
avoir réimplémenté les différentes libc avec un mécanisme réentrant ?



Ah ben je suis fortement intéressé par la question aussi!

PS: sous OpenBSD vsnprint EST reentrante.

--
Laurent Coustet
http://ed.zehome.com/

Avatar
Nicolas George
Stephane Zuckerman wrote in message
:
En revoyant certains bouts de codes dans quelques programmes, je me suis
souvenu des milliards de warnings levés dans tout autant de milliards de
livres et articles parlant de programmation en C (et plus spécifiquement
UNIX, d'où le follow-up).

Y a-t-il quelque part (dans la norme de C, ou ailleurs) une raison qui
fasse que les va_args ne soient pas thread-safe ?


Je n'ai jamais entendu parler de cette histoire. Tu as des références ? Et
tu parles de quelle interface d'arguments variables : stdarg.h ou une
interface plus ancienne ?

Avatar
Stephane Zuckerman
Je n'ai jamais entendu parler de cette histoire. Tu as des références ? Et
tu parles de quelle interface d'arguments variables : stdarg.h ou une
interface plus ancienne ?


Bon je viens de revérifier dans certains bouquins (dont le unix network
programming au chapitre des threads), et effectivement
"officiellement", le problème de réentrance ne devrait pas se poser avec
les implémentations actuelles (donc pas stdarg.h). Maintenant, je suis
certain d'être passé devant pas mal d'articles parlant de problèmes
d'implémentation. Je vais re-chercher.

--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)

Avatar
Sylvain/11XX
Oui je vois une raison.

les parametres va_args donc tu parles sont ceux du main ? ou de n'importe
quelle autre fonction ? aprceque la réponse est differente selon le cas.

SB

"Stephane Zuckerman" a écrit dans le message de
news:
Bonjour,

En revoyant certains bouts de codes dans quelques programmes, je me suis
souvenu des milliards de warnings levés dans tout autant de milliards de
livres et articles parlant de programmation en C (et plus spécifiquement
UNIX, d'où le follow-up).

Y a-t-il quelque part (dans la norme de C, ou ailleurs) une raison qui
fasse que les va_args ne soient pas thread-safe ? Si non, pourquoi ne pas
avoir réimplémenté les différentes libc avec un mécanisme réentrant ?

--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)


Avatar
DINH Viêt Hoà

Oui je vois une raison.

les parametres va_args donc tu parles sont ceux du main ? ou de n'importe
quelle autre fonction ? aprceque la réponse est differente selon le cas.


j'avoue que dans l'enchaînement du fil de discussion, je commence à de
moins en moins comprendre ce que veux dire 'réentrant'. Le sens a l'air
de varier d'une réponse à l'autre.

--
DINH V. Hoa,

"s/^((.|[^[]|[(^.|[^^])[^]]*])*)([^*[])/14/"
-- Stéphane CHAZELAS