[Kamailio-Devel] Conditional lock_get()

Henning Westerholt henning.westerholt at 1und1.de
Fri Jan 9 19:22:28 CET 2009


On Friday 09 January 2009, Iñaki Baz Castillo wrote:
> [..]
> Anyway, if I get the desired behaviour it could occur that a process is
> reading the PCRE (so without "lock_get()") and at the same time the MI
> function modifies it, which could cause a segmentation fault.
>
> Any suggestion? Perhaps I should use "lock_get()" in each read access? It's
> the simplest solution, but what about performance?

Hi Iñaki,

using the lock for every read access will work, and normally you should not   
notice any performance problem. This is used in many modules, for example in 
the userblacklist.c, check_blacklist() function.

If you don't want this its gets a little bit more complicated. For example in 
the cr module we use a get_data() function, which provides access to the data 
and is protected from a lock. This function increment a reference counter, 
which is checked from the reload_route_data() function that is called from 
the FIFO cmd. After each read access the counter is decremented again, which 
is again protected by the lock. The FIFO cmd allocates some new memory when 
new data is reloaded, and swaps this with the old pointer when possible. It 
also waits a bit if the data is accessed at the moment. Take a look at the 
trunk, cr_data.c file for the code.

Perhaps this help you to get an idea. :-) Cheers,

Henning



More information about the Devel mailing list