From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 4A0652AD45 for ; Thu, 18 Apr 2019 13:24:57 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id kWqRv4eAZReo for ; Thu, 18 Apr 2019 13:24:57 -0400 (EDT) Received: from smtp51.i.mail.ru (smtp51.i.mail.ru [94.100.177.111]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 087962AD0A for ; Thu, 18 Apr 2019 13:24:56 -0400 (EDT) Received: by smtp51.i.mail.ru with esmtpa (envelope-from ) id 1hHAmN-0006Zm-AU for tarantool-patches@freelists.org; Thu, 18 Apr 2019 20:24:55 +0300 Date: Thu, 18 Apr 2019 20:24:55 +0300 From: Konstantin Osipov Subject: [tarantool-patches] Re: [PATCH] memtx: cancel checkpoint thread at exit Message-ID: <20190418172455.GH13022@chai> References: <8278bbd0a73bbd0e18a4e8633eb0ad71f2ffa3f7.1555601315.git.vdavydov.dev@gmail.com> <20190418171551.5zfqurxnyrdkwxjj@esperanza> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190418171551.5zfqurxnyrdkwxjj@esperanza> Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-Help: List-Unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-Subscribe: List-Owner: List-post: List-Archive: To: tarantool-patches@freelists.org * Vladimir Davydov [19/04/18 20:19]: > On Thu, Apr 18, 2019 at 06:46:54PM +0300, Vladimir Davydov wrote: > > +static void > > +checkpoint_cancel(struct checkpoint *ckpt) > > +{ > > + /* > > + * Cancel the checkpoint thread if it's running and wait > > + * for it to terminate so as to eliminate the possibility > > + * of use-after-free. > > + */ > > + if (ckpt->cord.id != 0 && > > + tt_pthread_cancel(ckpt->cord.id) != ESRCH) > > + tt_pthread_join(ckpt->cord.id, NULL); > > + checkpoint_delete(ckpt); > > +} > > Oops, turned out this check isn't quite correct as we don't reset > cord.id after joining the thread. As a result, we might call > pthread_cancel on an already joined thread, which leads to a crash > (caught by Travis CI): I would reset cord.id instead. -- Konstantin Osipov, Moscow, Russia, +7 903 626 22 32 http://tarantool.io - www.twitter.com/kostja_osipov