Date: Thu, 10 Aug 2006 10:43:05 -0500 From: Brooks Davis <brooks@one-eyed-alien.net> To: Divacky Roman <xdivac02@stud.fit.vutbr.cz> Cc: hackers@freebsd.org Subject: Re: SoC: help with LISTs and killing procs Message-ID: <20060810154305.GA21483@lor.one-eyed-alien.net> In-Reply-To: <20060810153543.GA19047@stud.fit.vutbr.cz> References: <20060810151616.GA17109@stud.fit.vutbr.cz> <20060810152359.GA21318@lor.one-eyed-alien.net> <20060810153543.GA19047@stud.fit.vutbr.cz>
next in thread | previous in thread | raw e-mail | index | archive | help
--WIyZ46R2i8wDzkSu Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Aug 10, 2006 at 05:35:43PM +0200, Divacky Roman wrote: > On Thu, Aug 10, 2006 at 10:23:59AM -0500, Brooks Davis wrote: > > On Thu, Aug 10, 2006 at 05:16:17PM +0200, Divacky Roman wrote: > > > hi > > >=20 > > > I am doing this: > > >=20 > > > (pseudocode) > > > LIST_FOREACH_SAFE(em, &td_em->shared->threads, threads, tmp_em) { > > >=20 > > > kill(em, SIGKILL); > > > } > > >=20 > > > kill(SIGKILL) calls exit() which calls my exit_hook() > > >=20 > > > my exit_hook() does LIST_REMOVE(em, threads). > > >=20 > > > the problem is that this is not synchronous so I am getting a panic b= y INVARIANTS > > > that "Bad link elm prev->next !=3D elm". This is because I list 1st i= tem in the list > > > I call kill on it, then process 2nd list, then scheduler preempts my = code and calls > > > exit() on the first proc which removes the first entry and bad things= happen.=20 > > >=20 > > > I see this possible solutions: > > >=20 > > > make this synchronous, it can be done by something like: > > >=20 > > > .... > > > kill(em, SIGKILL); > > > wait_for_proc_to_vanish(); > > >=20 > > > pls. tell me what do you think about this solution and if its correct= what is the wait_for_proc_to_vanish() > > >=20 > > > maybe there's some better solution, pls tell me. > >=20 > > It sounds like you need a lock protecting the list. If you held it over > > the whole loop you could signal all processes before the exit_hook could > > remove any. >=20 > I dont understand. I am protecting the lock by a rw_rlock(); >=20 > the exit_hook() then acquires rw_wlock(); when removing the entry. > what exactly do you suggest me to do? I dont get it. This can't be the case. If you're holding a read lock around the loop (it must cover the entire loop), it should not be possible for the exit_hook() to obtain a write lock while you are in the loop. Just to verify, is the lock for the list and not per element? -- Brooks --WIyZ46R2i8wDzkSu Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2 (FreeBSD) iD8DBQFE21QIXY6L6fI4GtQRAqPuAJ9ZQU8u+K/aonW/PPa77NRYWJ4kNgCfUygQ iX3d+4i+EdsfDsgunqHIpPY= =K7US -----END PGP SIGNATURE----- --WIyZ46R2i8wDzkSu--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060810154305.GA21483>