From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9364 invoked by alias); 8 Oct 2004 12:53:44 -0000 Mailing-List: contact pthreads-win32-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: pthreads-win32-owner@sources.redhat.com Received: (qmail 9349 invoked from network); 8 Oct 2004 12:53:42 -0000 Received: from unknown (HELO mtagate2.de.ibm.com) (195.212.29.151) by sourceware.org with SMTP; 8 Oct 2004 12:53:42 -0000 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate2.de.ibm.com (8.12.10/8.12.10) with ESMTP id i98CrZFW127960; Fri, 8 Oct 2004 12:53:35 GMT Received: from d12ml062.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1607.megacenter.de.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i98CrY8E087928; Fri, 8 Oct 2004 14:53:34 +0200 In-Reply-To: <4166852F.8090300@callisto.canberra.edu.au> MIME-Version: 1.0 Sensitivity: To: rpj@callisto.canberra.edu.au Cc: pthreads-win32@sources.redhat.com Subject: Re: mutexes: "food for thought" Message-ID: From: Alexander Terekhov Date: Fri, 08 Oct 2004 12:53:00 -0000 Content-Type: text/plain; charset="US-ASCII" X-SW-Source: 2004/txt/msg00119.txt.bz2 Hi Ross, I'm sorta busy at the moment. Here's a version without DCSI. More next week. // doesn't provide "POSIX-safety" with respect to destruction class swap_based_mutex { // noncopyable atomic m_lock_status; // 0: free, 1/-1: locked/contention auto_reset_event m_retry_event; // bin.sema/gate public: // ctor/dtor [w/o lazy event init] void lock() throw() { if (m_lock_status.swap(1, msync::acq)) while (m_lock_status.swap(-1, msync::acq)) m_retry_event.wait(); } bool trylock() throw() { return !m_lock_status.swap(1, msync::acq) ? true : !m_lock_status.swap(-1, msync::acq); } bool timedlock(absolute_timeout const & timeout) throw() { if (m_lock_status.swap(1, msync::acq)) { while (m_lock_status.swap(-1, msync::acq)) if (!m_retry_event.timedwait(timeout)) return false; } return true; } void unlock() throw() { if (m_lock_status.swap(0, msync::rel) < 0) m_retry_event.set(); } }; As for Ulrich's "take 2", my "take 3" can be found here: http://listman.redhat.com/archives/phil-list/2003-October/msg00030.html (Subject: Mutex, Take 3 (for "dumb" futex)) regards, alexander. P.S. "POSIX-safety" with respect to destruction: http://lists.boost.org/MailArchives/boost/msg67616.php http://lists.boost.org/MailArchives/boost/msg67651.php http://lists.boost.org/MailArchives/boost/msg67667.php regards, alexander.