Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: ModPerl: Dev

about removing the last hash lookup in the interp management code

 

 

ModPerl dev RSS feed   Index | Next | Previous | View Threaded


torsten.foertsch at gmx

Nov 14, 2007, 8:34 AM

Post #1 of 1 (869 views)
Permalink
about removing the last hash lookup in the interp management code

Hi Philippe,

in the threading branch this line and the corresponding get in
modperl_interp_pool_select() are the last occurrences of hash lookups in the
interp management.

(void)apr_pool_userdata_set((void *)r, "MODPERL_R", NULL, r->pool);

I am thinking of removing it. But it requires a extension to the request pool
and changes to the httpd.

The idea is to introduce typed pools with extensions. Something like

int type = apr_pool_type_register(void);

int ext = apr_pool_extension_register(int type, size_t size);

apr_pool_t *pool = apr_pool_create_typed_pool(int type);

void *ptr = apr_pool_get_extension(apr_pool_t *pool, int ext);

A call to apr_pool_type_register adds an element to some internal
apr_array_header_t and returns the index of the new element.

apr_pool_extension_register gets this index (or pool type) and increments said
array element by "size" rounded up to a proper alignment and returns the
value of the array element before the increment.

These 2 functions are to be called during initialization.

Then at runtime when a typed pool is needed pool structure is allocated plus
at the end of the pool enough space to hold all extensions. To access a
registered extension one calls apr_pool_get_extension which returns a pointer
to the amount of space registered during initialization.

In the httpd this would mean at init time:

extern int req_pool_type;
extern int conn_pool_type;
...
static int req_pool_type = apr_pool_type_register();
static int conn_pool_type = apr_pool_type_register();
...

Then the req pool creation is converted to

req_pool = apr_pool_create_typed_pool( req_pool_type )

In mod_perl this could look like:

INIT:

static my_req_pool_ext = apr_pool_extension_register(req_pool_type,
sizeof(void*));

RUNTIME:

void *ptr = apr_pool_get_extension(pool, my_req_pool_ext);
*ptr = (void *)r; /* instead of apr_pool_userdata_set */

I hope it is clear what I mean. I think not only mod_perl can benefit these
pool extensions. Apache would have to export the main pool types like
req_pool_type and conn_pool_type. Modules can add their own pool types.

Does that make sense? What are the odds on getting it into apr and apache?

Torsten

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe [at] perl
For additional commands, e-mail: dev-help [at] perl

ModPerl dev RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.