summaryrefslogtreecommitdiffstats
path: root/sys/kern/sysv_sem.c
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>2001-09-12 08:38:13 +0000
committerjulian <julian@FreeBSD.org>2001-09-12 08:38:13 +0000
commit5596676e6c6c1e81e899cd0531f9b1c28a292669 (patch)
treeb1a19fcdf05759281fab0d89efb13f0fdf42102e /sys/kern/sysv_sem.c
parent83e00d4274950d2b531c24692cd123538ffbddb9 (diff)
downloadFreeBSD-src-5596676e6c6c1e81e899cd0531f9b1c28a292669.zip
FreeBSD-src-5596676e6c6c1e81e899cd0531f9b1c28a292669.tar.gz
KSE Milestone 2
Note ALL MODULES MUST BE RECOMPILED make the kernel aware that there are smaller units of scheduling than the process. (but only allow one thread per process at this time). This is functionally equivalent to teh previousl -current except that there is a thread associated with each process. Sorry john! (your next MFC will be a doosie!) Reviewed by: peter@freebsd.org, dillon@freebsd.org X-MFC after: ha ha ha ha
Diffstat (limited to 'sys/kern/sysv_sem.c')
-rw-r--r--sys/kern/sysv_sem.c94
1 files changed, 45 insertions, 49 deletions
diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c
index 0b9a0b6..b8bf079 100644
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -34,15 +34,15 @@ static int sysctl_sema __P((SYSCTL_HANDLER_ARGS));
#ifndef _SYS_SYSPROTO_H_
struct __semctl_args;
-int __semctl __P((struct proc *p, struct __semctl_args *uap));
+int __semctl __P((struct thread *td, struct __semctl_args *uap));
struct semget_args;
-int semget __P((struct proc *p, struct semget_args *uap));
+int semget __P((struct thread *td, struct semget_args *uap));
struct semop_args;
-int semop __P((struct proc *p, struct semop_args *uap));
+int semop __P((struct thread *td, struct semop_args *uap));
#endif
-static struct sem_undo *semu_alloc __P((struct proc *p));
-static int semundo_adjust __P((struct proc *p, struct sem_undo **supptr,
+static struct sem_undo *semu_alloc __P((struct thread *td));
+static int semundo_adjust __P((struct thread *td, struct sem_undo **supptr,
int semid, int semnum, int adjval));
static void semundo_clear __P((int semid, int semnum));
@@ -250,8 +250,8 @@ MODULE_VERSION(sysvsem, 1);
* MPSAFE
*/
int
-semsys(p, uap)
- struct proc *p;
+semsys(td, uap)
+ struct thread *td;
/* XXX actually varargs. */
struct semsys_args /* {
u_int which;
@@ -264,17 +264,15 @@ semsys(p, uap)
int error;
mtx_lock(&Giant);
-
- if (!jail_sysvipc_allowed && jailed(p->p_ucred)) {
+ if (!jail_sysvipc_allowed && jailed(td->td_proc->p_ucred)) {
error = ENOSYS;
goto done2;
}
-
if (uap->which >= sizeof(semcalls)/sizeof(semcalls[0])) {
error = EINVAL;
goto done2;
}
- error = (*semcalls[uap->which])(p, &uap->a2);
+ error = (*semcalls[uap->which])(td, &uap->a2);
done2:
mtx_unlock(&Giant);
return (error);
@@ -286,8 +284,8 @@ done2:
*/
static struct sem_undo *
-semu_alloc(p)
- struct proc *p;
+semu_alloc(td)
+ struct thread *td;
{
register int i;
register struct sem_undo *suptr;
@@ -312,7 +310,7 @@ semu_alloc(p)
suptr->un_next = semu_list;
semu_list = suptr;
suptr->un_cnt = 0;
- suptr->un_proc = p;
+ suptr->un_proc = td->td_proc;
return(suptr);
}
}
@@ -356,12 +354,13 @@ semu_alloc(p)
*/
static int
-semundo_adjust(p, supptr, semid, semnum, adjval)
- register struct proc *p;
+semundo_adjust(td, supptr, semid, semnum, adjval)
+ register struct thread *td;
struct sem_undo **supptr;
int semid, semnum;
int adjval;
{
+ struct proc *p = td->td_proc;
register struct sem_undo *suptr;
register struct undo *sunptr;
int i;
@@ -381,7 +380,7 @@ semundo_adjust(p, supptr, semid, semnum, adjval)
if (suptr == NULL) {
if (adjval == 0)
return(0);
- suptr = semu_alloc(p);
+ suptr = semu_alloc(td);
if (suptr == NULL)
return(ENOSPC);
*supptr = suptr;
@@ -466,8 +465,8 @@ struct __semctl_args {
* MPSAFE
*/
int
-__semctl(p, uap)
- struct proc *p;
+__semctl(td, uap)
+ struct thread *td;
register struct __semctl_args *uap;
{
int semid = uap->semid;
@@ -475,7 +474,7 @@ __semctl(p, uap)
int cmd = uap->cmd;
union semun *arg = uap->arg;
union semun real_arg;
- struct ucred *cred = p->p_ucred;
+ struct ucred *cred = td->td_proc->p_ucred;
int i, rval, error;
struct semid_ds sbuf;
register struct semid_ds *semaptr;
@@ -484,8 +483,7 @@ __semctl(p, uap)
printf("call to semctl(%d, %d, %d, 0x%x)\n", semid, semnum, cmd, arg);
#endif
mtx_lock(&Giant);
-
- if (!jail_sysvipc_allowed && jailed(p->p_ucred)) {
+ if (!jail_sysvipc_allowed && jailed(td->td_proc->p_ucred)) {
error = ENOSYS;
goto done2;
}
@@ -508,7 +506,7 @@ __semctl(p, uap)
switch (cmd) {
case IPC_RMID:
- if ((error = ipcperm(p, &semaptr->sem_perm, IPC_M)))
+ if ((error = ipcperm(td, &semaptr->sem_perm, IPC_M)))
goto done2;
semaptr->sem_perm.cuid = cred->cr_uid;
semaptr->sem_perm.uid = cred->cr_uid;
@@ -526,7 +524,7 @@ __semctl(p, uap)
break;
case IPC_SET:
- if ((error = ipcperm(p, &semaptr->sem_perm, IPC_M)))
+ if ((error = ipcperm(td, &semaptr->sem_perm, IPC_M)))
goto done2;
if ((error = copyin(arg, &real_arg, sizeof(real_arg))) != 0)
goto done2;
@@ -542,7 +540,7 @@ __semctl(p, uap)
break;
case IPC_STAT:
- if ((error = ipcperm(p, &semaptr->sem_perm, IPC_R)))
+ if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R)))
goto done2;
if ((error = copyin(arg, &real_arg, sizeof(real_arg))) != 0)
goto done2;
@@ -551,7 +549,7 @@ __semctl(p, uap)
break;
case GETNCNT:
- if ((error = ipcperm(p, &semaptr->sem_perm, IPC_R)))
+ if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R)))
goto done2;
if (semnum < 0 || semnum >= semaptr->sem_nsems) {
error = EINVAL;
@@ -561,7 +559,7 @@ __semctl(p, uap)
break;
case GETPID:
- if ((error = ipcperm(p, &semaptr->sem_perm, IPC_R)))
+ if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R)))
goto done2;
if (semnum < 0 || semnum >= semaptr->sem_nsems) {
error = EINVAL;
@@ -571,7 +569,7 @@ __semctl(p, uap)
break;
case GETVAL:
- if ((error = ipcperm(p, &semaptr->sem_perm, IPC_R)))
+ if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R)))
goto done2;
if (semnum < 0 || semnum >= semaptr->sem_nsems) {
error = EINVAL;
@@ -581,7 +579,7 @@ __semctl(p, uap)
break;
case GETALL:
- if ((error = ipcperm(p, &semaptr->sem_perm, IPC_R)))
+ if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R)))
goto done2;
if ((error = copyin(arg, &real_arg, sizeof(real_arg))) != 0)
goto done2;
@@ -594,7 +592,7 @@ __semctl(p, uap)
break;
case GETZCNT:
- if ((error = ipcperm(p, &semaptr->sem_perm, IPC_R)))
+ if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R)))
goto done2;
if (semnum < 0 || semnum >= semaptr->sem_nsems) {
error = EINVAL;
@@ -604,7 +602,7 @@ __semctl(p, uap)
break;
case SETVAL:
- if ((error = ipcperm(p, &semaptr->sem_perm, IPC_W)))
+ if ((error = ipcperm(td, &semaptr->sem_perm, IPC_W)))
goto done2;
if (semnum < 0 || semnum >= semaptr->sem_nsems) {
error = EINVAL;
@@ -618,7 +616,7 @@ __semctl(p, uap)
break;
case SETALL:
- if ((error = ipcperm(p, &semaptr->sem_perm, IPC_W)))
+ if ((error = ipcperm(td, &semaptr->sem_perm, IPC_W)))
goto done2;
if ((error = copyin(arg, &real_arg, sizeof(real_arg))) != 0)
goto done2;
@@ -639,7 +637,7 @@ __semctl(p, uap)
}
if (error == 0)
- p->p_retval[0] = rval;
+ td->td_retval[0] = rval;
done2:
mtx_unlock(&Giant);
return(error);
@@ -657,22 +655,21 @@ struct semget_args {
* MPSAFE
*/
int
-semget(p, uap)
- struct proc *p;
+semget(td, uap)
+ struct thread *td;
register struct semget_args *uap;
{
int semid, error = 0;
int key = uap->key;
int nsems = uap->nsems;
int semflg = uap->semflg;
- struct ucred *cred = p->p_ucred;
+ struct ucred *cred = td->td_proc->p_ucred;
#ifdef SEM_DEBUG
printf("semget(0x%x, %d, 0%o)\n", key, nsems, semflg);
#endif
mtx_lock(&Giant);
-
- if (!jail_sysvipc_allowed && jailed(p->p_ucred)) {
+ if (!jail_sysvipc_allowed && jailed(td->td_proc->p_ucred)) {
error = ENOSYS;
goto done2;
}
@@ -687,7 +684,7 @@ semget(p, uap)
#ifdef SEM_DEBUG
printf("found public key\n");
#endif
- if ((error = ipcperm(p, &sema[semid].sem_perm,
+ if ((error = ipcperm(td, &sema[semid].sem_perm,
semflg & 0700))) {
goto done2;
}
@@ -771,7 +768,7 @@ semget(p, uap)
}
found:
- p->p_retval[0] = IXSEQ_TO_IPCID(semid, sema[semid].sem_perm);
+ td->td_retval[0] = IXSEQ_TO_IPCID(semid, sema[semid].sem_perm);
done2:
mtx_unlock(&Giant);
return (error);
@@ -789,8 +786,8 @@ struct semop_args {
* MPSAFE
*/
int
-semop(p, uap)
- struct proc *p;
+semop(td, uap)
+ struct thread *td;
register struct semop_args *uap;
{
int semid = uap->semid;
@@ -808,8 +805,7 @@ semop(p, uap)
#endif
mtx_lock(&Giant);
-
- if (!jail_sysvipc_allowed && jailed(p->p_ucred)) {
+ if (!jail_sysvipc_allowed && jailed(td->td_proc->p_ucred)) {
error = ENOSYS;
goto done2;
}
@@ -831,7 +827,7 @@ semop(p, uap)
goto done2;
}
- if ((error = ipcperm(p, &semaptr->sem_perm, IPC_W))) {
+ if ((error = ipcperm(td, &semaptr->sem_perm, IPC_W))) {
#ifdef SEM_DEBUG
printf("error = %d from ipcperm\n", error);
#endif
@@ -1000,7 +996,7 @@ done:
adjval = sops[i].sem_op;
if (adjval == 0)
continue;
- error = semundo_adjust(p, &suptr, semid,
+ error = semundo_adjust(td, &suptr, semid,
sops[i].sem_num, -adjval);
if (error == 0)
continue;
@@ -1020,7 +1016,7 @@ done:
adjval = sops[j].sem_op;
if (adjval == 0)
continue;
- if (semundo_adjust(p, &suptr, semid,
+ if (semundo_adjust(td, &suptr, semid,
sops[j].sem_num, adjval) != 0)
panic("semop - can't undo undos");
}
@@ -1040,7 +1036,7 @@ done:
for (i = 0; i < nsops; i++) {
sopptr = &sops[i];
semptr = &semaptr->sem_base[sopptr->sem_num];
- semptr->sempid = p->p_pid;
+ semptr->sempid = td->td_proc->p_pid;
}
/* Do a wakeup if any semaphore was up'd. */
@@ -1056,7 +1052,7 @@ done:
#ifdef SEM_DEBUG
printf("semop: done\n");
#endif
- p->p_retval[0] = 0;
+ td->td_retval[0] = 0;
done2:
mtx_unlock(&Giant);
return (error);
OpenPOWER on IntegriCloud