DOOR_SERVER_CREATE(3C) Standard C Library Functions DOOR_SERVER_CREATE(3C)
NAME
door_server_create - specify an alternative door server thread
creation function
SYNOPSIS
cc -mt [
flag... ]
file... [
library... ]
#include <door.h>
void (*)(door_info_t *) door_server_create(
void (*create_proc)(door_info_t *));
DESCRIPTION
Normally, the doors library creates new door server threads in
response to incoming concurrent door invocations automatically. There
is no pre-defined upper limit on the number of server threads that
the system creates in response to incoming invocations (1 server
thread for each active door invocation). These threads are created
with the default thread stack size and POSIX (see
standards(7))
threads cancellation disabled. The created threads also have the
THR_BOUND |
THR_DETACHED attributes for Solaris threads and the
PTHREAD_SCOPE_SYSTEM |
PTHREAD_CREATE_DETACHED attributes for POSIX
threads. The signal disposition, and scheduling class of the newly
created thread are inherited from the calling thread (initially from
the thread calling
door_create(), and subsequently from the current
active door server thread).
The
door_server_create() function allows control over the creation of
server threads needed for door invocations. The procedure
create_proc is called every time the available server thread pool is depleted. In
the case of private server pools associated with a door (see the
DOOR_PRIVATE attribute in
door_create()), information on which pool
is depleted is passed to the create function in the form of a
door_info_t structure. The
di_proc and
di_data members of the
door_info_t structure can be used as a door identifier associated
with the depleted pool. The
create_proc procedure may limit the
number of server threads created and may also create server threads
with appropriate attributes (stack size, thread-specific data, POSIX
thread cancellation, signal mask, scheduling attributes, and so
forth) for use with door invocations.
The overall amount of data and argument descriptors that can be sent
through a door is limited by both the server thread's stack size and
by the parameters of the door itself. See
door_setparam(3C).
The specified server creation function should create user level
threads using
thr_create() with the
THR_BOUND flag, or in the case of
POSIX threads,
pthread_create() with the
PTHREAD_SCOPE_SYSTEM attribute. The server threads make themselves available for incoming
door invocations on this process by issuing a
door_return(
NULL, 0, NULL, 0). In this case, the
door_return() arguments are ignored. See
door_return(3C) and
thr_create(3C).
The server threads created by default are enabled for POSIX thread
cancellations which may lead to unexpected thread terminations while
holding resources (such as locks) if the client aborts the associated
door_call(). See
door_call(3C). Unless the server code is truly
interested in notifications of client aborts during a door invocation
and is prepared to handle such notifications using cancellation
handlers, POSIX thread cancellation should be disabled for server
threads using
pthread_setcancelstate (
PTHREAD_CANCEL_DISABLE,
NULL).
If all doors are created with the
DOOR_NO_CANCEL flag (see
door_create(3C)), the threads will never be cancelled by an aborted
door_call() call
The
create_proc procedure need not create any additional server
threads if there is at least one server thread currently active in
the process (perhaps handling another door invocation) or it may
create as many as seen fit each time it is called. If there are no
available server threads during an incoming door invocation, the
associated
door_call() blocks until a server thread becomes
available. The
create_proc procedure must be MT-Safe.
RETURN VALUES
Upon successful completion,
door_server_create() returns a pointer to
the previous server creation function. This function has no failure
mode (it cannot fail).
EXAMPLES
Example 1: Creating door server threads.
The following example creates door server threads with cancellation
disabled and an 8k stack instead of the default stack size:
#include <door.h>
#include <pthread.h>
#include <thread.h>
void *
my_thread(void *arg)
{
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
door_return(NULL, 0, NULL, 0);
}
void
my_create(door_info_t *dip)
{
thr_create(NULL, 8192, my_thread, NULL,
THR_BOUND | THR_DETACHED, NULL);
}
main()
{
(void)door_server_create(my_create);
...
}
ATTRIBUTES
See
attributes(7) for descriptions of the following attributes:
+--------------------+-----------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-----------------+
|Architecture | all |
+--------------------+-----------------+
|Interface Stability | Stable |
+--------------------+-----------------+
|MT-Level | Safe |
+--------------------+-----------------+
SEE ALSO
door_bind(3C),
door_call(3C),
door_create(3C),
door_return(3C),
pthread_create(3C),
pthread_setcancelstate(3C),
thr_create(3C),
attributes(7),
cancellation(7),
standards(7) May 12, 2017 DOOR_SERVER_CREATE(3C)