Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 21 Nov 1997 16:01:06 -0500 (EST)
From:      "John S. Dyson" <toor@dyson.iquest.net>
To:        cbray@best.com
Cc:        freebsd-hackers@FreeBSD.ORG
Subject:   Re: malloc() problems in children after using rfork()
Message-ID:  <199711212101.QAA01392@dyson.iquest.net>
In-Reply-To: <3475E143.EE7AF250@best.com> from Curtis Bray at "Nov 21, 97 11:30:12 am"

next in thread | previous in thread | raw e-mail | index | archive | help
Curtis Bray said:
> Hi,
> 
>   I'm trying to use rfork(RFPROC | RFMEM) so that all the children can
> share the same address space with their parent.  
> 
>   If I have multiple children issuing mallocs the children seem to core
> dump.  Once I turn the RFMEM flag off I have no problem mallocing (but
> of course I loose the shared address space).  Anyone know what I could
> be doing wrong here?  Do I have to put semaphores around every malloc?? 
> I hope that's not the case...  Thanks in advance!
> 
Aieee...  rfork is very tricky to use.  Take a look at the assembly code that
I have included.  Note the management of the stack.

-- 
John
dyson@freebsd.org
jdyson@nc.com


	.file	"rf.S"
#include <sys/syscall.h>
#include "DEFS.h"
#include "SYS.h"
#define KERNEL
#include <sys/errno.h>
#undef KERNEL

#undef DEBUG

/*
 *        8      12     16        20        24       28
 * _rfork(flags, stack, startrtn, startarg, userrtn, arg);
 *
 * flags: RF* flags for rfork in unistd.h.
 * subr:  subroutine to run as a thread.
 * stack: top of stack for thread.
 * arg:   argument to thread.
 */
.stabs "rf.S",100,0,0,Ltext0
	.text
Ltext0:
	.type	_thrfork,@function
	.stabd 68,0,1
ENTRY(thrfork)
	pushl	%ebp
	movl	%esp, %ebp
	pushl	%esi

	/*
	 * Push thread info onto the new thread's stack
	 */
	movl	12(%ebp), %esi	/ get stack addr

	subl	$4, %esi
	movl	28(%ebp), %eax	/ get user argument
	movl	%eax, (%esi)

	subl	$4, %esi
	movl	24(%ebp), %eax	/ get user thread address
	movl	%eax, (%esi)

	subl	$4, %esi
	movl	20(%ebp), %eax	/ get internal argument
	movl	%eax, (%esi)

	subl	$4, %esi
	movl	16(%ebp), %eax	/ get internal subroutine
	movl	%eax, (%esi)

	.stabd 68,0,2
	/*
	 * Prepare and execute rfork
	 */
	pushl	8(%ebp)
	pushl	%esi
	leal	SYS_rfork, %eax
	KERNCALL
	jb 	2f

	.stabd 68,0,3
	/*
	 * Check to see if we are in the parent or child
	 */
	cmpl	$0, %edx
	jnz	1f
	addl	$8, %esp
	popl	%esi
	movl	%ebp, %esp
	popl	%ebp
	ret
	.p2align 2

	/*
	 * If we are in the child (new thread), then
	 * set-up the call to the internal subroutine.  If it
	 * returns, then call __exit.
	 */
	.stabd 68,0,4
1:
	movl	%esi,%esp
#ifdef DEBUG
	movl	%esp, _stackaddr
	movl	(%esp), %eax
	movl	%eax, _stack
	movl	4(%esp), %eax
	movl	%eax,_stack+4
	movl	8(%esp), %eax
	movl	%eax,_stack+8
	movl	12(%esp), %eax
	movl	%eax,_stack+12
#endif
	popl	%eax 
#ifdef DEBUG
	movl	%eax,_fcn
#endif
	call	%eax
	addl	$12, %esp

	/*
	 * Exit system call
	 */
	pushl	%eax
	pushl	$SYS_exit
	call	_syscall

	.stabd 68,0,5
2:	movl	$EAGAIN, _errno
	movl	$-1, %eax
	leave
	ret
.stabs "thrfork:f67",36,0,6,_thrfork
Lfe1:
	.size	 _thrfork,Lfe1-_thrfork

#ifdef DEBUG
	.data
	.globl	_stack
_stack:	.long	0
	.long	0
	.long	0
	.long	0
	.long	0
	.globl	_stackaddr
_stackaddr:	.long	0
	.globl	_fcn
_fcn:	.long	0
#endif




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199711212101.QAA01392>