From owner-freebsd-threads@FreeBSD.ORG Wed May 15 21:19:08 2013 Return-Path: Delivered-To: freebsd-threads@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 0F9BB37B for ; Wed, 15 May 2013 21:19:08 +0000 (UTC) (envelope-from jilles@stack.nl) Received: from mx1.stack.nl (unknown [IPv6:2001:610:1108:5012::107]) by mx1.freebsd.org (Postfix) with ESMTP id CDCD4BF1 for ; Wed, 15 May 2013 21:19:07 +0000 (UTC) Received: from snail.stack.nl (snail.stack.nl [IPv6:2001:610:1108:5010::131]) by mx1.stack.nl (Postfix) with ESMTP id 9774F12013B; Wed, 15 May 2013 23:18:51 +0200 (CEST) Received: by snail.stack.nl (Postfix, from userid 1677) id 7F24528493; Wed, 15 May 2013 23:18:51 +0200 (CEST) Date: Wed, 15 May 2013 23:18:51 +0200 From: Jilles Tjoelker To: Radio =?utf-8?B?bcWCb2R5Y2ggYmFuZHl0w7N3?= Subject: Re: Getting ENOMEM with pthread_mutex_init Message-ID: <20130515211851.GA29110@stack.nl> References: <5184F113.805@o2.pl> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <5184F113.805@o2.pl> User-Agent: Mutt/1.5.21 (2010-09-15) Cc: freebsd-threads@freebsd.org X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 15 May 2013 21:19:08 -0000 On Sat, May 04, 2013 at 01:29:23PM +0200, Radio młodych bandytów wrote: > I'm having troubles that I seem unable to resolve. > My programs creates and destroys mutexes repeatably (and, obviously, > uses them in between). Around the 60th lock created, I always get ENOMEM. > I have free memory, lots of it. All locks get released properly. > The relevant pieces of code: > #define MUTEX pthread_mutex_t > inline MUTEX create_mutex() > { > MUTEX mutex; > int ret = pthread_mutex_init(&mutex, NULL); > if(ret != 0) > throw std::runtime_error("Failed to create a mutex"); > return mutex; > } > inline void destroy_mutex(MUTEX *mutex) > { > int ret = pthread_mutex_destroy(mutex); > if(ret != 0) > throw std::runtime_error("Failed to destroy a mutex"); > } > Scheduler::Scheduler(char* in, > char* out, > BlockInfo* metadata, > size_t isize, > size_t block_size, > size_t iters, > size_t min_work_size) : > in(in), > current_in(in), > out(out), > current_out(out), > metadata(metadata), > current_metadata(metadata), > size(isize), > size_left(isize), > block_size(block_size), > iters_left(iters) > { > lock = create_mutex(); > work_size = (min_work_size / block_size) * block_size; > if (work_size < min_work_size) > work_size += block_size; > } > Scheduler::~Scheduler() > { > destroy_mutex(&lock); > } > Any suggestions? It is probably not the cause of your problem but using a copy of a pthread_mutex_t for synchronization is not allowed. pthread_mutex_init() should be called on the pthread_mutex_t that is part of the Scheduler. -- Jilles Tjoelker