trawick 01/06/25 19:05:06 Modified: . configure.in include apr.h.in apr.hw apr_lock.h locks/unix locks.c Log: Add apr_lock_create_np() (Unix only, for now) which allows the caller to specify the mechanism used for the interprocess lock (if any). Revision Changes Path 1.317 +7 -0 apr/configure.in Index: configure.in =================================================================== RCS file: /home/cvs/apr/configure.in,v retrieving revision 1.316 retrieving revision 1.317 diff -u -r1.316 -r1.317 --- configure.in 2001/06/26 00:22:06 1.316 +++ configure.in 2001/06/26 02:04:55 1.317 @@ -974,11 +974,18 @@ ;; esac +if test "$flockser$sysvser$fcntlser$procpthreadser" = "0000"; then + lockcreatenp="0" +else + lockcreatenp="1" +fi + AC_SUBST(flockser) AC_SUBST(sysvser) AC_SUBST(fcntlser) AC_SUBST(procpthreadser) AC_SUBST(pthreadser) +AC_SUBST(lockcreatenp) AC_MSG_CHECKING(if interprocess lock affects threads) if test "x$apr_process_lock_is_global" = "xyes"; then 1.84 +2 -0 apr/include/apr.h.in Index: apr.h.in =================================================================== RCS file: /home/cvs/apr/include/apr.h.in,v retrieving revision 1.83 retrieving revision 1.84 diff -u -r1.83 -r1.84 --- apr.h.in 2001/06/09 11:33:07 1.83 +++ apr.h.in 2001/06/26 02:04:58 1.84 @@ -64,6 +64,8 @@ #define APR_USE_PROC_PTHREAD_SERIALIZE @procpthreadser@ #define APR_USE_PTHREAD_SERIALIZE @pthreadser@ +#define APR_HAS_LOCK_CREATE_NP @lockcreatenp@ + #define APR_PROCESS_LOCK_IS_GLOBAL @proclockglobal@ #define APR_USES_ANONYMOUS_SHM @anonymous_shm@ 1.69 +2 -0 apr/include/apr.hw Index: apr.hw =================================================================== RCS file: /home/cvs/apr/include/apr.hw,v retrieving revision 1.68 retrieving revision 1.69 diff -u -r1.68 -r1.69 --- apr.hw 2001/06/06 16:05:05 1.68 +++ apr.hw 2001/06/26 02:04:59 1.69 @@ -157,6 +157,8 @@ #define APR_USE_PROC_PTHREAD_SERIALIZE 0 #define APR_USE_PTHREAD_SERIALIZE 0 +#define APR_HAS_LOCK_CREATE_NP 0 + #define APR_PROCESS_LOCK_IS_GLOBAL 0 #define APR_USES_ANONYMOUS_SHM 0 1.28 +48 -0 apr/include/apr_lock.h Index: apr_lock.h =================================================================== RCS file: /home/cvs/apr/include/apr_lock.h,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- apr_lock.h 2001/06/06 18:11:02 1.27 +++ apr_lock.h 2001/06/26 02:05:00 1.28 @@ -178,6 +178,54 @@ const char *key, apr_status_t (*cleanup)(void *)); +#if APR_HAS_LOCK_CREATE_NP + +typedef enum {APR_LOCK_FCNTL, APR_LOCK_FLOCK, APR_LOCK_SYSVSEM, APR_LOCK_PROC_PTHREAD, + APR_LOCK_DEFAULT} apr_lockmech_e_np; + +/** + * non-portable interface to apr_lock_create() + * + * Create a new instance of a lock structure. This is like apr_lock_create() + * but has some non-portable parameters. This should be used sparingly. + * + * @param lock The newly created lock structure. + * @param type The type of lock to create, one of: + *
+ * APR_MUTEX + * APR_READWRITE + *+ * @param scope The scope of the lock to create, one of: + *
+ * APR_CROSS_PROCESS lock processes from the protected area. + * APR_INTRAPROCESS lock threads from the protected area. + * APR_LOCKALL lock processes and threads from the + * protected area. + *+ * @param mech The mechanism to use for the interprocess lock, if any; one of + *
+ * APR_LOCK_FCNTL + * APR_LOCK_FLOCK + * APR_LOCK_SYSVSEM + * APR_LOCK_PROC_PTHREAD + * APR_LOCK_DEFAULT pick the default mechanism for the platform + *+ * @param fname A file name to use if the lock mechanism requires one. This + * argument should always be provided. The lock code itself will + * determine if it should be used. + * @param pool The pool to operate on. + * @tip APR_CROSS_PROCESS may lock both processes and threads, but it is + * only guaranteed to lock processes. + * @deffunc apr_status_t apr_lock_create(apr_lock_t **lock, apr_locktype_e type, apr_lockscope_e scope, const char *fname, apr_pool_t *pool) + */ +APR_DECLARE(apr_status_t) apr_lock_create_np(apr_lock_t **lock, + apr_locktype_e type, + apr_lockscope_e scope, + apr_lockmech_e_np mech, + const char *fname, + apr_pool_t *pool); +#endif /* APR_HAS_LOCK_CREATE_NP */ + #ifdef __cplusplus } #endif 1.56 +57 -8 apr/locks/unix/locks.c Index: locks.c =================================================================== RCS file: /home/cvs/apr/locks/unix/locks.c,v retrieving revision 1.55 retrieving revision 1.56 diff -u -r1.55 -r1.56 --- locks.c 2001/06/25 20:23:16 1.55 +++ locks.c 2001/06/26 02:05:05 1.56 @@ -126,11 +126,38 @@ }; #endif -static apr_status_t create_lock(apr_lock_t *new, const char *fname) +static apr_status_t choose_method(apr_lock_t *new, apr_lockmech_e_np mech) { - apr_status_t stat; - - if (new->scope != APR_INTRAPROCESS) { + switch (mech) { + case APR_LOCK_FCNTL: +#if APR_HAS_FCNTL_SERIALIZE + new->inter_meth = &apr_unix_fcntl_methods; +#else + return APR_ENOTIMPL; +#endif + break; + case APR_LOCK_FLOCK: +#if APR_HAS_FLOCK_SERIALIZE + new->inter_meth = &apr_unix_flock_methods; +#else + return APR_ENOTIMPL; +#endif + break; + case APR_LOCK_SYSVSEM: +#if APR_HAS_SYSVSEM_SERIALIZE + new->inter_meth = &apr_unix_sysv_methods; +#else + return APR_ENOTIMPL; +#endif + break; + case APR_LOCK_PROC_PTHREAD: +#if APR_HAS_PROC_PTHREAD_SERIALIZE + new->inter_meth = &apr_unix_proc_pthread_methods; +#else + return APR_ENOTIMPL; +#endif + break; + case APR_LOCK_DEFAULT: #if APR_USE_FLOCK_SERIALIZE new->inter_meth = &apr_unix_flock_methods; #elif APR_USE_SYSVSEM_SERIALIZE @@ -142,8 +169,23 @@ #else return APR_ENOTIMPL; #endif + break; + default: + return APR_ENOTIMPL; } + return APR_SUCCESS; +} + +static apr_status_t create_lock(apr_lock_t *new, apr_lockmech_e_np mech, const char *fname) +{ + apr_status_t stat; + if (new->scope != APR_INTRAPROCESS) { + if ((stat = choose_method(new, mech)) != APR_SUCCESS) { + return stat; + } + } + if (new->scope != APR_CROSS_PROCESS) { #if APR_HAS_THREADS if (new->type == APR_READWRITE) { @@ -189,9 +231,9 @@ return APR_SUCCESS; } -apr_status_t apr_lock_create(apr_lock_t **lock, apr_locktype_e type, - apr_lockscope_e scope, const char *fname, - apr_pool_t *pool) +apr_status_t apr_lock_create_np(apr_lock_t **lock, apr_locktype_e type, + apr_lockscope_e scope, apr_lockmech_e_np mech, + const char *fname, apr_pool_t *pool) { apr_lock_t *new; apr_status_t stat; @@ -202,11 +244,18 @@ new->type = type; new->scope = scope; - if ((stat = create_lock(new, fname)) != APR_SUCCESS) + if ((stat = create_lock(new, mech, fname)) != APR_SUCCESS) return stat; *lock = new; return APR_SUCCESS; +} + +apr_status_t apr_lock_create(apr_lock_t **lock, apr_locktype_e type, + apr_lockscope_e scope, const char *fname, + apr_pool_t *pool) +{ + return apr_lock_create_np(lock, type, scope, APR_LOCK_DEFAULT, fname, pool); } apr_status_t apr_lock_acquire(apr_lock_t *lock)