Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

open primitives should be coded non-blocking because of FIFO #8005

Closed
vicuna opened this issue Feb 2, 2003 · 3 comments
Closed

open primitives should be coded non-blocking because of FIFO #8005

vicuna opened this issue Feb 2, 2003 · 3 comments
Labels

Comments

@vicuna
Copy link

vicuna commented Feb 2, 2003

Original bug ID: 1533
Reporter: administrator
Status: closed
Resolution: fixed
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)

Bug description

{{in french}}

Chers developpeurs d'Ocaml (tout particulierement Xavier Leroy qui
doit connaitre mieux que moi toutes les subtilités ici)

Les primitives d'ouverture de fichiers devraient être non bloquantes
en mode multithread.

En effet, open peut être bloquant quand on ouvre un FIFO.

D'apres la man page de fifo(4) sous Linux

   The kernel maintains exactly one pipe object for each FIFO
   special file that is opened by at least one process.  The FIFO
   must be opened on both ends (reading and writing) before data
   can be passed.  Normally, opening the FIFO blocks until the
   other end is opened also.

   A process can open a FIFO in non-blocking mode. In this case,
   opening for read only will succeed even if noone has opened on
   the write side yet; opening for write only will fail with ENXIO
   (no such device or address) unless the other end has already
   been opened.

   Under Linux, opening a FIFO for read and write will succeed
   both in blocking and non-blocking mode. POSIX leaves this
   behaviour undefined. This can be used to open a FIFO for
   writing while there are no readers available.  A process that
   uses both ends of the connection in order to communicate with
   itself should be very careful to avoid deadlocks.

Il me semble (et mon experience dans POESIA tend à le montrer) que
l'ouverture d'un FIFO en écriture bloque tout le processus, et pas
seulement le thread Ocaml qui fait open. C'est à mon avis un bogue
(que je trouve génant, mais je reconnais que c'est tordu) du runtime
OCaml.

Je n'ai pas le temps (au moins pas avant vendredi) d'exhiber un
exemple simple illustrant ce bogue. (J'ai une revue de projet
européen sur POESIA et ne pourrais pas lire mon mail avant jeudi)

Amicalement.

--

Basile STARYNKEVITCH http://starynkevitch.net/Basile/
email: basilestarynkevitchnet
alias: basiletunesorg
8, rue de la Faïencerie, 92340 Bourg La Reine, France

@vicuna
Copy link
Author

vicuna commented Feb 11, 2003

Comment author: administrator

Les primitives d'ouverture de fichiers devraient être non bloquantes
en mode multithread.
Il me semble (et mon experience dans POESIA tend à le montrer) que
l'ouverture d'un FIFO en écriture bloque tout le processus, et pas
seulement le thread Ocaml qui fait open. C'est à mon avis un bogue
(que je trouve génant, mais je reconnais que c'est tordu) du runtime
OCaml.

Ca marche normalement avec les threads systeme (seul le thread faisant open()
est bloque). Avec les threads bytecode, il est essentiellement impossible
d'implementer le meme comportement: il n'y a pas d'equivalent de select()
pour demander "previens-moi quand je pourrais ouvrir ce pipe nomme sans
bloquer";
quant a ouvrir systematiquement en mode non bloquant, ca change le comportement
de l'application, donc c'est a l'application de le demander en mettant l'option
NONBLOCK sur l'appel a open.

  • Xavier Leroy

@vicuna
Copy link
Author

vicuna commented Feb 11, 2003

Comment author: administrator

"Xavier" == Xavier Leroy caml-bugs@pauillac.inria.fr writes:

>> Les primitives d'ouverture de fichiers devraient être non
>> bloquantes en mode multithread.  Il me semble (et mon
>> experience dans POESIA tend à le montrer) que l'ouverture d'un
>> FIFO en écriture bloque tout le *processus*, et pas seulement
>> le thread Ocaml qui fait open. C'est à mon avis un bogue (que
>> je trouve génant, mais je reconnais que c'est tordu) du runtime
>> OCaml.

Xavier> Ca marche normalement avec les threads systeme (seul le
Xavier> thread faisant open() est bloque). [...]

Merci de ta réponse, mais en es tu sûr? Ca ne correspond pas à mes
observations!

La fonction open_descriptor_in de ocaml/byterun/io.c (cvs rev 1.62) ne
contient pas d'appel à enter_blocking_section & leave_blocking_section

Mais je reconnais que je n'ai pas tout compris de io.c; il y a
sûrement un détail qui m'échappe?

(Sinon, tu peux piquer sans vergogne le petit bout de code qui fait
usleep et uname dans Poesia), le voici pour te faciliter la tâche:

void poesiamonicap_usleep_ml(value usec_v)
{
// this is hugly, but it is only declared in ocaml-3.06/byterun/signals.h
CAMLextern void enter_blocking_section (void);
CAMLextern void leave_blocking_section (void);
CAMLparam1(usec_v);
long usec = Long_val(usec_v);
enter_blocking_section();
if (usec>=0) usleep(usec);
leave_blocking_section();
CAMLreturn0;
} // end of poesiamonicap_usleep_ml

value
poesiamonicap_uname_ml(void) {
struct utsname uts;
CAMLparam0();
CAMLlocal1(res_v);
CAMLlocal5(sysname_v,nodename_v,release_v,version_v,machine_v);
memset(&uts, 0, sizeof(uts));
if (uname(&uts)) failwith("Util.uname failed");
sysname_v = copy_string(uts.sysname);
nodename_v = copy_string(uts.nodename);
release_v = copy_string(uts.release);
version_v = copy_string(uts.version);
machine_v = copy_string(uts.machine);
res_v = alloc_tuple(5);
Store_field(res_v, 0, sysname_v);
Store_field(res_v, 1, nodename_v);
Store_field(res_v, 2, release_v);
Store_field(res_v, 3, version_v);
Store_field(res_v, 4, machine_v);
CAMLreturn(res_v);
} /* end of poesiamonicap_uname_ml */

--

Basile STARYNKEVITCH http://starynkevitch.net/Basile/
email: basilestarynkevitchnet
alias: basiletunesorg
8, rue de la Faïencerie, 92340 Bourg La Reine, France

@vicuna
Copy link
Author

vicuna commented Feb 11, 2003

Comment author: administrator

XL, 2003-02-11: turned sys_open and unix_open into blocking sections. This
fixes the
issue with system threads. For bytecode threads, no way to work around this
issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant