Apache2
apr_thread_proc.h
Go to the documentation of this file.
1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2  * contributor license agreements. See the NOTICE file distributed with
3  * this work for additional information regarding copyright ownership.
4  * The ASF licenses this file to You under the Apache License, Version 2.0
5  * (the "License"); you may not use this file except in compliance with
6  * the License. You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef APR_THREAD_PROC_H
18 #define APR_THREAD_PROC_H
19 
25 #include "apr.h"
26 #include "apr_file_io.h"
27 #include "apr_pools.h"
28 #include "apr_errno.h"
29 #include "apr_perms_set.h"
30 
31 #if APR_HAVE_STRUCT_RLIMIT
32 #include <sys/time.h>
33 #include <sys/resource.h>
34 #endif
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif /* __cplusplus */
39 
46 typedef enum {
55 
56 typedef enum {
58  APR_NOWAIT
60 
61 /* I am specifically calling out the values so that the macros below make
62  * more sense. Yes, I know I don't need to, but I am hoping this makes what
63  * I am doing more clear. If you want to add more reasons to exit, continue
64  * to use bitmasks.
65  */
66 typedef enum {
71 
73 #define APR_PROC_CHECK_EXIT(x) (x & APR_PROC_EXIT)
75 #define APR_PROC_CHECK_SIGNALED(x) (x & APR_PROC_SIGNAL)
77 #define APR_PROC_CHECK_CORE_DUMP(x) (x & APR_PROC_SIGNAL_CORE)
78 
80 #define APR_NO_PIPE 0
82 #define APR_FULL_BLOCK 1
84 #define APR_FULL_NONBLOCK 2
86 #define APR_PARENT_BLOCK 3
88 #define APR_CHILD_BLOCK 4
90 #define APR_NO_FILE 8
91 
93 #define APR_READ_BLOCK 3
95 #define APR_WRITE_BLOCK 4
96 
100 #define APR_NO_FILE 8
101 
103 #define APR_LIMIT_CPU 0
105 #define APR_LIMIT_MEM 1
107 #define APR_LIMIT_NPROC 2
109 #define APR_LIMIT_NOFILE 3
110 
115 #define APR_OC_REASON_DEATH 0
117 #define APR_OC_REASON_UNWRITABLE 1
118 #define APR_OC_REASON_RESTART 2
122 #define APR_OC_REASON_UNREGISTER 3
125 #define APR_OC_REASON_LOST 4
127 #define APR_OC_REASON_RUNNING 5
134 typedef struct apr_proc_t {
136  pid_t pid;
143 #if APR_HAS_PROC_INVOKED || defined(DOXYGEN)
151  char *invoked;
152 #endif
153 #if defined(WIN32) || defined(DOXYGEN)
160  HANDLE hproc;
161 #endif
163 
175  const char *description);
176 
178 typedef struct apr_thread_t apr_thread_t;
179 
181 typedef struct apr_threadattr_t apr_threadattr_t;
182 
184 typedef struct apr_procattr_t apr_procattr_t;
185 
187 typedef struct apr_thread_once_t apr_thread_once_t;
188 
190 typedef struct apr_threadkey_t apr_threadkey_t;
191 
194 
199 
200 typedef enum {
209 
210 /* Thread Function definitions */
211 
212 #if APR_HAS_THREADS
213 
217 #if defined(__cplusplus) && __cplusplus >= 201103L
218 #define APR_THREAD_LOCAL thread_local
219 #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112 && \
220  (!defined(__GNUC__) || \
221  __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))
222 #define APR_THREAD_LOCAL _Thread_local
223 #elif defined(__GNUC__) /* works for clang too */
224 #define APR_THREAD_LOCAL __thread
225 #elif defined(WIN32) && defined(_MSC_VER)
226 #define APR_THREAD_LOCAL __declspec(thread)
227 #endif
228 
229 #ifdef APR_THREAD_LOCAL
230 #define APR_HAS_THREAD_LOCAL 1
231 #else
232 #define APR_HAS_THREAD_LOCAL 0
233 #endif
234 
241  apr_pool_t *cont);
242 
249  apr_int32_t on);
250 
258 
265  apr_size_t stacksize);
266 
278  apr_size_t guardsize);
279 
287  apr_size_t size);
288 
298  apr_threadattr_t *attr,
299  apr_thread_start_t func,
300  void *data, apr_pool_t *cont);
301 
311  apr_threadattr_t *attr,
312  apr_pool_t *pool);
313 
318 
325 
332  __attribute__((noreturn));
333 
340  apr_thread_t *thd);
341 
350  apr_thread_t *thread,
351  apr_pool_t *pool);
352 
362  apr_thread_t *thread,
363  apr_pool_t *pool);
364 
369 
377  apr_pool_t *p);
378 
389  void (*func)(void));
390 
396 
404  apr_thread_t *thread);
405 
414  apr_status_t (*cleanup) (void *),
415  apr_thread_t *thread);
416 
424  void (*dest)(void *),
425  apr_pool_t *cont);
426 
433  apr_threadkey_t *key);
434 
441  apr_threadkey_t *key);
442 
448 
456  apr_threadkey_t *threadkey);
457 
466  apr_status_t (*cleanup) (void *),
467  apr_threadkey_t *threadkey);
468 
469 #else /* APR_HAS_THREADS */
470 
471 #define APR_HAS_THREAD_LOCAL 0
472 
473 #endif /* APR_HAS_THREADS */
474 
481  apr_pool_t *cont);
482 
498  apr_int32_t in, apr_int32_t out,
499  apr_int32_t err);
500 
517  apr_file_t *child_in,
518  apr_file_t *parent_in);
519 
534  apr_file_t *child_out,
535  apr_file_t *parent_out);
536 
551  apr_file_t *child_err,
552  apr_file_t *parent_err);
553 
562  const char *dir);
563 
576  apr_cmdtype_e cmd);
577 
584  apr_int32_t detach);
585 
586 #if APR_HAVE_STRUCT_RLIMIT
601  struct rlimit *limit);
602 #endif
603 
616  apr_child_errfn_t *errfn);
617 
631  apr_int32_t chk);
632 
641  apr_int32_t addrspace);
642 
652  const char *username,
653  const char *password);
654 
661  const char *groupname);
662 
663 
672  apr_perms_setfn_t *perms_set_fn,
673  void *data,
674  apr_fileperms_t perms);
675 
676 #if APR_HAS_FORK
686 #endif
687 
705  const char *progname,
706  const char * const *args,
707  const char * const *env,
708  apr_procattr_t *attr,
709  apr_pool_t *pool);
710 
738  int *exitcode, apr_exit_why_e *exitwhy,
739  apr_wait_how_e waithow);
740 
768  int *exitcode,
769  apr_exit_why_e *exitwhy,
770  apr_wait_how_e waithow,
771  apr_pool_t *p);
772 
773 #define APR_PROC_DETACH_FOREGROUND 0
774 #define APR_PROC_DETACH_DAEMONIZE 1
783 
797  void (*maintenance) (int reason,
798  void *,
799  int status),
800  void *data, apr_file_t *write_fd,
801  apr_pool_t *p);
802 
813 
835  int reason,
836  int status);
837 
846  int reason);
847 
855 
862 
878 
879 #if APR_HAS_THREADS
880 
881 #if (APR_HAVE_SIGWAIT || APR_HAVE_SIGSUSPEND) && !defined(OS2)
882 
888 
903 APR_DECLARE(apr_status_t) apr_signal_thread(int(*signal_handler)(int signum));
904 
905 #endif /* (APR_HAVE_SIGWAIT || APR_HAVE_SIGSUSPEND) && !defined(OS2) */
906 
912 
913 #endif /* APR_HAS_THREADS */
914 
917 #ifdef __cplusplus
918 }
919 #endif
920 
921 #endif /* ! APR_THREAD_PROC_H */
922 
APR Platform Definitions.
APR Error Codes.
APR File I/O Handling.
APR Process Locking Routines.
APR memory allocation.
dav_buffer apr_size_t size
Definition: mod_dav.h:461
const dav_resource dav_prop_insert what
Definition: mod_dav.h:1095
int status
Definition: mod_dav.h:141
apr_bucket_brigade request_rec apr_pool_t * pool
Definition: mod_dav.h:557
dav_error * err
Definition: mod_dav.h:203
const char * name
Definition: mod_dav.h:805
int apr_status_t
Definition: apr_errno.h:44
apr_int32_t apr_fileperms_t
Definition: apr_file_info.h:125
apr_status_t() apr_perms_setfn_t(void *object, apr_fileperms_t perms, apr_uid_t uid, apr_gid_t gid)
Definition: apr_perms_set.h:42
int apr_int32_t
Definition: apr.h:347
#define __attribute__(__x)
Definition: apr.h:63
size_t apr_size_t
Definition: apr.h:394
#define APR_THREAD_FUNC
Definition: apr.h:490
struct apr_pool_t apr_pool_t
Definition: apr_pools.h:60
apr_status_t apr_proc_wait(apr_proc_t *proc, int *exitcode, apr_exit_why_e *exitwhy, apr_wait_how_e waithow)
apr_status_t apr_procattr_addrspace_set(apr_procattr_t *attr, apr_int32_t addrspace)
apr_status_t apr_threadkey_data_set(void *data, const char *key, apr_status_t(*cleanup)(void *), apr_threadkey_t *threadkey)
void apr_proc_other_child_unregister(void *data)
apr_status_t apr_procattr_cmdtype_set(apr_procattr_t *attr, apr_cmdtype_e cmd)
apr_status_t apr_thread_join(apr_status_t *retval, apr_thread_t *thd)
void() apr_child_errfn_t(apr_pool_t *proc, apr_status_t err, const char *description)
Definition: apr_thread_proc.h:174
apr_status_t apr_threadkey_private_delete(apr_threadkey_t *key)
apr_status_t apr_procattr_error_check_set(apr_procattr_t *attr, apr_int32_t chk)
apr_status_t apr_procattr_child_in_set(struct apr_procattr_t *attr, apr_file_t *child_in, apr_file_t *parent_in)
apr_status_t apr_procattr_io_set(apr_procattr_t *attr, apr_int32_t in, apr_int32_t out, apr_int32_t err)
apr_status_t apr_signal_thread(int(*signal_handler)(int signum))
apr_status_t apr_threadattr_guardsize_set(apr_threadattr_t *attr, apr_size_t guardsize)
apr_status_t apr_threadkey_private_get(void **new_mem, apr_threadkey_t *key)
void apr_thread_exit(apr_thread_t *thd, apr_status_t retval) __attribute__((noreturn))
apr_status_t apr_procattr_group_set(apr_procattr_t *attr, const char *groupname)
apr_status_t apr_procattr_detach_set(apr_procattr_t *attr, apr_int32_t detach)
apr_status_t apr_proc_fork(apr_proc_t *proc, apr_pool_t *cont)
apr_kill_conditions_e
Definition: apr_thread_proc.h:200
apr_status_t apr_proc_kill(apr_proc_t *proc, int sig)
apr_status_t apr_procattr_limit_set(apr_procattr_t *attr, apr_int32_t what, struct rlimit *limit)
apr_status_t apr_proc_wait_all_procs(apr_proc_t *proc, int *exitcode, apr_exit_why_e *exitwhy, apr_wait_how_e waithow, apr_pool_t *p)
apr_status_t apr_thread_current_create(apr_thread_t **current, apr_threadattr_t *attr, apr_pool_t *pool)
apr_status_t apr_proc_detach(int daemonize)
apr_status_t apr_thread_name_set(const char *name, apr_thread_t *thread, apr_pool_t *pool)
apr_wait_how_e
Definition: apr_thread_proc.h:56
apr_status_t apr_threadkey_private_set(void *priv, apr_threadkey_t *key)
apr_status_t apr_thread_once_init(apr_thread_once_t **control, apr_pool_t *p)
apr_status_t apr_threadattr_create(apr_threadattr_t **new_attr, apr_pool_t *cont)
apr_thread_t * apr_thread_current(void)
apr_status_t apr_procattr_child_err_set(struct apr_procattr_t *attr, apr_file_t *child_err, apr_file_t *parent_err)
apr_status_t apr_procattr_user_set(apr_procattr_t *attr, const char *username, const char *password)
void apr_proc_other_child_refresh(apr_other_child_rec_t *ocr, int reason)
apr_status_t apr_threadattr_stacksize_set(apr_threadattr_t *attr, apr_size_t stacksize)
apr_status_t apr_setup_signal_thread(void)
apr_status_t apr_threadattr_detach_set(apr_threadattr_t *attr, apr_int32_t on)
apr_status_t apr_proc_other_child_alert(apr_proc_t *proc, int reason, int status)
apr_status_t apr_thread_once(apr_thread_once_t *control, void(*func)(void))
apr_status_t apr_procattr_create(apr_procattr_t **new_attr, apr_pool_t *cont)
struct apr_proc_t apr_proc_t
apr_status_t apr_procattr_dir_set(apr_procattr_t *attr, const char *dir)
apr_status_t apr_threadattr_max_free_set(apr_threadattr_t *attr, apr_size_t size)
void *(APR_THREAD_FUNC * apr_thread_start_t)(apr_thread_t *, void *)
Definition: apr_thread_proc.h:198
apr_status_t apr_procattr_child_errfn_set(apr_procattr_t *attr, apr_child_errfn_t *errfn)
apr_status_t apr_thread_data_set(void *data, const char *key, apr_status_t(*cleanup)(void *), apr_thread_t *thread)
apr_status_t apr_proc_create(apr_proc_t *new_proc, const char *progname, const char *const *args, const char *const *env, apr_procattr_t *attr, apr_pool_t *pool)
apr_status_t apr_procattr_child_out_set(struct apr_procattr_t *attr, apr_file_t *child_out, apr_file_t *parent_out)
apr_exit_why_e
Definition: apr_thread_proc.h:66
apr_status_t apr_thread_name_get(char **name, apr_thread_t *thread, apr_pool_t *pool)
apr_status_t apr_threadkey_private_create(apr_threadkey_t **key, void(*dest)(void *), apr_pool_t *cont)
void apr_pool_note_subprocess(apr_pool_t *a, apr_proc_t *proc, apr_kill_conditions_e how)
void apr_thread_yield(void)
void apr_thread_current_after_fork(void)
void apr_proc_other_child_refresh_all(int reason)
apr_status_t apr_thread_data_get(void **data, const char *key, apr_thread_t *thread)
apr_status_t apr_procattr_perms_set_register(apr_procattr_t *attr, apr_perms_setfn_t *perms_set_fn, void *data, apr_fileperms_t perms)
APR_POOL_DECLARE_ACCESSOR(thread)
apr_status_t apr_thread_detach(apr_thread_t *thd)
apr_cmdtype_e
Definition: apr_thread_proc.h:46
apr_status_t apr_threadkey_data_get(void **data, const char *key, apr_threadkey_t *threadkey)
apr_status_t apr_threadattr_detach_get(apr_threadattr_t *attr)
apr_status_t apr_thread_create(apr_thread_t **new_thread, apr_threadattr_t *attr, apr_thread_start_t func, void *data, apr_pool_t *cont)
void apr_proc_other_child_register(apr_proc_t *proc, void(*maintenance)(int reason, void *, int status), void *data, apr_file_t *write_fd, apr_pool_t *p)
@ APR_KILL_AFTER_TIMEOUT
Definition: apr_thread_proc.h:205
@ APR_KILL_ONLY_ONCE
Definition: apr_thread_proc.h:207
@ APR_KILL_NEVER
Definition: apr_thread_proc.h:201
@ APR_JUST_WAIT
Definition: apr_thread_proc.h:206
@ APR_KILL_ALWAYS
Definition: apr_thread_proc.h:204
@ APR_NOWAIT
Definition: apr_thread_proc.h:58
@ APR_WAIT
Definition: apr_thread_proc.h:57
@ APR_PROC_SIGNAL_CORE
Definition: apr_thread_proc.h:69
@ APR_PROC_SIGNAL
Definition: apr_thread_proc.h:68
@ APR_PROC_EXIT
Definition: apr_thread_proc.h:67
@ APR_SHELLCMD
Definition: apr_thread_proc.h:47
@ APR_PROGRAM_ENV
Definition: apr_thread_proc.h:49
@ APR_PROGRAM_PATH
Definition: apr_thread_proc.h:50
@ APR_PROGRAM
Definition: apr_thread_proc.h:48
@ APR_SHELLCMD_ENV
Definition: apr_thread_proc.h:51
#define APR_DECLARE(x)
Definition: macros.h:6
Definition: apr_arch_file_io.h:107
Definition: apr_arch_misc.h:52
void * data
Definition: apr_arch_misc.h:57
void(* maintenance)(int, void *, int)
Definition: apr_arch_misc.h:56
apr_proc_t * proc
Definition: apr_arch_misc.h:55
Definition: apr_thread_proc.h:134
char * invoked
Definition: apr_thread_proc.h:151
pid_t pid
Definition: apr_thread_proc.h:136
apr_file_t * in
Definition: apr_thread_proc.h:138
HANDLE hproc
Definition: apr_thread_proc.h:160
apr_file_t * out
Definition: apr_thread_proc.h:140
apr_file_t * err
Definition: apr_thread_proc.h:142
Definition: apr_arch_threadproc.h:78
Definition: apr_arch_threadproc.h:91
Definition: apr_arch_threadproc.h:42
Definition: apr_arch_threadproc.h:51
Definition: apr_arch_threadproc.h:59
apr_pool_t * p