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 _______________________________________________ Kamailio (OpenSER) - Devel mailing list [email protected] http://lists.kamailio.org/cgi-bin/mailman/listinfo/devel
