Manage struct sigacts refcnt with atomics instead of a mutex.
MFC after: 1 week
This commit is contained in:
parent
0f822edead
commit
c959c23740
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user