Am 12.10.2016 um 01:59 schrieb Stefan Beller:
+void git_attr_check_initl(struct git_attr_check **check_,
+                         const char *one, ...)
 {
-       struct git_attr_check *check;
        int cnt;
        va_list params;
        const char *param;
+       struct git_attr_check *check;
+
+       if (*check_)
+               return;
+
+       attr_lock();
+       if (*check_) {
+               attr_unlock();
+               return;
+       }
...
        check = xcalloc(1,
-                       sizeof(*check) + cnt * sizeof(*(check->check)));
+                       sizeof(*check) + cnt * sizeof(*(check->attr)));
...
+       *check_ = check;
+       attr_unlock();

Sigh. DCLP, the Double Checked Locking Pattern. These days, it should be common knowledge among professionals that this naïve version _does_not_work_ [1]!

I suggest you go without it, then measure, and only *then* optimize if it is a bottleneck. Did I read "we do not expect much contention" somewhere?

[1] http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf C++ centric, but applies to C just as well

-- Hannes

Reply via email to