#include "thread.h"#include "http.h"#include "module.h"#include "mutex.h"#include "options.h"#include "settings.h"#include <biosphere.h>#include <copy.h>#include <list.h>#include <apr_file_io.h>#include <apr_strings.h>#include <apr_network_io.h>#include <apr_thread_proc.h>#include <apr_time.h>#include <assert.h>#include <string.h>#include <stdlib.h>#include <stdio.h>#include <sys/time.h>Include dependency graph for thread.c:

Go to the source code of this file.
Data Structures | |
| struct | worker_info |
| struct | worker_thread_args |
| struct | shutdown_info |
Defines | |
| #define | MAX_HEADER_CHECK_ATTEMPTS 4 |
Functions | |
| static bs_status | init_listen_socket (apr_socket_t **sock, apr_pool_t *mp) |
| static void | remove_from_socket_list (apr_socket_t *sock) |
| static void | add_to_socket_list (apr_socket_t *sock, apr_pool_t *mp) |
| static void *APR_THREAD_FUNC | worker_thread_main (apr_thread_t *thd, void *data) |
| static bs_status | setup_thread (apr_socket_t *sock) |
| bs_status | init_threadsystem (apr_pool_t *mp) |
| static void | remove_oldest_thread (void) |
| void | lets_go_threaded (void) |
| static void *APR_THREAD_FUNC | shutdown_thread_main (apr_thread_t *thd, void *sinfo) |
| bs_status | stop_daemon (bs_uint32 num_usecs) |
Variables | |
| apr_pool_t * | global_mp |
| static apr_socket_t * | listener_socket |
| static bs_list * | sockets |
| #define MAX_HEADER_CHECK_ATTEMPTS 4 |
The maximum number of socket_recv()s that will be performed before concluding that the HTTP headers are incomplete.
Definition at line 78 of file thread.c.
Referenced by worker_thread_main().
| static void add_to_socket_list | ( | apr_socket_t * | sock, | |
| apr_pool_t * | mp | |||
| ) | [static] |
Add a given socket to the socket list and also create the timestamp
Definition at line 185 of file thread.c.
References list_append(), lock_thread_mux(), worker_info::pool, worker_info::sock, sockets, worker_info::ts, and unlock_thread_mux().
Referenced by worker_thread_main().
Here is the call graph for this function:

| static bs_status init_listen_socket | ( | apr_socket_t ** | sock, | |
| apr_pool_t * | mp | |||
| ) | [static] |
Create a listening socket, and start listening on it.
| sock | Result pointer to the listening socket | |
| mp | Memory pool to use |
Definition at line 97 of file thread.c.
References BS_ERROR, BS_OK, global_listen_port, and runtestsuite::rv.
Referenced by init_threadsystem().
| static void remove_from_socket_list | ( | apr_socket_t * | sock | ) | [static] |
Remove the given socket from the socket list. Comparing pointers might seem a bit dangerous but this sockets will only be added (and removed) to the sockets list by the worker_thread_main() function.
| sock | The socket to remove from the list |
Definition at line 167 of file thread.c.
References list_index(), list_remove(), list_size(), lock_thread_mux(), sockets, and unlock_thread_mux().
Referenced by remove_oldest_thread(), and worker_thread_main().
Here is the call graph for this function:

| static void remove_oldest_thread | ( | void | ) | [static] |
Remove the oldest thread in the thread list.
Definition at line 323 of file thread.c.
References list_index(), list_size(), remove_from_socket_list(), and sockets.
Referenced by lets_go_threaded().
Here is the call graph for this function:

| static bs_status setup_thread | ( | apr_socket_t * | sock | ) | [static] |
Setup a new worker thread.
| sock | The socket to use for the worker thread | |
| mp | Memory pool to use |
Definition at line 282 of file thread.c.
References BS_ERROR, BS_OK, worker_thread_args::pool, runtestsuite::rv, worker_thread_args::sock, and worker_thread_main().
Referenced by lets_go_threaded().
Here is the call graph for this function:

| static void* APR_THREAD_FUNC shutdown_thread_main | ( | apr_thread_t * | thd, | |
| void * | sinfo | |||
| ) | [static] |
This thread performs the shutdown process by first closing the listening socket to prevent any more connections. It then waits a number of seconds to allow remaining worker threads to finish their work and then proceeds to kill of any remaining threads, unloading all modules and exiting the daemon.
| thd | Pointer to the APR thread structure | |
| pool | The memory pool used by the thread |
Definition at line 414 of file thread.c.
References BS_ERROR, BS_OK, list_index(), list_size(), listener_socket, lock_thread_mux(), shutdown_info::pool, sockets, unload_all_modules(), unlock_thread_mux(), and shutdown_info::wait_time.
Referenced by stop_daemon().
Here is the call graph for this function:

| static void* APR_THREAD_FUNC worker_thread_main | ( | apr_thread_t * | thd, | |
| void * | data | |||
| ) | [static] |
The main routine for the worker threads to follow. They are passed a socket to use for communicate with the client and try to receive, parse, handle and respond to his/her request. After this handling, the worker thread exits by returning (apr_thread_exit is not called).
| thd | Pointer to the thread structure | |
| data | Pointer to data passed to the thread. This will be the socket. |
Definition at line 207 of file thread.c.
References add_to_socket_list(), handle_http_get(), handle_http_post(), HTTP_BUFFER_SIZE, MAX_HEADER_CHECK_ATTEMPTS, worker_thread_args::pool, received_full_headers(), remove_from_socket_list(), runtestsuite::rv, send_http_error(), and worker_thread_args::sock.
Referenced by setup_thread().
Here is the call graph for this function:

apr_socket_t* listener_socket [static] |
Listener socket used by the daemon:
Definition at line 83 of file thread.c.
Referenced by init_threadsystem(), lets_go_threaded(), and shutdown_thread_main().
A mutex protected list of all active sockets.
Definition at line 88 of file thread.c.
Referenced by add_to_socket_list(), init_threadsystem(), lets_go_threaded(), remove_from_socket_list(), remove_oldest_thread(), and shutdown_thread_main().
1.5.1