From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: michael.cadilhac@lrde.org (=?iso-8859-1?Q?Micha=EBl?= Cadilhac) Newsgroups: gmane.emacs.devel Subject: Re: delete-process bug Date: Tue, 30 May 2006 00:32:25 +0200 Organization: Epita/LRDE Message-ID: <871wucfona.fsf@lrde.org> References: <87k69eyddj.fsf@lrde.org> <87odxjakox.fsf@lrde.org> <8764jrlewm.fsf@lrde.org> <87pshyqgtd.fsf@lrde.org> <87fyiuq9t5.fsf@lrde.org> <877j45rj3w.fsf@lrde.org> <87k684y4uz.fsf@lrde.org> <87irnofqy8.fsf@lrde.org> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1170626799==" X-Trace: sea.gmane.org 1148941924 11856 80.91.229.2 (29 May 2006 22:32:04 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Mon, 29 May 2006 22:32:04 +0000 (UTC) Cc: agustin.martin@hispalinux.es, emacs-devel@gnu.org, storm@cua.dk Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue May 30 00:32:00 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1FkqHF-0000rF-TJ for ged-emacs-devel@m.gmane.org; Tue, 30 May 2006 00:31:58 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1FkqHF-00053V-AR for ged-emacs-devel@m.gmane.org; Mon, 29 May 2006 18:31:57 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1FkqH2-00052S-1P for emacs-devel@gnu.org; Mon, 29 May 2006 18:31:44 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1FkqH1-000528-KB for emacs-devel@gnu.org; Mon, 29 May 2006 18:31:43 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1FkqH1-000523-Ao for emacs-devel@gnu.org; Mon, 29 May 2006 18:31:43 -0400 Original-Received: from [62.39.139.2] (helo=kualalumpur.lrde.epita.fr) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA:32) (Exim 4.52) id 1FkqMe-00055g-3y; Mon, 29 May 2006 18:37:32 -0400 Original-Received: from mahaena.lrde.epita.fr ([192.168.101.66] helo=mahaena.lrde) by kualalumpur.lrde.epita.fr with esmtp (Exim 4.50) id 1FkqGx-0007SZ-Ea; Tue, 30 May 2006 00:31:39 +0200 Original-To: Eli Zaretskii Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAElBMVEU/JREXDATg1LV8UCao i1fQpmoP3Nd6AAACa0lEQVQ4jWWUQW7jMAxFqZEPICJzAjXeM6W8dyNqX9ji/a8yn04xnWIEJLD9 LJH85DcJFyJV3erqPty8ExHfBikXSdn0WVezC0hOAQiA2nCsAHOqEnPe4k+puU8zw/t+xquqjRKA 4lHsmQBT8C5pDtBwfwH8VdcHI5+FHtjRxrQRwZsf3hNjZRKAPEzHEdH9mFNSYb5dQK3r8KM6ftNy KikAirDZFWdVkDqbxjGFbAcwbQCxxc8mPRHUGOcCIMgMACV23RfJTch3gC6ofT3qCdG0NyUUPfYF yQrKCIAnuYsgX2qPzW2i9sNrfSOSPPZQiygtCNlCjlpXJV38lIKshF/AZzsAMoArdCKNHfXukPuJ ImbLh+9J2gXwap0QpZ7NjZ7ekdkFcDiqPiLGcHmuvaG/AHgy62s52Lae1ABoA7D6d2kDoAvgbnyD ZutEd6lTHOXfYPHVJDH1K8a1+oyrjoZpAGn1x5pfwPr2E9yjxSpk50/gEyKgD/+BD/KzN3tQ13b8 Cx5loF0AgnZf5IUny9hRHQOYBllHDM+6s3oviZBu77mFjDm621Np3hkjR90wE1BkTYvhdDgDgCmR xWChFfcYAOqMm5NZkVWMur8AL5+oeMQOob2FmY76FiM+PrDDZypwGdqokSlAaQOmGH6mW8KpsOwl 0YOLedjSITr6scNRF8D4PesH33QmLrx8AzjpV/3kkg025w2gfAFYKCLluJAc4Ap+h18oo4S8wzaY klDsBUTiY8EZFkg5Iass75FubC9wd8qa0u9+gRxAsAKEaRAo6iB+vwCMGmdBjvgidQGA1ntMX4CS ZYGV/wADyL80LIX/UAAAAABJRU5ErkJggg== In-Reply-To: (Eli Zaretskii's message of "Tue, 30 May 2006 01:11:51 +0300") User-Agent: Gnus/5.110006 (No Gnus v0.6) Emacs/22.0.50 (gnu/linux) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:55460 Archived-At: --===============1170626799== Content-Type: multipart/signed; boundary="==-=-="; micalg=pgp-sha1; protocol="application/pgp-signature" --==-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Transfer-Encoding: quoted-printable Eli Zaretskii writes: >> From: michael.cadilhac@lrde.org (=3D?iso-8859-1?Q?Micha=3DEBl?=3D Cadilh= ac) >> Cc: agustin.martin@hispalinux.es, emacs-devel@gnu.org, storm@cua.dk >> Date: Mon, 29 May 2006 23:42:39 +0200 >>=20 >> I will summarize the whole thing: > > Thanks. I think I understand now. > >> AFAICT, both functions are just in a #ifdef subprocesses. But, maybe, >> in some systems, sigchld_handler is not used albeit compiled. >>=20 >> The question I asked is : do we have to disable the >> `deleted_process_alist' mechanism in some configuration to avoid that >> it will be filled but never cleaned ? > > Well, as we established, at least on MS-Windows, sigchld_handler _is_ > called, so your fix should work for the Windows build, AFAIU. So, AFAIU too, if delete_process can be called (protected by #ifdef subprocesses), sigchld_handler can be too. Patch updated to remove #ifdef SIGCHLD guards attached. It addresses all the problems we've seen so far, and seems to work (AFAICT)= .=20 --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=process.patch Content-Transfer-Encoding: quoted-printable Index: src/process.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /sources/emacs/emacs/src/process.c,v retrieving revision 1.481 diff -c -r1.481 process.c *** src/process.c 8 May 2006 05:19:42 -0000 1.481 =2D-- src/process.c 29 May 2006 22:26:17 -0000 *************** *** 778,783 **** =2D-- 778,791 ---- return proc; } =20=20 +=20 + /* Fdelete_process promises to immediately forget about the process, but = in + reality, Emacs needs to remember those processes until they have been + treated by sigchld_handler; otherwise this handler would consider the + process as being synchronous and say that the synchronous process is + dead. */ + static Lisp_Object deleted_pid_list; +=20 DEFUN ("delete-process", Fdelete_process, Sdelete_process, 1, 1, 0, doc: /* Delete PROCESS: kill it and forget about it immediately. PROCESS may be a process, a buffer, the name of a process or buffer, or *************** *** 799,810 **** } else if (XINT (p->infd) >=3D 0) { ! Fkill_process (process, Qnil); ! /* Do this now, since remove_process will make sigchld_handler do n= othing. */ ! p->status ! =3D Fcons (Qsignal, Fcons (make_number (SIGKILL), Qnil)); ! XSETINT (p->tick, ++process_tick); ! status_notify (p); } remove_process (process); return Qnil; =2D-- 807,835 ---- } else if (XINT (p->infd) >=3D 0) { ! Lisp_Object symbol; !=20 ! /* No problem storing the pid here, as it is still in Vprocess_alis= t. */ ! deleted_pid_list =3D Fcons (make_fixnum_or_float (p->pid), ! /* GC treated elements set to nil. */ ! Fdelq (Qnil, deleted_pid_list)); ! /* If the process has already signaled, remove it from the list. */ ! if (p->raw_status_new) ! update_status (p); ! symbol =3D p->status; ! if (CONSP (p->status)) ! symbol =3D XCAR (p->status); ! if (EQ (symbol, Qsignal) || EQ (symbol, Qexit)) ! Fdelete (make_fixnum_or_float (p->pid), deleted_pid_list); ! else ! { ! Fkill_process (process, Qnil); ! /* Do this now, since remove_process will make sigchld_handler do noth= ing. */ ! p->status ! =3D Fcons (Qsignal, Fcons (make_number (SIGKILL), Qnil)); ! XSETINT (p->tick, ++process_tick); ! status_notify (p); ! } } remove_process (process); return Qnil; *************** *** 6373,6378 **** =2D-- 6398,6412 ---- =20=20 /* Find the process that signaled us, and record its status. */ =20=20 + /* The process can have been deleted by Fdelete_process. */ + tail =3D Fmember (make_fixnum_or_float (pid), deleted_pid_list); + if (!NILP (tail)) + { + Fsetcar (tail, Qnil); + goto sigchld_end_of_loop; + } +=20 + /* Otherwise, if it is asynchronous, it is in Vprocess_alist. */ p =3D 0; for (tail =3D Vprocess_alist; GC_CONSP (tail); tail =3D XCDR (tail)) { *************** *** 6424,6431 **** EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0); } =20=20 ! /* There was no asynchronous process found for that id. Check ! if we have a synchronous process. */ else { synch_process_alive =3D 0; =2D-- 6458,6465 ---- EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0); } =20=20 ! /* There was no asynchronous process found for that pid: we have ! a synchronous process. */ else { synch_process_alive =3D 0; *************** *** 6442,6447 **** =2D-- 6476,6485 ---- EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0); } =20=20 +=20 + sigchld_end_of_loop: + ; +=20 /* On some systems, we must return right away. If any more processes want to signal us, we will get another signal. *************** *** 6843,6848 **** =2D-- 6881,6887 ---- FD_SET (0, &input_wait_mask); =20=20 Vprocess_alist =3D Qnil; + deleted_pid_list =3D Qnil; for (i =3D 0; i < MAXDESC; i++) { chan_process[i] =3D Qnil; *************** *** 6981,6986 **** =2D-- 7020,7026 ---- staticpro (&Qlast_nonmenu_event); =20=20 staticpro (&Vprocess_alist); + staticpro (&deleted_pid_list); =20=20 DEFVAR_BOOL ("delete-exited-processes", &delete_exited_processes, doc: /* *Non-nil means delete processes immediately when they exi= t. --=-=-= Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable =2D-=20 | Micha=EBl `Micha' Cadilhac | Le copillage-collage = | | Epita/LRDE Promo 2007 | tue le programmeur. = | | http://www.lrde.org/~cadilh_m | -- Dictons LRDE = | `-- - JID: micha@amessage.be --' - -= -' --=-=-=-- --==-=-= Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2 (GNU/Linux) iD8DBQFEe3Z5ZYNf4qobZ7kRAhCZAKClorvlz/6mP0Uhl6S+fZgy1xHTYgCgyZx5 fP1JJYt08NjivfS1qpsxcW0= =Ov7I -----END PGP SIGNATURE----- --==-=-=-- --===============1170626799== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel --===============1170626799==--