From owner-freebsd-hackers@FreeBSD.ORG Sun Jul 13 15:13:16 2008 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 78F31106566B for ; Sun, 13 Jul 2008 15:13:16 +0000 (UTC) (envelope-from ioplex@gmail.com) Received: from ik-out-1112.google.com (ik-out-1112.google.com [66.249.90.183]) by mx1.freebsd.org (Postfix) with ESMTP id 041B58FC18 for ; Sun, 13 Jul 2008 15:13:15 +0000 (UTC) (envelope-from ioplex@gmail.com) Received: by ik-out-1112.google.com with SMTP id c30so2369789ika.3 for ; Sun, 13 Jul 2008 08:13:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to :subject:mime-version:content-type:content-transfer-encoding :content-disposition; bh=L9kmzO0r2N+V98MGAsJDaZBX9Em4uyvaiQk3Wti2Lds=; b=YamAXr9D9caGiG9FEo6MkoTABVIE5vALf7EJRZobVgbEjxbiq0cav9LJVcQw3hxwwt 2/jE1dcNKSBXwFq+k6XjVZutY6AZiEczry8gueBfLqzoR6ik4ogIIhSz5eA4nGs8k0ay zCCgzN6OJzcklwzB79yR7pIzVPv4ybDMV1dbU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:mime-version:content-type :content-transfer-encoding:content-disposition; b=DIeQdbnnEsz/8iqdFaZL2q5rcWFTNS3S7EGCcxTk1sHnjGIIy4ZIHKgt4HWluCHBlF P2ty+eN97yEAaWO/T8UtUtrhJywlCC5zspQ2y+Iyp0YPDC0mBYEfz0KNFBMGo4ck+yTO wcvJVaTWfS+xwYZv0N4lclXl2hXx3Lgp457UA= Received: by 10.210.37.16 with SMTP id k16mr8199827ebk.194.1215961994482; Sun, 13 Jul 2008 08:13:14 -0700 (PDT) Received: by 10.210.139.1 with HTTP; Sun, 13 Jul 2008 08:13:14 -0700 (PDT) Message-ID: <78c6bd860807130813p4c28f930g1f3094241aa1f1b1@mail.gmail.com> Date: Sun, 13 Jul 2008 11:13:14 -0400 From: "Michael B Allen" To: freebsd-hackers MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Subject: Pls sanity check my semtimedop(2) implementation X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Jul 2008 15:13:16 -0000 Hi, Below is a semtimedop(2) implementation that I'm using for FreeBSD. I was hoping someone could look it over and tell me if they think the implementation is sound. The code seems to work ok but when stressing the FreeBSD build of my app I have managed to provoke errors related to concurrency (usually when a SIGALRM goes off). The Linux build works flawlessesly so I'm wondering about this one critical function that is different. Is there any reason why I would want to use ITIMER_VIRTUAL / SIGVTALRM instead of ITIMER_REAL / SIGALRM? Or perhaps I should be using a different implementation entirely? Mike int _semtimedop(int semid, struct sembuf *array, size_t nops, struct timespec *_timeout) { struct timeval timeout, before, after; struct itimerval value, ovalue; struct sigaction sa, osa; int ret; if (_timeout) { timeout.tv_sec = _timeout->tv_sec; timeout.tv_usec = _timeout->tv_nsec / 1000; if (gettimeofday(&before, NULL) == -1) { return -1; } memset(&value, 0, sizeof value); value.it_value = timeout; memset(&sa, 0, sizeof sa); /* signal_print writes the signal info to a log file */ sa.sa_sigaction = signal_print; sa.sa_flags = SA_SIGINFO; sigemptyset(&sa.sa_mask); sigaction(SIGALRM, &sa, &osa); if (setitimer(ITIMER_REAL, &value, &ovalue) == -1) { sigaction(SIGALRM, &osa, NULL); return -1; } } ret = semop(semid, array, nops); if (_timeout) { sigaction(SIGALRM, &osa, NULL); if (setitimer(ITIMER_REAL, &ovalue, NULL) == -1) { return -1; } } if (ret == -1) { if (_timeout) { struct timeval elapsed; if (gettimeofday(&after, NULL) == -1) { return -1; } _timeval_diff(&after, &before, &elapsed); if (timercmp(&elapsed, &timeout, >=)) errno = EAGAIN; } return -1; } return 0; }