Manage struct sigacts refcnt with atomics instead of a mutex.

MFC after:	1 week
This commit is contained in:
Mateusz Guzik 2014-07-14 21:12:59 +00:00
parent 0f822edead
commit c959c23740
2 changed files with 8 additions and 11 deletions

View File

@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
#include <sys/refcount.h>
#include <sys/namei.h>
#include <sys/proc.h>
#include <sys/procdesc.h>
@ -3422,21 +3423,17 @@ void
sigacts_free(struct sigacts *ps)
{
mtx_lock(&ps->ps_mtx);
ps->ps_refcnt--;
if (ps->ps_refcnt == 0) {
mtx_destroy(&ps->ps_mtx);
free(ps, M_SUBPROC);
} else
mtx_unlock(&ps->ps_mtx);
if (refcount_release(&ps->ps_refcnt) == 0)
return;
mtx_destroy(&ps->ps_mtx);
free(ps, M_SUBPROC);
}
struct sigacts *
sigacts_hold(struct sigacts *ps)
{
mtx_lock(&ps->ps_mtx);
ps->ps_refcnt++;
mtx_unlock(&ps->ps_mtx);
refcount_acquire(&ps->ps_refcnt);
return (ps);
}

View File

@ -63,7 +63,7 @@ struct sigacts {
sigset_t ps_osigset; /* Signals using <= 3.x osigset_t. */
sigset_t ps_usertramp; /* SunOS compat; libc sigtramp. XXX */
int ps_flag;
int ps_refcnt;
u_int ps_refcnt;
struct mtx ps_mtx;
};