From owner-freebsd-bugs@FreeBSD.ORG Tue Nov 25 12:30:10 2008 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2BC3E1065707 for ; Tue, 25 Nov 2008 12:30:10 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 0B5BB8FC14 for ; Tue, 25 Nov 2008 12:30:10 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.3/8.14.3) with ESMTP id mAPCU9t8013003 for ; Tue, 25 Nov 2008 12:30:09 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.3/8.14.3/Submit) id mAPCU9gb013002; Tue, 25 Nov 2008 12:30:09 GMT (envelope-from gnats) Resent-Date: Tue, 25 Nov 2008 12:30:09 GMT Resent-Message-Id: <200811251230.mAPCU9gb013002@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Roman Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0DA04106564A for ; Tue, 25 Nov 2008 12:24:05 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21]) by mx1.freebsd.org (Postfix) with ESMTP id F37628FC24 for ; Tue, 25 Nov 2008 12:24:04 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (localhost [127.0.0.1]) by www.freebsd.org (8.14.3/8.14.3) with ESMTP id mAPCO4I9082748 for ; Tue, 25 Nov 2008 12:24:04 GMT (envelope-from nobody@www.freebsd.org) Received: (from nobody@localhost) by www.freebsd.org (8.14.3/8.14.3/Submit) id mAPCO4ta082741; Tue, 25 Nov 2008 12:24:04 GMT (envelope-from nobody) Message-Id: <200811251224.mAPCO4ta082741@www.freebsd.org> Date: Tue, 25 Nov 2008 12:24:04 GMT From: Roman To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Cc: Subject: misc/129172: signals are not delivered always X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 25 Nov 2008 12:30:10 -0000 >Number: 129172 >Category: misc >Synopsis: signals are not delivered always >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Tue Nov 25 12:30:09 UTC 2008 >Closed-Date: >Last-Modified: >Originator: Roman >Release: 6.3-RELEASE FreeBSD 6.3-RELEASE >Organization: >Environment: FreeBSD host.myrtghost.ru 6.3-RELEASE FreeBSD 6.3-RELEASE #0: Wed Jan 16 01:43:02 UTC 2008 root@palmer.cse.buffalo.edu:/usr/obj/usr/src/sys/SMP amd64 >Description: Seems, that signals that had been set by sigaction, or just by signal are not robust. Child counts is 100 in following example. Just 39 childs in following test appeared. If we remove protection by semaphore, it was just about 17 signals catched. Under linux all 100 childs signals passed in signal handler, and worked fine for both tests. >How-To-Repeat: Compile sem kernel module and load it into the kernel. gcc3.4 used gcc sigsem3.c -o sigsem3 ./signal3 - not all signals processed. gcc sigsem2.c -o sigsem2 ./signal2 coredump obtained. gcc sigsem1.c -o sigsem1 ./signal1 sigsem3.c: ==cut==%<========== #include #include #include #include #include #include #include volatile int chld_count; sem_t asem; void handler(int sig) { pid_t pid; sem_wait(&asem); chld_count ++; pid = wait(NULL); printf("Pid %d exited. count: %d\n", pid, chld_count); sem_post(&asem); } int main(void) { int i; chld_count=0; struct sigaction sa; sem_init(&asem,0,1); signal(SIGCHLD, handler); sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sa.sa_handler = handler; sigaction(SIGCHLD, &sa, NULL); for(i=0;i<100;i++) { int ret_val; ret_val=fork(); if(ret_val==-1) { perror("fork()"); } else if(!ret_val) { printf("in child;Child pid is %d\n", getpid()); exit(0); } else { printf("Parent pid is %d; child is %d;\n", getpid(),ret_val); } } return 0; } ==cut==>%========== sigsem2.c: ========== #include #include #include #include #include #include #include // linux: -lpthread volatile int chld_count; sem_t asem; void handler(int sig) { pid_t pid; sem_wait(&asem); chld_count ++; pid = wait(NULL); printf("Pid %d exited. count: %d\n", pid, chld_count); sem_post(&asem); } int main(void) { int i; chld_count=0; sem_init(&asem,0,1); signal(SIGCHLD, handler); for(i=0;i<100;i++) { int ret_val; ret_val=fork(); if(ret_val==-1) { perror("fork()"); } else if(!ret_val) { printf("in child;Child pid is %d\n", getpid()); exit(0); } else { printf("Parent pid is %d; child is %d;\n", getpid(),ret_val); } } return 0; } ==cut==>%========== >Fix: >Release-Note: >Audit-Trail: >Unformatted: