Hi Elison.
2009/3/21 Elison Smith elison.sm...@gmail.com:
I am using shared memory to share some data between my module instances in
Apache child processes, and apr_global_mutex_t to achieve
mutually-exclusive reads and writes.
In a post_config_hook, I create the mutex using apr_global_mutex_create()
and then reopen it inside each child process by calling
apr_global_mutex_child_init() inside a child_init hook.
However, when I try to grab the lock inside a child, the operation fails
with a permission denied. For the lock file, I am using /tmp/tmp which
is a file writeable by all.
Any clues?
the platform on which your module runs is unix?
There should be such a permission problem if the parent process
starts as root while child processes as user/group that you
specify in apache configuration file.
In that case, use unixd_set_global_mutex_perms in child_init hook,
after apr_global_mutex_create just like this below:
** code snippet from mod_rewrite.c
-
#ifdef AP_NEED_SET_MUTEX_PERMS
#include unixd.h
#endif
...
/* create the lockfile */
rc = apr_global_mutex_create(rewrite_mapr_lock_acquire, lockname,
APR_LOCK_DEFAULT, p);
if (rc != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_CRIT, rc, s,
mod_rewrite: Parent could not create RewriteLock
file %s, lockname);
return rc;
}
#ifdef AP_NEED_SET_MUTEX_PERMS
rc = unixd_set_global_mutex_perms(rewrite_mapr_lock_acquire);
if (rc != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_CRIT, rc, s,
mod_rewrite: Parent could not set permissions
on RewriteLock; check User and Group directives);
return rc;
}
#endif
-
you should also see unixd.h (/path-to-apache/include/unixd.h)
-
/**
* One of the functions to set mutex permissions should be called in
* the parent process on platforms that switch identity when the
* server is started as root.
* If the child init logic is performed before switching identity
* (e.g., MPM setup for an accept mutex), it should only be called
* for SysV semaphores. Otherwise, it is safe to call it for all
* mutex types.
*/
AP_DECLARE(apr_status_t) unixd_set_proc_mutex_perms(apr_proc_mutex_t *pmutex);
AP_DECLARE(apr_status_t)
unixd_set_global_mutex_perms(apr_global_mutex_t *gmutex);
AP_DECLARE(apr_status_t) unixd_accept(void **accepted, ap_listen_rec
*lr, apr_pool_t *ptrans);
-
good luck!
Yoichi
--
--
Yoichi Kawasaki yokaw...@gmail.com