Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/sysv_msg.c
Show First 20 Lines • Show All 611 Lines • ▼ Show 20 Lines | for (msqid = 0; msqid < msginfo.msgmni; msqid++) { | ||||
break; | break; | ||||
} | } | ||||
if (msqid == msginfo.msgmni) { | if (msqid == msginfo.msgmni) { | ||||
DPRINTF(("no more msqid_ds's available\n")); | DPRINTF(("no more msqid_ds's available\n")); | ||||
error = ENOSPC; | error = ENOSPC; | ||||
goto done2; | goto done2; | ||||
} | } | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (racct_enable) { | |||||
PROC_LOCK(td->td_proc); | PROC_LOCK(td->td_proc); | ||||
error = racct_add(td->td_proc, RACCT_NMSGQ, 1); | error = racct_add(td->td_proc, RACCT_NMSGQ, 1); | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
if (error != 0) { | if (error != 0) { | ||||
error = ENOSPC; | error = ENOSPC; | ||||
goto done2; | goto done2; | ||||
} | } | ||||
} | |||||
#endif | #endif | ||||
DPRINTF(("msqid %d is available\n", msqid)); | DPRINTF(("msqid %d is available\n", msqid)); | ||||
msqkptr->u.msg_perm.key = key; | msqkptr->u.msg_perm.key = key; | ||||
msqkptr->u.msg_perm.cuid = cred->cr_uid; | msqkptr->u.msg_perm.cuid = cred->cr_uid; | ||||
msqkptr->u.msg_perm.uid = cred->cr_uid; | msqkptr->u.msg_perm.uid = cred->cr_uid; | ||||
msqkptr->u.msg_perm.cgid = cred->cr_gid; | msqkptr->u.msg_perm.cgid = cred->cr_gid; | ||||
msqkptr->u.msg_perm.gid = cred->cr_gid; | msqkptr->u.msg_perm.gid = cred->cr_gid; | ||||
msqkptr->u.msg_perm.mode = (msgflg & 0777); | msqkptr->u.msg_perm.mode = (msgflg & 0777); | ||||
▲ Show 20 Lines • Show All 84 Lines • ▼ Show 20 Lines | |||||
#ifdef MAC | #ifdef MAC | ||||
error = mac_sysvmsq_check_msqsnd(td->td_ucred, msqkptr); | error = mac_sysvmsq_check_msqsnd(td->td_ucred, msqkptr); | ||||
if (error != 0) | if (error != 0) | ||||
goto done2; | goto done2; | ||||
#endif | #endif | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (racct_enable) { | |||||
PROC_LOCK(td->td_proc); | PROC_LOCK(td->td_proc); | ||||
if (racct_add(td->td_proc, RACCT_MSGQQUEUED, 1)) { | if (racct_add(td->td_proc, RACCT_MSGQQUEUED, 1)) { | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
error = EAGAIN; | error = EAGAIN; | ||||
goto done2; | goto done2; | ||||
} | } | ||||
saved_msgsz = msgsz; | saved_msgsz = msgsz; | ||||
if (racct_add(td->td_proc, RACCT_MSGQSIZE, msgsz)) { | if (racct_add(td->td_proc, RACCT_MSGQSIZE, msgsz)) { | ||||
racct_sub(td->td_proc, RACCT_MSGQQUEUED, 1); | racct_sub(td->td_proc, RACCT_MSGQQUEUED, 1); | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
error = EAGAIN; | error = EAGAIN; | ||||
goto done2; | goto done2; | ||||
} | } | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
} | |||||
#endif | #endif | ||||
segs_needed = (msgsz + msginfo.msgssz - 1) / msginfo.msgssz; | segs_needed = (msgsz + msginfo.msgssz - 1) / msginfo.msgssz; | ||||
DPRINTF(("msgsz=%zu, msgssz=%d, segs_needed=%d\n", msgsz, | DPRINTF(("msgsz=%zu, msgssz=%d, segs_needed=%d\n", msgsz, | ||||
msginfo.msgssz, segs_needed)); | msginfo.msgssz, segs_needed)); | ||||
for (;;) { | for (;;) { | ||||
int need_more_resources = 0; | int need_more_resources = 0; | ||||
▲ Show 20 Lines • Show All 240 Lines • ▼ Show 20 Lines | #endif | ||||
msqkptr->u.msg_qnum++; | msqkptr->u.msg_qnum++; | ||||
msqkptr->u.msg_lspid = td->td_proc->p_pid; | msqkptr->u.msg_lspid = td->td_proc->p_pid; | ||||
msqkptr->u.msg_stime = time_second; | msqkptr->u.msg_stime = time_second; | ||||
wakeup(msqkptr); | wakeup(msqkptr); | ||||
td->td_retval[0] = 0; | td->td_retval[0] = 0; | ||||
done3: | done3: | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (error != 0) { | if (racct_enable && error != 0) { | ||||
PROC_LOCK(td->td_proc); | PROC_LOCK(td->td_proc); | ||||
racct_sub(td->td_proc, RACCT_MSGQQUEUED, 1); | racct_sub(td->td_proc, RACCT_MSGQQUEUED, 1); | ||||
racct_sub(td->td_proc, RACCT_MSGQSIZE, saved_msgsz); | racct_sub(td->td_proc, RACCT_MSGQSIZE, saved_msgsz); | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
} | } | ||||
#endif | #endif | ||||
done2: | done2: | ||||
mtx_unlock(&msq_mtx); | mtx_unlock(&msq_mtx); | ||||
▲ Show 20 Lines • Show All 581 Lines • Show Last 20 Lines |