[rtems-libbsd commit] Merged the rtems version of resource back to kern_resource and added method to resolve linker errors .
Jennifer Averett
jennifer at rtems.org
Wed Apr 18 19:07:42 UTC 2012
Module: rtems-libbsd
Branch: master
Commit: a2ec3326e32db9a4a5a9661e15637b485f1855f1
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=a2ec3326e32db9a4a5a9661e15637b485f1855f1
Author: Jennifer Averett <jennifer.averett at oarcorp.com>
Date: Wed Apr 18 14:10:44 2012 -0500
Merged the rtems version of resource back to kern_resource and added method to resolve linker errors.
---
Makefile | 1 -
freebsd-to-rtems.py | 1 -
freebsd/kern/kern_resource.c | 14 +++
rtemsbsd/src/rtems-bsd-resource.c | 174 -------------------------------------
4 files changed, 14 insertions(+), 176 deletions(-)
diff --git a/Makefile b/Makefile
index d267920..6ebebc2 100644
--- a/Makefile
+++ b/Makefile
@@ -38,7 +38,6 @@ C_FILES += rtemsbsd/src/rtems-bsd-callout.c
C_FILES += rtemsbsd/src/rtems-bsd-init.c
C_FILES += rtemsbsd/src/rtems-bsd-init-with-irq.c
C_FILES += rtemsbsd/src/rtems-bsd-assert.c
-C_FILES += rtemsbsd/src/rtems-bsd-resource.c
C_FILES += rtemsbsd/src/rtems-bsd-jail.c
C_FILES += rtemsbsd/src/rtems-bsd-shell.c
C_FILES += rtemsbsd/src/rtems-bsd-syscalls.c
diff --git a/freebsd-to-rtems.py b/freebsd-to-rtems.py
index 3cc7fdd..597c5ac 100755
--- a/freebsd-to-rtems.py
+++ b/freebsd-to-rtems.py
@@ -531,7 +531,6 @@ rtems.addRTEMSSourceFiles(
'src/rtems-bsd-init.c',
'src/rtems-bsd-init-with-irq.c',
'src/rtems-bsd-assert.c',
- 'src/rtems-bsd-resource.c',
'src/rtems-bsd-jail.c',
'src/rtems-bsd-shell.c',
'src/rtems-bsd-syscalls.c',
diff --git a/freebsd/kern/kern_resource.c b/freebsd/kern/kern_resource.c
index 790403a..939a1d2 100644
--- a/freebsd/kern/kern_resource.c
+++ b/freebsd/kern/kern_resource.c
@@ -69,12 +69,14 @@ __FBSDID("$FreeBSD$");
static MALLOC_DEFINE(M_PLIMIT, "plimit", "plimit structures");
+#endif /* __rtems__ */
static MALLOC_DEFINE(M_UIDINFO, "uidinfo", "uidinfo structures");
#define UIHASH(uid) (&uihashtbl[(uid) & uihash])
static struct rwlock uihashtbl_lock;
static LIST_HEAD(uihashhead, uidinfo) *uihashtbl;
static u_long uihash; /* size of hash table - 1 */
+#ifndef __rtems__
static void calcru1(struct proc *p, struct rusage_ext *ruxp,
struct timeval *up, struct timeval *sp);
static int donice(struct thread *td, struct proc *chgp, int n);
@@ -1140,6 +1142,7 @@ lim_max(struct proc *p, int which)
lim_rlimit(p, which, &rl);
return (rl.rlim_max);
}
+#endif /* __rtems__ */
/*
* Return the current (soft) limit for a particular system resource.
@@ -1148,12 +1151,21 @@ lim_max(struct proc *p, int which)
rlim_t
lim_cur(struct proc *p, int which)
{
+#ifndef __rtems__
struct rlimit rl;
lim_rlimit(p, which, &rl);
return (rl.rlim_cur);
+#else
+ /*
+ * Resource limits not currently supported in RTEMS version.
+ * This is left for future work.
+ */
+ return RLIM_INFINITY;
+#endif /* __rtems__ */
}
+#ifndef __rtems__
/*
* Return a copy of the entire rlimit structure for the system limit
* specified by 'which' in the rlimit structure pointed to by 'rlp'.
@@ -1169,6 +1181,7 @@ lim_rlimit(struct proc *p, int which, struct rlimit *rlp)
if (p->p_sysent->sv_fixlimit != NULL)
p->p_sysent->sv_fixlimit(rlp, which);
}
+#endif /* __rtems__ */
/*
* Find the uidinfo structure for a uid. This structure is used to
@@ -1304,6 +1317,7 @@ uifree(uip)
rw_wunlock(&uihashtbl_lock);
}
+#ifndef __rtems__
/*
* Change the count associated with number of processes
* a given user is using. When 'max' is 0, don't enforce a limit
diff --git a/rtemsbsd/src/rtems-bsd-resource.c b/rtemsbsd/src/rtems-bsd-resource.c
deleted file mode 100644
index e821fe0..0000000
--- a/rtemsbsd/src/rtems-bsd-resource.c
+++ /dev/null
@@ -1,174 +0,0 @@
-/**
- * @file
- *
- * @ingroup rtems_bsd_rtems
- *
- * @brief TODO.
- */
-
-/*
- * Copyright (c) 2009, 2010 embedded brains GmbH. All rights reserved.
- *
- * embedded brains GmbH
- * Obere Lagerstr. 30
- * 82178 Puchheim
- * Germany
- * <rtems at embedded-brains.de>
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.com/license/LICENSE.
- */
-
-#include <freebsd/machine/rtems-bsd-config.h>
-
-#include <freebsd/sys/types.h>
-#include <freebsd/sys/systm.h>
-#include <freebsd/sys/lock.h>
-#include <freebsd/sys/malloc.h>
-#include <freebsd/sys/mutex.h>
-#include <freebsd/sys/proc.h>
-#include <freebsd/sys/resourcevar.h>
-#include <freebsd/sys/rwlock.h>
-#include <freebsd/sys/refcount.h>
-
-static MALLOC_DEFINE(M_UIDINFO, "uidinfo", "uidinfo structures");
-
-#define UIHASH(uid) (&uihashtbl[(uid) & uihash])
-static struct rwlock uihashtbl_lock;
-static LIST_HEAD(uihashhead, uidinfo) *uihashtbl;
-static u_long uihash; /* size of hash table - 1 */
-
-/*
- * Find the uidinfo structure for a uid. This structure is used to
- * track the total resource consumption (process count, socket buffer
- * size, etc.) for the uid and impose limits.
- */
-void
-uihashinit()
-{
-
- uihashtbl = hashinit(maxproc / 16, M_UIDINFO, &uihash);
- rw_init(&uihashtbl_lock, "uidinfo hash");
-}
-
-/*
- * Look up a uidinfo struct for the parameter uid.
- * uihashtbl_lock must be locked.
- */
-static struct uidinfo *
-uilookup(uid)
- uid_t uid;
-{
- struct uihashhead *uipp;
- struct uidinfo *uip;
-
- rw_assert(&uihashtbl_lock, RA_LOCKED);
- uipp = UIHASH(uid);
- LIST_FOREACH(uip, uipp, ui_hash)
- if (uip->ui_uid == uid)
- break;
-
- return (uip);
-}
-
-/*
- * Find or allocate a struct uidinfo for a particular uid.
- * Increase refcount on uidinfo struct returned.
- * uifree() should be called on a struct uidinfo when released.
- */
-struct uidinfo *
-uifind(uid)
- uid_t uid;
-{
- struct uidinfo *old_uip, *uip;
-
- rw_rlock(&uihashtbl_lock);
- uip = uilookup(uid);
- if (uip == NULL) {
- rw_runlock(&uihashtbl_lock);
- uip = malloc(sizeof(*uip), M_UIDINFO, M_WAITOK | M_ZERO);
- rw_wlock(&uihashtbl_lock);
- /*
- * There's a chance someone created our uidinfo while we
- * were in malloc and not holding the lock, so we have to
- * make sure we don't insert a duplicate uidinfo.
- */
- if ((old_uip = uilookup(uid)) != NULL) {
- /* Someone else beat us to it. */
- free(uip, M_UIDINFO);
- uip = old_uip;
- } else {
- refcount_init(&uip->ui_ref, 0);
- uip->ui_uid = uid;
- mtx_init(&uip->ui_vmsize_mtx, "ui_vmsize", NULL,
- MTX_DEF);
- LIST_INSERT_HEAD(UIHASH(uid), uip, ui_hash);
- }
- }
- uihold(uip);
- rw_unlock(&uihashtbl_lock);
- return (uip);
-}
-
-/*
- * Place another refcount on a uidinfo struct.
- */
-void
-uihold(uip)
- struct uidinfo *uip;
-{
-
- refcount_acquire(&uip->ui_ref);
-}
-
-/*-
- * Since uidinfo structs have a long lifetime, we use an
- * opportunistic refcounting scheme to avoid locking the lookup hash
- * for each release.
- *
- * If the refcount hits 0, we need to free the structure,
- * which means we need to lock the hash.
- * Optimal case:
- * After locking the struct and lowering the refcount, if we find
- * that we don't need to free, simply unlock and return.
- * Suboptimal case:
- * If refcount lowering results in need to free, bump the count
- * back up, lose the lock and acquire the locks in the proper
- * order to try again.
- */
-void
-uifree(uip)
- struct uidinfo *uip;
-{
- int old;
-
- /* Prepare for optimal case. */
- old = uip->ui_ref;
- if (old > 1 && atomic_cmpset_int(&uip->ui_ref, old, old - 1))
- return;
-
- /* Prepare for suboptimal case. */
- rw_wlock(&uihashtbl_lock);
- if (refcount_release(&uip->ui_ref)) {
- LIST_REMOVE(uip, ui_hash);
- rw_wunlock(&uihashtbl_lock);
- if (uip->ui_sbsize != 0)
- printf("freeing uidinfo: uid = %d, sbsize = %ld\n",
- uip->ui_uid, uip->ui_sbsize);
- if (uip->ui_proccnt != 0)
- printf("freeing uidinfo: uid = %d, proccnt = %ld\n",
- uip->ui_uid, uip->ui_proccnt);
- if (uip->ui_vmsize != 0)
- printf("freeing uidinfo: uid = %d, swapuse = %lld\n",
- uip->ui_uid, (unsigned long long)uip->ui_vmsize);
- mtx_destroy(&uip->ui_vmsize_mtx);
- free(uip, M_UIDINFO);
- return;
- }
- /*
- * Someone added a reference between atomic_cmpset_int() and
- * rw_wlock(&uihashtbl_lock).
- */
- rw_wunlock(&uihashtbl_lock);
-}
More information about the vc
mailing list