[users@httpd] Shared memory difficulties

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dear Apache Experts,

Has anyone any experience with Apache modules and shared memory? I am having difficulty attaching to a shared memory block from within a child process.

Basically, I'm creating a shared memory region from the post_config hook and then attaching to it in each child from the child_init hook. The apr_shm_create call succeeds, but the apr_shm_attach calls fail with "No such file or directory". This is Apache 2.0 on Linux.

I would be happy to use anonymous shared memory, but I don't see how to do it: if I pass NULL as the filename to apr_shm_create, what do I pass to apr_shm_attach to identify the region to attach to? Since I don't understand that I'm using named regions with /tmp/foo as the filename.

This is my first attempt at writing an Apache module so my mistake is probably something basic.


Here is my test program:

#include "httpd.h"
#include "http_config.h"
#include "http_core.h"
#include "http_log.h"
#include "http_main.h"
#include "http_protocol.h"
#include "http_request.h"
#include "util_script.h"
#include "http_connection.h"
#include "apr_strings.h"

#include <unistd.h>


module AP_MODULE_DECLARE_DATA shm_test;


static int already_init(server_rec* s)
{
  void* data;
  const char* userdata_key="shm_test_init_flag";

  apr_pool_userdata_get(&data, userdata_key, s->process->pool);
  if (!data) {
    apr_pool_userdata_set((const void *) 1, userdata_key,
			  apr_pool_cleanup_null, s->process->pool);
  }
  return !!data;
}


apr_shm_t* shm_test_shm;


static int shm_test_post_config(apr_pool_t *pconf, apr_pool_t *plog,
			       apr_pool_t *ptemp, server_rec *s)
{
  if (already_init(s)) {
    return OK;
  }

  int sz = 1024;

  int rc = apr_shm_create(&shm_test_shm, sz, "/tmp/foo", pconf);
  if (rc != APR_SUCCESS) {
    ap_log_error(APLOG_MARK, APLOG_ERR, rc, s,
		 "Failed to create anonymous shared memory segment");
    return HTTP_INTERNAL_SERVER_ERROR;
  }

  return OK;
}


static void shm_test_child_init(apr_pool_t *p, server_rec *s)
{
  int rc = apr_shm_attach(&shm_test_shm, "/tmp/foo", p);
  if (rc != APR_SUCCESS) {
    ap_log_error(APLOG_MARK, APLOG_ERR, rc, s,
"Failed to attach to anonymous shared memory segment in process %d",getpid());
    return;
  }
}


static void shm_test_register_hooks(apr_pool_t *p)
{
  ap_hook_post_config(shm_test_post_config, NULL, NULL, APR_HOOK_MIDDLE);
  ap_hook_child_init(shm_test_child_init, NULL, NULL, APR_HOOK_MIDDLE);
}



module AP_MODULE_DECLARE_DATA shm_test = {
  STANDARD20_MODULE_STUFF,
  NULL, /* per-directory config creator */
  NULL, /* dir config merger */
  NULL, /* server config creator */
  NULL, /* server config merger */
  NULL, /* command table */
  shm_test_register_hooks,  /* set up other request processing hooks */
};


I compile and install this using apxs:

$ apxs2 -c -Wc,-std=c99 shm_test.c
/usr/bin/libtool --silent --mode=compile gcc -prefer-pic -pipe -I/usr/include/xmltok -I/usr/include/openssl -Wall -O2 -DAP_HAVE_DESIGNATED_INITIALIZER -DLINUX=2 -D_REENTRANT -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -D_SVID_SOURCE -D_GNU_SOURCE -pipe -I/usr/include/xmltok -I/usr/include/openssl -Wall -O2 -pthread -I/usr/include/apache2 -I/usr/include/apr-0 -I/usr/include/apr-0 -I/usr/include -std=c99 -c -o shm_test.lo shm_test.c && touch shm_test.slo /usr/bin/libtool --silent --mode=link gcc -o shm_test.la -rpath /usr/lib/apache2/modules -module -avoid-version shm_test.lo

# apxs2 -n shm_test -i shm_test.la
[snip]

I have this in httpd.conf:

LoadModule shm_test /usr/lib/apache2/modules/shm_test.so


When I restart Apache, I get this:

[Wed Mar 23 18:20:37 2005] [error] (2)No such file or directory: Failed to attach to anonymous shared memory segment in process 28548 [Wed Mar 23 18:20:37 2005] [error] (2)No such file or directory: Failed to attach to anonymous shared memory segment in process 28549 [Wed Mar 23 18:20:37 2005] [error] (2)No such file or directory: Failed to attach to anonymous shared memory segment in process 28550 [Wed Mar 23 18:20:37 2005] [error] (2)No such file or directory: Failed to attach to anonymous shared memory segment in process 28551 [Wed Mar 23 18:20:37 2005] [error] (2)No such file or directory: Failed to attach to anonymous shared memory segment in process 28552


Any suggestions, debugging hints, or pointers to documentation or example code would be much appreciated.

Thanks,

--Phil.


---------------------------------------------------------------------
The official User-To-User support forum of the Apache HTTP Server Project.
See <URL:http://httpd.apache.org/userslist.html> for more info.
To unsubscribe, e-mail: users-unsubscribe@xxxxxxxxxxxxxxxx
  "   from the digest: users-digest-unsubscribe@xxxxxxxxxxxxxxxx
For additional commands, e-mail: users-help@xxxxxxxxxxxxxxxx



[Index of Archives]     [Open SSH Users]     [Linux ACPI]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Squid]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux