Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id E9723431FD0 for ; Wed, 11 Jan 2012 05:04:58 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: 0 X-Spam-Level: X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id wIU0p77f67uZ for ; Wed, 11 Jan 2012 05:04:58 -0800 (PST) Received: from mail-gw3.nixu.fi (mail-gw3.nixu.fi [193.209.237.7]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by olra.theworths.org (Postfix) with ESMTPS id C8B43431FB6 for ; Wed, 11 Jan 2012 05:04:57 -0800 (PST) Received: from pps.filterd (mail-gw3 [127.0.0.1]) by mail-gw3.nixu.fi (8.14.4/8.14.4) with SMTP id q0BD0AAp025938; Wed, 11 Jan 2012 15:04:53 +0200 Received: from taco2.nixu.fi (taco2.nixu.fi [194.197.118.31]) by mail-gw3.nixu.fi with ESMTP id 114cs0yuq6-1 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); Wed, 11 Jan 2012 15:04:52 +0200 Received: from taco2.nixu.fi (taco2.nixu.fi [194.197.118.31]) by taco2.nixu.fi (8.14.3/8.14.3/Debian-5+lenny1) with ESMTP id q0BD4pCw010747; Wed, 11 Jan 2012 15:04:51 +0200 From: Tomi Ollila To: David Bremner , Dmitry Kurochkin , Austin Clements , notmuch@notmuchmail.org Subject: Re: [PATCH] Properly handle short writes in sigint handlers In-Reply-To: <87sjjnkdxt.fsf@zancas.localnet> References: <20111222201553.GK10376@mit.edu> <1324584948-8009-1-git-send-email-amdragon@mit.edu> <87fwgbkst0.fsf@gmail.com> <87sjjnkdxt.fsf@zancas.localnet> User-Agent: Notmuch/0.10.2+176~g3f9d738 (http://notmuchmail.org) Emacs/23.3.1 (i686-pc-linux-gnu) X-Face: HhBM'cA~ MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.5.7110, 1.0.211, 0.0.0000 definitions=2012-01-11_03:2012-01-11, 2012-01-11, 1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 ipscore=0 suspectscore=0 phishscore=0 bulkscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=6.0.2-1012030000 definitions=main-1201110075 X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Jan 2012 13:04:59 -0000 On Tue, 10 Jan 2012 07:13:50 -0400, David Bremner wrote: > On Fri, 23 Dec 2011 23:10:35 +0400, Dmitry Kurochkin wrote: > > Hi Austin. > > > > I think we should put the write loop into a separate function and reuse > > it. > > I could go either way on this, unless there is somewhere else the code > is actually needed at the moment. > > > > > Also, does it make sense to add a retry counter to prevent infinite loop > > if write keeps returning 0? > > I wonder about this too. Is this possibility ignorable Austin? In this particular case the consensus was to just ignore the short write (in rare cases that may happen)... And we could use the first patch: id:"1324503532-5799-1-git-send-email-dme@dme.org" For other cases we might try to find a good implementation of "writefully()". OpenSSH atomicio.[ch] looks like a good place to start... ... writefully () from that code could look something like: /* 2-clause license ("Simplified BSD License" or "FreeBSD License") */ size_t writefully(int fd, const void * data, size_t n) { const char *s = (const char *)data; size_t pos = 0; ssize_t res; while (n > pos) { res = write(fd, s + pos, n - pos); switch (res) { case -1: if (errno == EINTR) continue; if (errno == EAGAIN || errno == EWOULDBLOCK) { struct pollfd pfd; pfd.fd = fd; pfd.events = POLLOUT; (void)poll(&pfd, 1, -1); continue; } return 0; case 0: errno = EPIPE; return pos; default: pos += (size_t)res; } } return pos; } > > d Tomi