Annotation of win32/apache22/srclib/apr/include/apr_thread_proc.h, revision 1.1

1.1     ! moko        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: 
        !            20: /**
        !            21:  * @file apr_thread_proc.h
        !            22:  * @brief APR Thread and Process Library
        !            23:  */
        !            24: 
        !            25: #include "apr.h"
        !            26: #include "apr_file_io.h"
        !            27: #include "apr_pools.h"
        !            28: #include "apr_errno.h"
        !            29: 
        !            30: #if APR_HAVE_STRUCT_RLIMIT
        !            31: #include <sys/time.h>
        !            32: #include <sys/resource.h>
        !            33: #endif
        !            34: 
        !            35: #ifdef __cplusplus
        !            36: extern "C" {
        !            37: #endif /* __cplusplus */
        !            38: 
        !            39: /**
        !            40:  * @defgroup apr_thread_proc Threads and Process Functions
        !            41:  * @ingroup APR 
        !            42:  * @{
        !            43:  */
        !            44: 
        !            45: typedef enum {
        !            46:     APR_SHELLCMD,           /**< use the shell to invoke the program */
        !            47:     APR_PROGRAM,            /**< invoke the program directly, no copied env */
        !            48:     APR_PROGRAM_ENV,        /**< invoke the program, replicating our environment */
        !            49:     APR_PROGRAM_PATH,       /**< find program on PATH, use our environment */
        !            50:     APR_SHELLCMD_ENV        /**< use the shell to invoke the program,
        !            51:                              *   replicating our environment
        !            52:                              */
        !            53: } apr_cmdtype_e;
        !            54: 
        !            55: typedef enum {
        !            56:     APR_WAIT,           /**< wait for the specified process to finish */
        !            57:     APR_NOWAIT          /**< do not wait -- just see if it has finished */
        !            58: } apr_wait_how_e;
        !            59: 
        !            60: /* I am specifically calling out the values so that the macros below make
        !            61:  * more sense.  Yes, I know I don't need to, but I am hoping this makes what
        !            62:  * I am doing more clear.  If you want to add more reasons to exit, continue
        !            63:  * to use bitmasks.
        !            64:  */
        !            65: typedef enum {
        !            66:     APR_PROC_EXIT = 1,          /**< process exited normally */
        !            67:     APR_PROC_SIGNAL = 2,        /**< process exited due to a signal */
        !            68:     APR_PROC_SIGNAL_CORE = 4    /**< process exited and dumped a core file */
        !            69: } apr_exit_why_e;
        !            70: 
        !            71: /** did we exit the process */
        !            72: #define APR_PROC_CHECK_EXIT(x)        (x & APR_PROC_EXIT)
        !            73: /** did we get a signal */
        !            74: #define APR_PROC_CHECK_SIGNALED(x)    (x & APR_PROC_SIGNAL)
        !            75: /** did we get core */
        !            76: #define APR_PROC_CHECK_CORE_DUMP(x)   (x & APR_PROC_SIGNAL_CORE)
        !            77: 
        !            78: /** @see apr_procattr_io_set */
        !            79: #define APR_NO_PIPE          0
        !            80: /** @see apr_procattr_io_set and apr_file_pipe_create_ex */
        !            81: #define APR_FULL_BLOCK       1
        !            82: /** @see apr_procattr_io_set and apr_file_pipe_create_ex */
        !            83: #define APR_FULL_NONBLOCK    2
        !            84: /** @see apr_procattr_io_set */
        !            85: #define APR_PARENT_BLOCK     3
        !            86: /** @see apr_procattr_io_set */
        !            87: #define APR_CHILD_BLOCK      4
        !            88: /** @see apr_procattr_io_set */
        !            89: #define APR_NO_FILE          8
        !            90: 
        !            91: /** @see apr_file_pipe_create_ex */
        !            92: #define APR_READ_BLOCK       3
        !            93: /** @see apr_file_pipe_create_ex */
        !            94: #define APR_WRITE_BLOCK      4
        !            95: 
        !            96: /** @see apr_procattr_io_set 
        !            97:  * @note Win32 only effective with version 1.2.12, portably introduced in 1.3.0
        !            98:  */
        !            99: #define APR_NO_FILE          8
        !           100: 
        !           101: /** @see apr_procattr_limit_set */
        !           102: #define APR_LIMIT_CPU        0
        !           103: /** @see apr_procattr_limit_set */
        !           104: #define APR_LIMIT_MEM        1
        !           105: /** @see apr_procattr_limit_set */
        !           106: #define APR_LIMIT_NPROC      2
        !           107: /** @see apr_procattr_limit_set */
        !           108: #define APR_LIMIT_NOFILE     3
        !           109: 
        !           110: /**
        !           111:  * @defgroup APR_OC Other Child Flags
        !           112:  * @{
        !           113:  */
        !           114: #define APR_OC_REASON_DEATH         0     /**< child has died, caller must call
        !           115:                                            * unregister still */
        !           116: #define APR_OC_REASON_UNWRITABLE    1     /**< write_fd is unwritable */
        !           117: #define APR_OC_REASON_RESTART       2     /**< a restart is occuring, perform
        !           118:                                            * any necessary cleanup (including
        !           119:                                            * sending a special signal to child)
        !           120:                                            */
        !           121: #define APR_OC_REASON_UNREGISTER    3     /**< unregister has been called, do
        !           122:                                            * whatever is necessary (including
        !           123:                                            * kill the child) */
        !           124: #define APR_OC_REASON_LOST          4     /**< somehow the child exited without
        !           125:                                            * us knowing ... buggy os? */
        !           126: #define APR_OC_REASON_RUNNING       5     /**< a health check is occuring, 
        !           127:                                            * for most maintainence functions
        !           128:                                            * this is a no-op.
        !           129:                                            */
        !           130: /** @} */
        !           131: 
        !           132: /** The APR process type */
        !           133: typedef struct apr_proc_t {
        !           134:     /** The process ID */
        !           135:     pid_t pid;
        !           136:     /** Parent's side of pipe to child's stdin */
        !           137:     apr_file_t *in;
        !           138:     /** Parent's side of pipe to child's stdout */
        !           139:     apr_file_t *out;
        !           140:     /** Parent's side of pipe to child's stdouterr */
        !           141:     apr_file_t *err;
        !           142: #if APR_HAS_PROC_INVOKED || defined(DOXYGEN)
        !           143:     /** Diagnositics/debugging string of the command invoked for 
        !           144:      *  this process [only present if APR_HAS_PROC_INVOKED is true]
        !           145:      * @remark Only enabled on Win32 by default.
        !           146:      * @bug This should either always or never be present in release
        !           147:      * builds - since it breaks binary compatibility.  We may enable
        !           148:      * it always in APR 1.0 yet leave it undefined in most cases.
        !           149:      */
        !           150:     char *invoked;
        !           151: #endif
        !           152: #if defined(WIN32) || defined(DOXYGEN)
        !           153:     /** (Win32 only) Creator's handle granting access to the process
        !           154:      * @remark This handle is closed and reset to NULL in every case
        !           155:      * corresponding to a waitpid() on Unix which returns the exit status.
        !           156:      * Therefore Win32 correspond's to Unix's zombie reaping characteristics
        !           157:      * and avoids potential handle leaks.
        !           158:      */
        !           159:     HANDLE hproc;
        !           160: #endif
        !           161: } apr_proc_t;
        !           162: 
        !           163: /**
        !           164:  * The prototype for APR child errfn functions.  (See the description
        !           165:  * of apr_procattr_child_errfn_set() for more information.)
        !           166:  * It is passed the following parameters:
        !           167:  * @param pool Pool associated with the apr_proc_t.  If your child
        !           168:  *             error function needs user data, associate it with this
        !           169:  *             pool.
        !           170:  * @param err APR error code describing the error
        !           171:  * @param description Text description of type of processing which failed
        !           172:  */
        !           173: typedef void (apr_child_errfn_t)(apr_pool_t *proc, apr_status_t err,
        !           174:                                  const char *description);
        !           175: 
        !           176: /** Opaque Thread structure. */
        !           177: typedef struct apr_thread_t           apr_thread_t;
        !           178: 
        !           179: /** Opaque Thread attributes structure. */
        !           180: typedef struct apr_threadattr_t       apr_threadattr_t;
        !           181: 
        !           182: /** Opaque Process attributes structure. */
        !           183: typedef struct apr_procattr_t         apr_procattr_t;
        !           184: 
        !           185: /** Opaque control variable for one-time atomic variables.  */
        !           186: typedef struct apr_thread_once_t      apr_thread_once_t;
        !           187: 
        !           188: /** Opaque thread private address space. */
        !           189: typedef struct apr_threadkey_t        apr_threadkey_t;
        !           190: 
        !           191: /** Opaque record of child process. */
        !           192: typedef struct apr_other_child_rec_t  apr_other_child_rec_t;
        !           193: 
        !           194: /**
        !           195:  * The prototype for any APR thread worker functions.
        !           196:  */
        !           197: typedef void *(APR_THREAD_FUNC *apr_thread_start_t)(apr_thread_t*, void*);
        !           198: 
        !           199: typedef enum {
        !           200:     APR_KILL_NEVER,             /**< process is never sent any signals */
        !           201:     APR_KILL_ALWAYS,            /**< process is sent SIGKILL on apr_pool_t cleanup */
        !           202:     APR_KILL_AFTER_TIMEOUT,     /**< SIGTERM, wait 3 seconds, SIGKILL */
        !           203:     APR_JUST_WAIT,              /**< wait forever for the process to complete */
        !           204:     APR_KILL_ONLY_ONCE          /**< send SIGTERM and then wait */
        !           205: } apr_kill_conditions_e;
        !           206: 
        !           207: /* Thread Function definitions */
        !           208: 
        !           209: #if APR_HAS_THREADS
        !           210: 
        !           211: /**
        !           212:  * Create and initialize a new threadattr variable
        !           213:  * @param new_attr The newly created threadattr.
        !           214:  * @param cont The pool to use
        !           215:  */
        !           216: APR_DECLARE(apr_status_t) apr_threadattr_create(apr_threadattr_t **new_attr, 
        !           217:                                                 apr_pool_t *cont);
        !           218: 
        !           219: /**
        !           220:  * Set if newly created threads should be created in detached state.
        !           221:  * @param attr The threadattr to affect 
        !           222:  * @param on Non-zero if detached threads should be created.
        !           223:  */
        !           224: APR_DECLARE(apr_status_t) apr_threadattr_detach_set(apr_threadattr_t *attr, 
        !           225:                                                     apr_int32_t on);
        !           226: 
        !           227: /**
        !           228:  * Get the detach state for this threadattr.
        !           229:  * @param attr The threadattr to reference
        !           230:  * @return APR_DETACH if threads are to be detached, or APR_NOTDETACH
        !           231:  * if threads are to be joinable. 
        !           232:  */
        !           233: APR_DECLARE(apr_status_t) apr_threadattr_detach_get(apr_threadattr_t *attr);
        !           234: 
        !           235: /**
        !           236:  * Set the stack size of newly created threads.
        !           237:  * @param attr The threadattr to affect 
        !           238:  * @param stacksize The stack size in bytes
        !           239:  */
        !           240: APR_DECLARE(apr_status_t) apr_threadattr_stacksize_set(apr_threadattr_t *attr,
        !           241:                                                        apr_size_t stacksize);
        !           242: 
        !           243: /**
        !           244:  * Set the stack guard area size of newly created threads.
        !           245:  * @param attr The threadattr to affect 
        !           246:  * @param guardsize The stack guard area size in bytes
        !           247:  * @note Thread library implementations commonly use a "guard area"
        !           248:  * after each thread's stack which is not readable or writable such that
        !           249:  * stack overflows cause a segfault; this consumes e.g. 4K of memory
        !           250:  * and increases memory management overhead.  Setting the guard area
        !           251:  * size to zero hence trades off reliable behaviour on stack overflow
        !           252:  * for performance. */
        !           253: APR_DECLARE(apr_status_t) apr_threadattr_guardsize_set(apr_threadattr_t *attr,
        !           254:                                                        apr_size_t guardsize);
        !           255: 
        !           256: /**
        !           257:  * Create a new thread of execution
        !           258:  * @param new_thread The newly created thread handle.
        !           259:  * @param attr The threadattr to use to determine how to create the thread
        !           260:  * @param func The function to start the new thread in
        !           261:  * @param data Any data to be passed to the starting function
        !           262:  * @param cont The pool to use
        !           263:  */
        !           264: APR_DECLARE(apr_status_t) apr_thread_create(apr_thread_t **new_thread, 
        !           265:                                             apr_threadattr_t *attr, 
        !           266:                                             apr_thread_start_t func, 
        !           267:                                             void *data, apr_pool_t *cont);
        !           268: 
        !           269: /**
        !           270:  * stop the current thread
        !           271:  * @param thd The thread to stop
        !           272:  * @param retval The return value to pass back to any thread that cares
        !           273:  */
        !           274: APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, 
        !           275:                                           apr_status_t retval);
        !           276: 
        !           277: /**
        !           278:  * block until the desired thread stops executing.
        !           279:  * @param retval The return value from the dead thread.
        !           280:  * @param thd The thread to join
        !           281:  */
        !           282: APR_DECLARE(apr_status_t) apr_thread_join(apr_status_t *retval, 
        !           283:                                           apr_thread_t *thd); 
        !           284: 
        !           285: /**
        !           286:  * force the current thread to yield the processor
        !           287:  */
        !           288: APR_DECLARE(void) apr_thread_yield(void);
        !           289: 
        !           290: /**
        !           291:  * Initialize the control variable for apr_thread_once.  If this isn't
        !           292:  * called, apr_initialize won't work.
        !           293:  * @param control The control variable to initialize
        !           294:  * @param p The pool to allocate data from.
        !           295:  */
        !           296: APR_DECLARE(apr_status_t) apr_thread_once_init(apr_thread_once_t **control,
        !           297:                                                apr_pool_t *p);
        !           298: 
        !           299: /**
        !           300:  * Run the specified function one time, regardless of how many threads
        !           301:  * call it.
        !           302:  * @param control The control variable.  The same variable should
        !           303:  *                be passed in each time the function is tried to be
        !           304:  *                called.  This is how the underlying functions determine
        !           305:  *                if the function has ever been called before.
        !           306:  * @param func The function to call.
        !           307:  */
        !           308: APR_DECLARE(apr_status_t) apr_thread_once(apr_thread_once_t *control,
        !           309:                                           void (*func)(void));
        !           310: 
        !           311: /**
        !           312:  * detach a thread
        !           313:  * @param thd The thread to detach 
        !           314:  */
        !           315: APR_DECLARE(apr_status_t) apr_thread_detach(apr_thread_t *thd);
        !           316: 
        !           317: /**
        !           318:  * Return user data associated with the current thread.
        !           319:  * @param data The user data associated with the thread.
        !           320:  * @param key The key to associate with the data
        !           321:  * @param thread The currently open thread.
        !           322:  */
        !           323: APR_DECLARE(apr_status_t) apr_thread_data_get(void **data, const char *key,
        !           324:                                              apr_thread_t *thread);
        !           325: 
        !           326: /**
        !           327:  * Set user data associated with the current thread.
        !           328:  * @param data The user data to associate with the thread.
        !           329:  * @param key The key to use for associating the data with the thread
        !           330:  * @param cleanup The cleanup routine to use when the thread is destroyed.
        !           331:  * @param thread The currently open thread.
        !           332:  */
        !           333: APR_DECLARE(apr_status_t) apr_thread_data_set(void *data, const char *key,
        !           334:                                              apr_status_t (*cleanup) (void *),
        !           335:                                              apr_thread_t *thread);
        !           336: 
        !           337: /**
        !           338:  * Create and initialize a new thread private address space
        !           339:  * @param key The thread private handle.
        !           340:  * @param dest The destructor to use when freeing the private memory.
        !           341:  * @param cont The pool to use
        !           342:  */
        !           343: APR_DECLARE(apr_status_t) apr_threadkey_private_create(apr_threadkey_t **key, 
        !           344:                                                     void (*dest)(void *),
        !           345:                                                     apr_pool_t *cont);
        !           346: 
        !           347: /**
        !           348:  * Get a pointer to the thread private memory
        !           349:  * @param new_mem The data stored in private memory 
        !           350:  * @param key The handle for the desired thread private memory 
        !           351:  */
        !           352: APR_DECLARE(apr_status_t) apr_threadkey_private_get(void **new_mem, 
        !           353:                                                  apr_threadkey_t *key);
        !           354: 
        !           355: /**
        !           356:  * Set the data to be stored in thread private memory
        !           357:  * @param priv The data to be stored in private memory 
        !           358:  * @param key The handle for the desired thread private memory 
        !           359:  */
        !           360: APR_DECLARE(apr_status_t) apr_threadkey_private_set(void *priv, 
        !           361:                                                  apr_threadkey_t *key);
        !           362: 
        !           363: /**
        !           364:  * Free the thread private memory
        !           365:  * @param key The handle for the desired thread private memory 
        !           366:  */
        !           367: APR_DECLARE(apr_status_t) apr_threadkey_private_delete(apr_threadkey_t *key);
        !           368: 
        !           369: /**
        !           370:  * Return the pool associated with the current threadkey.
        !           371:  * @param data The user data associated with the threadkey.
        !           372:  * @param key The key associated with the data
        !           373:  * @param threadkey The currently open threadkey.
        !           374:  */
        !           375: APR_DECLARE(apr_status_t) apr_threadkey_data_get(void **data, const char *key,
        !           376:                                                 apr_threadkey_t *threadkey);
        !           377: 
        !           378: /**
        !           379:  * Return the pool associated with the current threadkey.
        !           380:  * @param data The data to set.
        !           381:  * @param key The key to associate with the data.
        !           382:  * @param cleanup The cleanup routine to use when the file is destroyed.
        !           383:  * @param threadkey The currently open threadkey.
        !           384:  */
        !           385: APR_DECLARE(apr_status_t) apr_threadkey_data_set(void *data, const char *key,
        !           386:                                                 apr_status_t (*cleanup) (void *),
        !           387:                                                 apr_threadkey_t *threadkey);
        !           388: 
        !           389: #endif
        !           390: 
        !           391: /**
        !           392:  * Create and initialize a new procattr variable
        !           393:  * @param new_attr The newly created procattr. 
        !           394:  * @param cont The pool to use
        !           395:  */
        !           396: APR_DECLARE(apr_status_t) apr_procattr_create(apr_procattr_t **new_attr,
        !           397:                                                   apr_pool_t *cont);
        !           398: 
        !           399: /**
        !           400:  * Determine if any of stdin, stdout, or stderr should be linked to pipes 
        !           401:  * when starting a child process.
        !           402:  * @param attr The procattr we care about. 
        !           403:  * @param in Should stdin be a pipe back to the parent?
        !           404:  * @param out Should stdout be a pipe back to the parent?
        !           405:  * @param err Should stderr be a pipe back to the parent?
        !           406:  * @note If APR_NO_PIPE, there will be no special channel, the child
        !           407:  * inherits the parent's corresponding stdio stream.  If APR_NO_FILE is 
        !           408:  * specified, that corresponding stream is closed in the child (and will
        !           409:  * be INVALID_HANDLE_VALUE when inspected on Win32). This can have ugly 
        !           410:  * side effects, as the next file opened in the child on Unix will fall
        !           411:  * into the stdio stream fd slot!
        !           412:  */
        !           413: APR_DECLARE(apr_status_t) apr_procattr_io_set(apr_procattr_t *attr, 
        !           414:                                              apr_int32_t in, apr_int32_t out,
        !           415:                                              apr_int32_t err);
        !           416: 
        !           417: /**
        !           418:  * Set the child_in and/or parent_in values to existing apr_file_t values.
        !           419:  * @param attr The procattr we care about. 
        !           420:  * @param child_in apr_file_t value to use as child_in. Must be a valid file.
        !           421:  * @param parent_in apr_file_t value to use as parent_in. Must be a valid file.
        !           422:  * @remark  This is NOT a required initializer function. This is
        !           423:  *          useful if you have already opened a pipe (or multiple files)
        !           424:  *          that you wish to use, perhaps persistently across multiple
        !           425:  *          process invocations - such as a log file. You can save some 
        !           426:  *          extra function calls by not creating your own pipe since this
        !           427:  *          creates one in the process space for you.
        !           428:  * @bug Note that calling this function with two NULL files on some platforms
        !           429:  * creates an APR_FULL_BLOCK pipe, but this behavior is neither portable nor
        !           430:  * is it supported.  @see apr_procattr_io_set instead for simple pipes.
        !           431:  */
        !           432: APR_DECLARE(apr_status_t) apr_procattr_child_in_set(struct apr_procattr_t *attr,
        !           433:                                                   apr_file_t *child_in,
        !           434:                                                   apr_file_t *parent_in);
        !           435: 
        !           436: /**
        !           437:  * Set the child_out and parent_out values to existing apr_file_t values.
        !           438:  * @param attr The procattr we care about. 
        !           439:  * @param child_out apr_file_t value to use as child_out. Must be a valid file.
        !           440:  * @param parent_out apr_file_t value to use as parent_out. Must be a valid file.
        !           441:  * @remark This is NOT a required initializer function. This is
        !           442:  *         useful if you have already opened a pipe (or multiple files)
        !           443:  *         that you wish to use, perhaps persistently across multiple
        !           444:  *         process invocations - such as a log file. 
        !           445:  * @bug Note that calling this function with two NULL files on some platforms
        !           446:  * creates an APR_FULL_BLOCK pipe, but this behavior is neither portable nor
        !           447:  * is it supported.  @see apr_procattr_io_set instead for simple pipes.
        !           448:  */
        !           449: APR_DECLARE(apr_status_t) apr_procattr_child_out_set(struct apr_procattr_t *attr,
        !           450:                                                    apr_file_t *child_out,
        !           451:                                                    apr_file_t *parent_out);
        !           452: 
        !           453: /**
        !           454:  * Set the child_err and parent_err values to existing apr_file_t values.
        !           455:  * @param attr The procattr we care about. 
        !           456:  * @param child_err apr_file_t value to use as child_err. Must be a valid file.
        !           457:  * @param parent_err apr_file_t value to use as parent_err. Must be a valid file.
        !           458:  * @remark This is NOT a required initializer function. This is
        !           459:  *         useful if you have already opened a pipe (or multiple files)
        !           460:  *         that you wish to use, perhaps persistently across multiple
        !           461:  *         process invocations - such as a log file. 
        !           462:  * @bug Note that calling this function with two NULL files on some platforms
        !           463:  * creates an APR_FULL_BLOCK pipe, but this behavior is neither portable nor
        !           464:  * is it supported.  @see apr_procattr_io_set instead for simple pipes.
        !           465:  */
        !           466: APR_DECLARE(apr_status_t) apr_procattr_child_err_set(struct apr_procattr_t *attr,
        !           467:                                                    apr_file_t *child_err,
        !           468:                                                    apr_file_t *parent_err);
        !           469: 
        !           470: /**
        !           471:  * Set which directory the child process should start executing in.
        !           472:  * @param attr The procattr we care about. 
        !           473:  * @param dir Which dir to start in.  By default, this is the same dir as
        !           474:  *            the parent currently resides in, when the createprocess call
        !           475:  *            is made. 
        !           476:  */
        !           477: APR_DECLARE(apr_status_t) apr_procattr_dir_set(apr_procattr_t *attr, 
        !           478:                                               const char *dir);
        !           479: 
        !           480: /**
        !           481:  * Set what type of command the child process will call.
        !           482:  * @param attr The procattr we care about. 
        !           483:  * @param cmd The type of command.  One of:
        !           484:  * <PRE>
        !           485:  *            APR_SHELLCMD     --  Anything that the shell can handle
        !           486:  *            APR_PROGRAM      --  Executable program   (default) 
        !           487:  *            APR_PROGRAM_ENV  --  Executable program, copy environment
        !           488:  *            APR_PROGRAM_PATH --  Executable program on PATH, copy env
        !           489:  * </PRE>
        !           490:  */
        !           491: APR_DECLARE(apr_status_t) apr_procattr_cmdtype_set(apr_procattr_t *attr,
        !           492:                                                   apr_cmdtype_e cmd);
        !           493: 
        !           494: /**
        !           495:  * Determine if the child should start in detached state.
        !           496:  * @param attr The procattr we care about. 
        !           497:  * @param detach Should the child start in detached state?  Default is no. 
        !           498:  */
        !           499: APR_DECLARE(apr_status_t) apr_procattr_detach_set(apr_procattr_t *attr, 
        !           500:                                                  apr_int32_t detach);
        !           501: 
        !           502: #if APR_HAVE_STRUCT_RLIMIT
        !           503: /**
        !           504:  * Set the Resource Utilization limits when starting a new process.
        !           505:  * @param attr The procattr we care about. 
        !           506:  * @param what Which limit to set, one of:
        !           507:  * <PRE>
        !           508:  *                 APR_LIMIT_CPU
        !           509:  *                 APR_LIMIT_MEM
        !           510:  *                 APR_LIMIT_NPROC
        !           511:  *                 APR_LIMIT_NOFILE
        !           512:  * </PRE>
        !           513:  * @param limit Value to set the limit to.
        !           514:  */
        !           515: APR_DECLARE(apr_status_t) apr_procattr_limit_set(apr_procattr_t *attr, 
        !           516:                                                 apr_int32_t what,
        !           517:                                                 struct rlimit *limit);
        !           518: #endif
        !           519: 
        !           520: /**
        !           521:  * Specify an error function to be called in the child process if APR
        !           522:  * encounters an error in the child prior to running the specified program.
        !           523:  * @param attr The procattr describing the child process to be created.
        !           524:  * @param errfn The function to call in the child process.
        !           525:  * @remark At the present time, it will only be called from apr_proc_create()
        !           526:  *         on platforms where fork() is used.  It will never be called on other
        !           527:  *         platforms, on those platforms apr_proc_create() will return the error
        !           528:  *         in the parent process rather than invoke the callback in the now-forked
        !           529:  *         child process.
        !           530:  */
        !           531: APR_DECLARE(apr_status_t) apr_procattr_child_errfn_set(apr_procattr_t *attr,
        !           532:                                                        apr_child_errfn_t *errfn);
        !           533: 
        !           534: /**
        !           535:  * Specify that apr_proc_create() should do whatever it can to report
        !           536:  * failures to the caller of apr_proc_create(), rather than find out in
        !           537:  * the child.
        !           538:  * @param attr The procattr describing the child process to be created.
        !           539:  * @param chk Flag to indicate whether or not extra work should be done
        !           540:  *            to try to report failures to the caller.
        !           541:  * @remark This flag only affects apr_proc_create() on platforms where
        !           542:  *         fork() is used.  This leads to extra overhead in the calling
        !           543:  *         process, but that may help the application handle such
        !           544:  *         errors more gracefully.
        !           545:  */
        !           546: APR_DECLARE(apr_status_t) apr_procattr_error_check_set(apr_procattr_t *attr,
        !           547:                                                        apr_int32_t chk);
        !           548: 
        !           549: /**
        !           550:  * Determine if the child should start in its own address space or using the 
        !           551:  * current one from its parent
        !           552:  * @param attr The procattr we care about. 
        !           553:  * @param addrspace Should the child start in its own address space?  Default
        !           554:  *                  is no on NetWare and yes on other platforms.
        !           555:  */
        !           556: APR_DECLARE(apr_status_t) apr_procattr_addrspace_set(apr_procattr_t *attr,
        !           557:                                                        apr_int32_t addrspace);
        !           558: 
        !           559: /**
        !           560:  * Set the username used for running process
        !           561:  * @param attr The procattr we care about. 
        !           562:  * @param username The username used
        !           563:  * @param password User password if needed. Password is needed on WIN32
        !           564:  *                 or any other platform having
        !           565:  *                 APR_PROCATTR_USER_SET_REQUIRES_PASSWORD set.
        !           566:  */
        !           567: APR_DECLARE(apr_status_t) apr_procattr_user_set(apr_procattr_t *attr,
        !           568:                                                 const char *username,
        !           569:                                                 const char *password);
        !           570: 
        !           571: /**
        !           572:  * Set the group used for running process
        !           573:  * @param attr The procattr we care about. 
        !           574:  * @param groupname The group name  used
        !           575:  */
        !           576: APR_DECLARE(apr_status_t) apr_procattr_group_set(apr_procattr_t *attr,
        !           577:                                                  const char *groupname);
        !           578: 
        !           579: 
        !           580: #if APR_HAS_FORK
        !           581: /**
        !           582:  * This is currently the only non-portable call in APR.  This executes 
        !           583:  * a standard unix fork.
        !           584:  * @param proc The resulting process handle. 
        !           585:  * @param cont The pool to use. 
        !           586:  * @remark returns APR_INCHILD for the child, and APR_INPARENT for the parent
        !           587:  * or an error.
        !           588:  */
        !           589: APR_DECLARE(apr_status_t) apr_proc_fork(apr_proc_t *proc, apr_pool_t *cont);
        !           590: #endif
        !           591: 
        !           592: /**
        !           593:  * Create a new process and execute a new program within that process.
        !           594:  * @param new_proc The resulting process handle.
        !           595:  * @param progname The program to run 
        !           596:  * @param args the arguments to pass to the new program.  The first 
        !           597:  *             one should be the program name.
        !           598:  * @param env The new environment table for the new process.  This 
        !           599:  *            should be a list of NULL-terminated strings. This argument
        !           600:  *            is ignored for APR_PROGRAM_ENV, APR_PROGRAM_PATH, and
        !           601:  *            APR_SHELLCMD_ENV types of commands.
        !           602:  * @param attr the procattr we should use to determine how to create the new
        !           603:  *         process
        !           604:  * @param pool The pool to use.
        !           605:  * @note This function returns without waiting for the new process to terminate;
        !           606:  * use apr_proc_wait for that.
        !           607:  */
        !           608: APR_DECLARE(apr_status_t) apr_proc_create(apr_proc_t *new_proc,
        !           609:                                           const char *progname,
        !           610:                                           const char * const *args,
        !           611:                                           const char * const *env, 
        !           612:                                           apr_procattr_t *attr, 
        !           613:                                           apr_pool_t *pool);
        !           614: 
        !           615: /**
        !           616:  * Wait for a child process to die
        !           617:  * @param proc The process handle that corresponds to the desired child process 
        !           618:  * @param exitcode The returned exit status of the child, if a child process 
        !           619:  *                 dies, or the signal that caused the child to die.
        !           620:  *                 On platforms that don't support obtaining this information, 
        !           621:  *                 the status parameter will be returned as APR_ENOTIMPL.
        !           622:  * @param exitwhy Why the child died, the bitwise or of:
        !           623:  * <PRE>
        !           624:  *            APR_PROC_EXIT         -- process terminated normally
        !           625:  *            APR_PROC_SIGNAL       -- process was killed by a signal
        !           626:  *            APR_PROC_SIGNAL_CORE  -- process was killed by a signal, and
        !           627:  *                                     generated a core dump.
        !           628:  * </PRE>
        !           629:  * @param waithow How should we wait.  One of:
        !           630:  * <PRE>
        !           631:  *            APR_WAIT   -- block until the child process dies.
        !           632:  *            APR_NOWAIT -- return immediately regardless of if the 
        !           633:  *                          child is dead or not.
        !           634:  * </PRE>
        !           635:  * @remark The childs status is in the return code to this process.  It is one of:
        !           636:  * <PRE>
        !           637:  *            APR_CHILD_DONE     -- child is no longer running.
        !           638:  *            APR_CHILD_NOTDONE  -- child is still running.
        !           639:  * </PRE>
        !           640:  */
        !           641: APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc,
        !           642:                                         int *exitcode, apr_exit_why_e *exitwhy,
        !           643:                                         apr_wait_how_e waithow);
        !           644: 
        !           645: /**
        !           646:  * Wait for any current child process to die and return information 
        !           647:  * about that child.
        !           648:  * @param proc Pointer to NULL on entry, will be filled out with child's 
        !           649:  *             information 
        !           650:  * @param exitcode The returned exit status of the child, if a child process 
        !           651:  *                 dies, or the signal that caused the child to die.
        !           652:  *                 On platforms that don't support obtaining this information, 
        !           653:  *                 the status parameter will be returned as APR_ENOTIMPL.
        !           654:  * @param exitwhy Why the child died, the bitwise or of:
        !           655:  * <PRE>
        !           656:  *            APR_PROC_EXIT         -- process terminated normally
        !           657:  *            APR_PROC_SIGNAL       -- process was killed by a signal
        !           658:  *            APR_PROC_SIGNAL_CORE  -- process was killed by a signal, and
        !           659:  *                                     generated a core dump.
        !           660:  * </PRE>
        !           661:  * @param waithow How should we wait.  One of:
        !           662:  * <PRE>
        !           663:  *            APR_WAIT   -- block until the child process dies.
        !           664:  *            APR_NOWAIT -- return immediately regardless of if the 
        !           665:  *                          child is dead or not.
        !           666:  * </PRE>
        !           667:  * @param p Pool to allocate child information out of.
        !           668:  * @bug Passing proc as a *proc rather than **proc was an odd choice
        !           669:  * for some platforms... this should be revisited in 1.0
        !           670:  */
        !           671: APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc,
        !           672:                                                   int *exitcode,
        !           673:                                                   apr_exit_why_e *exitwhy,
        !           674:                                                   apr_wait_how_e waithow,
        !           675:                                                   apr_pool_t *p);
        !           676: 
        !           677: #define APR_PROC_DETACH_FOREGROUND 0    /**< Do not detach */
        !           678: #define APR_PROC_DETACH_DAEMONIZE 1     /**< Detach */
        !           679: 
        !           680: /**
        !           681:  * Detach the process from the controlling terminal.
        !           682:  * @param daemonize set to non-zero if the process should daemonize
        !           683:  *                  and become a background process, else it will
        !           684:  *                  stay in the foreground.
        !           685:  */
        !           686: APR_DECLARE(apr_status_t) apr_proc_detach(int daemonize);
        !           687: 
        !           688: /**
        !           689:  * Register an other_child -- a child associated to its registered 
        !           690:  * maintence callback.  This callback is invoked when the process
        !           691:  * dies, is disconnected or disappears.
        !           692:  * @param proc The child process to register.
        !           693:  * @param maintenance maintenance is a function that is invoked with a 
        !           694:  *                    reason and the data pointer passed here.
        !           695:  * @param data Opaque context data passed to the maintenance function.
        !           696:  * @param write_fd An fd that is probed for writing.  If it is ever unwritable
        !           697:  *                 then the maintenance is invoked with reason 
        !           698:  *                 OC_REASON_UNWRITABLE.
        !           699:  * @param p The pool to use for allocating memory.
        !           700:  * @bug write_fd duplicates the proc->out stream, it's really redundant
        !           701:  * and should be replaced in the APR 1.0 API with a bitflag of which
        !           702:  * proc->in/out/err handles should be health checked.
        !           703:  * @bug no platform currently tests the pipes health.
        !           704:  */
        !           705: APR_DECLARE(void) apr_proc_other_child_register(apr_proc_t *proc, 
        !           706:                                            void (*maintenance) (int reason, 
        !           707:                                                                 void *, 
        !           708:                                                                 int status),
        !           709:                                            void *data, apr_file_t *write_fd,
        !           710:                                            apr_pool_t *p);
        !           711: 
        !           712: /**
        !           713:  * Stop watching the specified other child.  
        !           714:  * @param data The data to pass to the maintenance function.  This is
        !           715:  *             used to find the process to unregister.
        !           716:  * @warning Since this can be called by a maintenance function while we're
        !           717:  *          scanning the other_children list, all scanners should protect 
        !           718:  *          themself by loading ocr->next before calling any maintenance 
        !           719:  *          function.
        !           720:  */
        !           721: APR_DECLARE(void) apr_proc_other_child_unregister(void *data);
        !           722: 
        !           723: /**
        !           724:  * Notify the maintenance callback of a registered other child process
        !           725:  * that application has detected an event, such as death.
        !           726:  * @param proc The process to check
        !           727:  * @param reason The reason code to pass to the maintenance function
        !           728:  * @param status The status to pass to the maintenance function
        !           729:  * @remark An example of code using this behavior;
        !           730:  * <pre>
        !           731:  * rv = apr_proc_wait_all_procs(&proc, &exitcode, &status, APR_WAIT, p);
        !           732:  * if (APR_STATUS_IS_CHILD_DONE(rv)) {
        !           733:  * \#if APR_HAS_OTHER_CHILD
        !           734:  *     if (apr_proc_other_child_alert(&proc, APR_OC_REASON_DEATH, status)
        !           735:  *             == APR_SUCCESS) {
        !           736:  *         ;  (already handled)
        !           737:  *     }
        !           738:  *     else
        !           739:  * \#endif
        !           740:  *         [... handling non-otherchild processes death ...]
        !           741:  * </pre>
        !           742:  */
        !           743: APR_DECLARE(apr_status_t) apr_proc_other_child_alert(apr_proc_t *proc, 
        !           744:                                                      int reason,
        !           745:                                                      int status);
        !           746: 
        !           747: /**
        !           748:  * Test one specific other child processes and invoke the maintenance callback 
        !           749:  * with the appropriate reason code, if still running, or the appropriate reason 
        !           750:  * code if the process is no longer healthy.
        !           751:  * @param ocr The registered other child
        !           752:  * @param reason The reason code (e.g. APR_OC_REASON_RESTART) if still running
        !           753:  */
        !           754: APR_DECLARE(void) apr_proc_other_child_refresh(apr_other_child_rec_t *ocr,
        !           755:                                                int reason);
        !           756: 
        !           757: /**
        !           758:  * Test all registered other child processes and invoke the maintenance callback 
        !           759:  * with the appropriate reason code, if still running, or the appropriate reason 
        !           760:  * code if the process is no longer healthy.
        !           761:  * @param reason The reason code (e.g. APR_OC_REASON_RESTART) to running processes
        !           762:  */
        !           763: APR_DECLARE(void) apr_proc_other_child_refresh_all(int reason);
        !           764: 
        !           765: /** 
        !           766:  * Terminate a process.
        !           767:  * @param proc The process to terminate.
        !           768:  * @param sig How to kill the process.
        !           769:  */
        !           770: APR_DECLARE(apr_status_t) apr_proc_kill(apr_proc_t *proc, int sig);
        !           771: 
        !           772: /**
        !           773:  * Register a process to be killed when a pool dies.
        !           774:  * @param a The pool to use to define the processes lifetime 
        !           775:  * @param proc The process to register
        !           776:  * @param how How to kill the process, one of:
        !           777:  * <PRE>
        !           778:  *         APR_KILL_NEVER         -- process is never sent any signals
        !           779:  *         APR_KILL_ALWAYS        -- process is sent SIGKILL on apr_pool_t cleanup
        !           780:  *         APR_KILL_AFTER_TIMEOUT -- SIGTERM, wait 3 seconds, SIGKILL
        !           781:  *         APR_JUST_WAIT          -- wait forever for the process to complete
        !           782:  *         APR_KILL_ONLY_ONCE     -- send SIGTERM and then wait
        !           783:  * </PRE>
        !           784:  */
        !           785: APR_DECLARE(void) apr_pool_note_subprocess(apr_pool_t *a, apr_proc_t *proc,
        !           786:                                            apr_kill_conditions_e how);
        !           787: 
        !           788: #if APR_HAS_THREADS 
        !           789: 
        !           790: #if (APR_HAVE_SIGWAIT || APR_HAVE_SIGSUSPEND) && !defined(OS2)
        !           791: 
        !           792: /**
        !           793:  * Setup the process for a single thread to be used for all signal handling.
        !           794:  * @warning This must be called before any threads are created
        !           795:  */
        !           796: APR_DECLARE(apr_status_t) apr_setup_signal_thread(void);
        !           797: 
        !           798: /**
        !           799:  * Make the current thread listen for signals.  This thread will loop
        !           800:  * forever, calling a provided function whenever it receives a signal.  That
        !           801:  * functions should return 1 if the signal has been handled, 0 otherwise.
        !           802:  * @param signal_handler The function to call when a signal is received
        !           803:  * apr_status_t apr_signal_thread((int)(*signal_handler)(int signum))
        !           804:  */
        !           805: APR_DECLARE(apr_status_t) apr_signal_thread(int(*signal_handler)(int signum));
        !           806: 
        !           807: #endif /* (APR_HAVE_SIGWAIT || APR_HAVE_SIGSUSPEND) && !defined(OS2) */
        !           808: 
        !           809: /**
        !           810:  * Get the child-pool used by the thread from the thread info.
        !           811:  * @return apr_pool_t the pool
        !           812:  */
        !           813: APR_POOL_DECLARE_ACCESSOR(thread);
        !           814: 
        !           815: #endif /* APR_HAS_THREADS */
        !           816: 
        !           817: /** @} */
        !           818: 
        !           819: #ifdef __cplusplus
        !           820: }
        !           821: #endif
        !           822: 
        !           823: #endif  /* ! APR_THREAD_PROC_H */
        !           824: 

E-mail: