diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2022-08-10 22:05:09 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2022-08-10 22:05:09 +0200 |
commit | b14e0100f5295abd950eef636fa16df181504401 (patch) | |
tree | 8335e68359360ae50064e7164b0a25277fb33ee0 /libpager | |
parent | 7c3323a25bc1d5844feb7f9ed241fdbdb4819739 (diff) | |
download | hurd-b14e0100f5295abd950eef636fa16df181504401.tar.gz hurd-b14e0100f5295abd950eef636fa16df181504401.tar.bz2 hurd-b14e0100f5295abd950eef636fa16df181504401.zip |
Do not cache the R/O proxy
We cannot properly detect when to release the ro_proxy, so let's just not
cache it.
Diffstat (limited to 'libpager')
-rw-r--r-- | libpager/object-terminate.c | 5 | ||||
-rw-r--r-- | libpager/pager-create.c | 1 | ||||
-rw-r--r-- | libpager/pager-ro-port.c | 35 | ||||
-rw-r--r-- | libpager/pager.h | 3 | ||||
-rw-r--r-- | libpager/priv.h | 2 |
5 files changed, 14 insertions, 32 deletions
diff --git a/libpager/object-terminate.c b/libpager/object-terminate.c index 8e8205b5..3e7df167 100644 --- a/libpager/object-terminate.c +++ b/libpager/object-terminate.c @@ -115,11 +115,6 @@ _pager_free_structure (struct pager *p) mach_port_deallocate (mach_task_self (), p->memobjname); p->memobjname = MACH_PORT_NULL; } - if (p->ro_proxy != MACH_PORT_NULL) - { - mach_port_deallocate (mach_task_self (), p->ro_proxy); - p->ro_proxy = MACH_PORT_NULL; - } /* Free the pagemap */ if (p->pagemapsize) diff --git a/libpager/pager-create.c b/libpager/pager-create.c index 9c3fba99..7f2f7d6e 100644 --- a/libpager/pager-create.c +++ b/libpager/pager-create.c @@ -42,7 +42,6 @@ _pager_create (size_t size, p->notify_on_evict = notify_on_evict; p->memobjcntl = MACH_PORT_NULL; p->memobjname = MACH_PORT_NULL; - p->ro_proxy = MACH_PORT_NULL; p->noterm = 0; p->termwaiting = 0; p->pagemap = 0; diff --git a/libpager/pager-ro-port.c b/libpager/pager-ro-port.c index 713b0423..7772ba30 100644 --- a/libpager/pager-ro-port.c +++ b/libpager/pager-ro-port.c @@ -20,7 +20,7 @@ #include <mach/mach4.h> mach_port_t -pager_get_ro_port (struct pager *p) +pager_create_ro_port (struct pager *p) { error_t err = 0;; mach_port_t port = MACH_PORT_NULL; @@ -29,33 +29,22 @@ pager_get_ro_port (struct pager *p) vm_offset_t start = 0; vm_size_t len = ~0; - pthread_mutex_lock (&p->interlock); - - if (!MACH_PORT_VALID (p->ro_proxy)) + rw_port = ports_get_send_right (p); + if (!MACH_PORT_VALID (rw_port)) { - rw_port = ports_get_send_right (p); - if (!MACH_PORT_VALID (rw_port)) - { - err = errno; - goto out; - } - - err = memory_object_create_proxy (mach_task_self (), - VM_PROT_READ | VM_PROT_EXECUTE, - &rw_port, 1, - &offset, 1, &start, 1, &len, 1, - &p->ro_proxy); - - mach_port_deallocate (mach_task_self (), rw_port); - - if (err) - goto out; + err = errno; + goto out; } - port = p->ro_proxy; + err = memory_object_create_proxy (mach_task_self (), + VM_PROT_READ | VM_PROT_EXECUTE, + &rw_port, 1, + &offset, 1, &start, 1, &len, 1, + &port); + + mach_port_deallocate (mach_task_self (), rw_port); out: - pthread_mutex_unlock (&p->interlock); errno = err; return port; } diff --git a/libpager/pager.h b/libpager/pager.h index 16b47def..3b1c7251 100644 --- a/libpager/pager.h +++ b/libpager/pager.h @@ -155,8 +155,9 @@ pager_change_attributes (struct pager *pager, mach_port_t pager_get_port (struct pager *pager); +/* Create a read-only proxy for requests to the pager. */ mach_port_t -pager_get_ro_port (struct pager *pager); +pager_create_ro_port (struct pager *pager); /* Force termination of a pager. After this returns, no more paging requests on the pager will be honored, and the diff --git a/libpager/priv.h b/libpager/priv.h index 0c38a7c0..89af52ba 100644 --- a/libpager/priv.h +++ b/libpager/priv.h @@ -55,8 +55,6 @@ struct pager memory_object_control_t memobjcntl; memory_object_name_t memobjname; - memory_object_t ro_proxy; - int noterm; /* number of threads blocking termination */ int termwaiting:1; |