.\" Copyright (c) 2007 The DragonFly Project.  All rights reserved.
.\"
.\" This code is derived from software contributed to The DragonFly Project
.\" by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\"
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in
.\"    the documentation and/or other materials provided with the
.\"    distribution.
.\" 3. Neither the name of The DragonFly Project nor the names of its
.\"    contributors may be used to endorse or promote products derived
.\"    from this software without specific, prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
.\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
.\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
.\" COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
.\" INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.Dd January 14, 2017
.Dt LWP_CREATE 2
.Os
.Sh NAME
.Nm lwp_create ,
.Nm lwp_create2
.Nd spawn a new lwp
.Sh LIBRARY
.Lb libc
.Sh SYNOPSIS
.In sys/lwp.h
.Ft int
.Fn lwp_create "struct lwp_params *params"
.Ft int
.Fn lwp_create2 "struct lwp_params *params" "const cpumask_t *mask"
.Sh DESCRIPTION
The
.Fn lwp_create
and the
.Fn lwp_create2
function spawn a new lwp in the current process.
In a way,
.Fn lwp_create
and
.Fn lwp_create2
are similar to
.Xr fork 2 .
However,
.Fn lwp_create
and
.Fn lwp_create2
do not return twice as parent and child.
Instead, the new lwp will execute a function provided by the
.Fa params
argument which is a pointer to a
.Vt struct lwp_params .
.Bd -literal
struct lwp_params {
	void (*func)(void *);	/* Function to start execution */
	void *arg;		/* Parameter to this function */
	void *stack;		/* Stack address to use */
	lwpid_t *tid1;		/* Address to copy out new tid */
	lwpid_t *tid2;		/* Same */
};
.Ed
.Pp
A function pointer
.Fa func
specifies the function to be executed in the new lwp.
It is the duty of
.Fn func
to correctly terminate execution of the lwp, either by calling
.Xr extexit 2
or
.Xr exit 3 .
If
.Fn func
returns, behavior is unspecified.
The only argument passed to
.Fn func
is
.Fa arg .
.Pp
The new lwp starts with its stack frame set to
.Fa stack .
Note that both
.Fa func
and
.Fa stack
are mandatory.
If either is invalid, behavior is
unspecified.
.Pp
The fields
.Fa tid1
and
.Fa tid2
point to variables where the tid of the new lwp shall be stored.
Two parameters are provided so that storage for both parent
and child can be specified separately.
Setting any of these to NULL causes the respective tid not to be copied out.
.Pp
The
.Fa mask
argument to
.Fn lwp_create2
specifies the new lwp's CPU affinity mask.
.Va NULL
means no special CPU affinity settings.
.Sh RETURN VALUES
.Rv -std
.Sh SEE ALSO
.Xr extexit 2 ,
.Xr rfork 2 ,
.Xr exit 3
.Sh HISTORY
The
.Fn lwp_create
function first appeared in
.Dx 1.9 .
The
.Fn lwp_create2
function first appeared in
.Dx 4.7 .
