summaryrefslogtreecommitdiff
path: root/libpager
diff options
context:
space:
mode:
authorMichael I. Bushnell <mib@gnu.org>1994-05-20 19:55:36 +0000
committerMichael I. Bushnell <mib@gnu.org>1994-05-20 19:55:36 +0000
commit59eb781d2960d68869ede79913d9d57df980efc1 (patch)
treef910d2ae27b3353c9dda2d78630983a392fc7e6e /libpager
parentb95d2ac5d3b85fe81d7730a42b95bcb2cf73c291 (diff)
Initial revision
Diffstat (limited to 'libpager')
-rw-r--r--libpager/pager-attr.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/libpager/pager-attr.c b/libpager/pager-attr.c
new file mode 100644
index 00000000..fd551d01
--- /dev/null
+++ b/libpager/pager-attr.c
@@ -0,0 +1,75 @@
+/* Changing pager attributes synchronously
+ Copyright (C) 1994 Free Software Foundation
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include "Priv.h"
+
+/* Change the attributes of the memory object underlying pager P.
+ Args MAY_CACHE and COPY_STRATEGY are as for
+ memory_object_change_atributes. Wait for the kernel to report completion
+ off WAIT is set.*/
+void
+pager_change_attributes (struct pager *p,
+ boolean_t may_cache,
+ memory_object_copy_strategy_t copy_strategy,
+ int wait)
+{
+ struct attribute_request *ar = 0;
+
+ mutex_lock (&p->interlock);
+ assert (p->pager_state == NORMAL);
+
+ if (wait)
+ {
+ for (ar = p->attribute_requests; ar; ar = ar->next)
+ if (ar->may_cache == may_cache
+ && ar->copy_strategy == copy_strategy)
+ {
+ ar->attrs_pending++;
+ ar->threads_waiting++;
+ break;
+ }
+ if (!ar)
+ {
+ ar = malloc (sizeof (struct attribute_request));
+ ar->may_cache = may_cache;
+ ar->copy_strategy = copy_strategy;
+ ar->attrs_pending = 1;
+ ar->threads_waiting = 1;
+ ar->next = p->attribute_requests;
+ if (ar->next)
+ ar->next->prevp = &ar->next;
+ ar->prevp = &p->attribute_requests;
+ p->attribute_requests = ar;
+ }
+ }
+
+ memory_object_change_attributes (p->memobjcntl, may_cache, copy_strategy,
+ wait ? p->port.port_right : MACH_PORT_NULL);
+
+ if (wait)
+ {
+ while (ar->attrs_pending)
+ condition_wait (&p->wakeup, &p->interlock);
+ if (!--ar->threads_waiting)
+ {
+ *ar->prevp = ar->next;
+ free (ar);
+ }
+ }
+
+ mutex_unlock (&p->interlock);
+}