On Fri, 2007-03-16 at 10:57 -0700, David Moffatt wrote:
> char *
> get_leading_digits(const char *str)
> {
> static GRegex *regex = NULL;
> char *result = NULL;
>
> if (!regex)
> regex = g_regex_new("^\\d+", 0, 0, NULL);
>
> if (g_regex_match(str, 0))
> result = g_regex_fetch(regex, 0);
>
> return result;
> }
>
> That code bothers me a fair bit; not because so much because it's
> not thread safe, but because it exhibits a pattern that is *inherently*
> not thread safe or re-entrant....
>
> Actually if you look at it carefully you realize it is thread safe and
> depending on what you call the pattern it too is thread safe. I think
> this is a great way of doing things. I work in embedded so we are very
> sensitive to things like library global constructor creating regex.
> That is overhead you pay whether or not you use the function. That is
> also overhead that you pay at launch time which for us is a big deal.
OK, maybe I'm just not looking at it right, but to me, it's not
thread safe two ways:
A) The initializaton of the regex isn't thread safe. If multiple
threads race to construct the regex, there will be a memory
leak.
B) GRegex has internal state that is modified by g_regex_match()
None of the examples I shown used global constructors.
- Owen
Attachment:
signature.asc
Description: This is a digitally signed message part