|
@@ -115,23 +115,19 @@ static int add_cgroup(struct perf_evlist *evlist, char *str)
|
|
goto found;
|
|
goto found;
|
|
n++;
|
|
n++;
|
|
}
|
|
}
|
|
- if (cgrp->refcnt == 0)
|
|
|
|
|
|
+ if (atomic_read(&cgrp->refcnt) == 0)
|
|
free(cgrp);
|
|
free(cgrp);
|
|
|
|
|
|
return -1;
|
|
return -1;
|
|
found:
|
|
found:
|
|
- cgrp->refcnt++;
|
|
|
|
|
|
+ atomic_inc(&cgrp->refcnt);
|
|
counter->cgrp = cgrp;
|
|
counter->cgrp = cgrp;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
void close_cgroup(struct cgroup_sel *cgrp)
|
|
void close_cgroup(struct cgroup_sel *cgrp)
|
|
{
|
|
{
|
|
- if (!cgrp)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- /* XXX: not reentrant */
|
|
|
|
- if (--cgrp->refcnt == 0) {
|
|
|
|
|
|
+ if (cgrp && atomic_dec_and_test(&cgrp->refcnt)) {
|
|
close(cgrp->fd);
|
|
close(cgrp->fd);
|
|
zfree(&cgrp->name);
|
|
zfree(&cgrp->name);
|
|
free(cgrp);
|
|
free(cgrp);
|