We have thread-safe hashes in php5; browscap should probably
use one of those there.  If you want to roll your own protection,
take a look at tsrm_mutex_lock() and tsrm_mutex_unlock() and how
they are used in ext/yaz.

--Wez.

----- Original Message ----- 
From: "Uwe Schindler" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]>
Sent: Wednesday, December 03, 2003 5:06 PM
Subject: [PHP-DEV] browscap and nesting level too deep (bug #25916)


> Today I got the error from bug #25916 several times on our webserver.
> Looking through the code I found out the following:
> * It depends NOT on the fact if there is a parameter to get_browser() or
not
> * It happens sometimes when server is very heavy loaded, the homepage of
> the domain uses the get_browser() function and is the most visited page.
>
> So it must be a multithreading issue (NSAPI is a multithreading
webserver).
> And I have an idea:
> Line 257 uses:
>          zend_hash_apply_with_arguments(&browser_hash, (apply_func_args_t)
> browser_reg_compare, 2, lookup_browser_name, &found_browser_entry);
>
> This is the only function in this context in zend_hash.c which uses the
> Recursion protection with
> #define
> HASH_PROTECT_RECURSION(ht)
> \
>          if ((ht)->bApplyProtection)
> {
> \
>                  if ((ht)->nApplyCount++ >= 3)
> {
> \
>                          zend_error(E_ERROR, "Nesting level too deep -
> recursive dependency?");          \
>                  }
> \
>          }
>
> The browser hashtable is a global variable in browscap.c and can be used
by
> more than one call to get_browser() even at the same time. So if one
> zend_hash_apply_with_arguments() locks the hashtable and a second and
third
> thread tries to do that you will get the error, because
(ht)->nApplyCount++
> raises and raises...
>
> This evening I will try to put a mutex at the beginning of get_browser to
> prevent more threads running at the same time there. But as I see this,
> this zend_hash_apply function is used very often could there be other
> effects if a global variable is a hashtable?
>
> Only one question: Is there a special PHP way to use mutexes? I am not
> familar in Zend programming (I do only SAPI...)

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to