From owner-freebsd-threads@FreeBSD.ORG Wed Aug 30 14:23:06 2006 Return-Path: X-Original-To: freebsd-threads@freebsd.org Delivered-To: freebsd-threads@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 81BB016A4E7; Wed, 30 Aug 2006 14:23:06 +0000 (UTC) (envelope-from avg@icyb.net.ua) Received: from citadel.icyb.net.ua (citadel.icyb.net.ua [212.40.38.140]) by mx1.FreeBSD.org (Postfix) with ESMTP id 16BB243DA2; Wed, 30 Aug 2006 14:22:56 +0000 (GMT) (envelope-from avg@icyb.net.ua) Received: from [212.40.38.87] (oddity-e.topspin.kiev.ua [212.40.38.87]) by citadel.icyb.net.ua (8.8.8p3/ICyb-2.3exp) with ESMTP id RAA23160; Wed, 30 Aug 2006 17:22:52 +0300 (EEST) (envelope-from avg@icyb.net.ua) Message-ID: <44F59F3C.3040303@icyb.net.ua> Date: Wed, 30 Aug 2006 17:22:52 +0300 From: Andriy Gapon User-Agent: Thunderbird 1.5.0.5 (X11/20060801) MIME-Version: 1.0 To: freebsd-threads@freebsd.org, ace-users@cse.wustl.edu Content-Type: text/plain; charset=KOI8-U Content-Transfer-Encoding: 7bit Cc: Sergey Matveychuk Subject: ace/freebsd: THR_NEW_LWP problem with libpthread/pthread_setconcurrency X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 30 Aug 2006 14:23:06 -0000 ACE VERSION: 5.5.1 (from FreeBSD port: ace-5.5.1) HOST MACHINE and OPERATING SYSTEM: FreeBSD 6.1-RELEASE-p2 i386 (uniprocessor) COMPILER NAME AND VERSION (AND PATCHLEVEL): gcc version 3.4.4 [FreeBSD] 20050518 (system compiler) libpthread is used as threading library AREA/CLASS/EXAMPLE AFFECTED: ACE threads DOES THE PROBLEM AFFECT: EXECUTION - this is a run-time problem SYNOPSIS: Can not create threads with THR_NEW_LWP flag. DESCRIPTION: ACE_Thread_Manager::spawn(..., THR_NEW_LWP) fails with EAGAIN. It seems that this happens because when creating such threads ACE calls pthread_setconcurrency with incrementally increasing concurrency levels. pthread_setconcurrency of libpthread in turn seems to call kse_create() which fails with EPROCLIM. As I understand this happens because kernel does not allow to have more KSE-s per process as there are processors. This problem is quite noticeable with ACE because THR_NEW_LWP is present in default flags in many places. REPEAT BY: Running any ACE-based program that spawns threads with THR_NEW_LWP and linked to libpthead. SAMPLE FIX/WORKAROUND: Straightforward workaround is to explicitly pass thread flags everywhere and not use THR_NEW_LWP. Maybe this could be patched in ACE sources as a part of FreeBSD port patch step. IMHO, better fixes would be: 1. make ACE_Thread_Manager::spawn() more robust with respect to pthread_setconcurrency() failing with EAGAIN. 2. make FreeBSD libpthread dumb-happy in pthread_setconcurrency(), i.e pretend to always succeed. AFAIK, POSIX leaves it up to implementations to interpret concurrency levels, so making any level be equivalent to default level should be OK. -- Andriy Gapon