4 messages in ru.sysoev.nginxRe: [DEV] nginx ngx_hash_t usage, and...
FromSent OnAttachments
Brice FigureauSep 24, 2007 11:13 am 
Igor SysoevSep 24, 2007 12:07 pm 
Brice FigureauSep 25, 2007 1:32 am 
Igor SysoevSep 26, 2007 2:07 am 
Actions with this message:
Paste this link in email or IM:
Paste this link in email or IM:
Atom feed for this thread
Paste this URL into your reader:
Subject:Re: [DEV] nginx ngx_hash_t usage, and other questions...Actions...
From:Igor Sysoev (is-G@public.gmane.org)
Date:Sep 26, 2007 2:07:53 am
List:ru.sysoev.nginx

On Tue, Sep 25, 2007 at 10:33:12AM +0200, Brice Figureau wrote:

For dynamic data I use rbtree.

OK, it seems that what you are doing in the limit zone module is almost what I planned to do. I think I'll study this code in more details.

You are placing the rbtree in this module in a shm segment. Is it to share it between the possibly multiple workers ?

Yes.

I was wondering how I could share my global data structure between the different workers...

See limit zone module.

A zone in nginx is shared memory segment created by ngx_shared_memory_add(). A zone has name and is inherited between reconfigurations if its size is not changed. nginx has simple slab allocator to alloc/free memory in zone.

I also have a few more general or basic questions:

1) There are a lot of ngx_str_t used, but all the ngx_string.c functions are using u_char* . Does it mean the strings are always null terminated and the ngx_str_t len parameter is used for something else ? So to use ngx_strcmp with 2 ngx_str_t, I just have to call it with the value?

No, ngx_str_t may be null terminated (and len does count null in the case), but in general it is not null terminated.

OK, so how do compare strings for instance ? ngx_strcmp is acting on null terminated strings, but since I don't know beforehand if the string is terminated or not... Maybe I have to use ngx_memn2cmp ?

No. use ngx_strNcmp(). The usual pattern to compare two ngx_str_t's is:

if (s1->len == s2->len && ngx_strncmp(s1->data, s2->data, s1->len) == 0) { ... }

Sometime, if I sure that both ngx_str_t are null terminated strings, then I use ngx_strcmp() in this pattern. But I always test the lengths before.

2) Can I register an handler or a phase handler that will be triggered at the end of a request (and if yes how) ? This is to do the cleanup in my hash table containing the uploading requests.

Use ngx_pool_cleanup_add(r->pool, size).

OK, then the handler will be called when the pool is deallocated, is that right? And the request pool is deallocated when the request is over.

Yes.

I don't have to add any memory to the request pool in my case; is it possible to pass 0 as the size ?

Yes. Size is intended to allocate some additional memory for callback context.