view src/os/unix/rfork_thread.S @ 648:f200748c0ac8 NGINX_1_1_8

nginx 1.1.8 *) Change: the ngx_http_limit_zone_module was renamed to the ngx_http_limit_conn_module. *) Change: the "limit_zone" directive was superseded by the "limit_conn_zone" directive with a new syntax. *) Feature: support for multiple "limit_conn" limits on the same level. *) Feature: the "image_filter_sharpen" directive. *) Bugfix: a segmentation fault might occur in a worker process if resolver got a big DNS response. Thanks to Ben Hawkes. *) Bugfix: in cache key calculation if internal MD5 implementation was used; the bug had appeared in 1.0.4. *) Bugfix: the "If-Modified-Since", "If-Range", etc. client request header lines might be passed to backend while caching; or not passed without caching if caching was enabled in another part of the configuration. *) Bugfix: the module ngx_http_mp4_module sent incorrect "Content-Length" response header line if the "start" argument was used. Thanks to Piotr Sikora.
author Igor Sysoev <http://sysoev.ru>
date Mon, 14 Nov 2011 00:00:00 +0400
parents da8c190bdaba
children d0f7a625f27c
line wrap: on
line source


/*
 * Copyright (C) Igor Sysoev
 */


#include <sys/syscall.h>
#include <machine/asm.h>

/*
 * rfork_thread(3) - rfork_thread(flags, stack, func, arg);
 */

#define	KERNCALL	int $0x80

ENTRY(rfork_thread)
	push	%ebp
	mov	%esp, %ebp
	push	%esi

	mov	12(%ebp), %esi	# the thread stack address

	sub	$4, %esi
	mov	20(%ebp), %eax	# the thread argument
	mov	%eax, (%esi)

	sub	$4, %esi
	mov	16(%ebp), %eax	# the thread start address
	mov	%eax, (%esi)

	push	8(%ebp)		# rfork(2) flags
	push	$0
	mov	$SYS_rfork, %eax
	KERNCALL
	jc	error

	cmp	$0, %edx
	jne	child

parent:
	add	$8, %esp
	pop	%esi
	leave
	ret

child:
	mov	%esi, %esp
	pop	%eax
	call	*%eax		# call a thread start address ...
	add	$4, %esp

	push	%eax
	push	$0
	mov	$SYS_exit, %eax	# ... and exit(2) after a thread would return
	KERNCALL

error:
	add	$8, %esp
	pop	%esi
	leave
	PIC_PROLOGUE

	/* libc's cerror: jmp  PIC_PLT(HIDENAME(cerror)) */

	push	%eax
	call	PIC_PLT(CNAME(__error))
	pop	%ecx
	PIC_EPILOGUE
	mov	%ecx, (%eax)
	mov	$-1, %eax
	mov	$-1, %edx
	ret