diff options
Diffstat (limited to 'storeio/pager.c')
-rw-r--r-- | storeio/pager.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/storeio/pager.c b/storeio/pager.c index 1fb1d07e..cbae7eb6 100644 --- a/storeio/pager.c +++ b/storeio/pager.c @@ -25,6 +25,7 @@ #include <unistd.h> #include <errno.h> #include <sys/mman.h> +#include <stdio.h> #include "dev.h" @@ -127,22 +128,26 @@ void pager_clear_user_data (struct user_pager_info *upi) { struct dev *dev = (struct dev *)upi; - mutex_lock (&dev->pager_lock); + pthread_mutex_lock (&dev->pager_lock); dev->pager = 0; - mutex_unlock (&dev->pager_lock); + pthread_mutex_unlock (&dev->pager_lock); } static struct port_bucket *pager_port_bucket = 0; /* A top-level function for the paging thread that just services paging requests. */ -static void -service_paging_requests (any_t arg) +static void * +service_paging_requests (void *arg) { + (void) arg; + for (;;) ports_manage_port_operations_multithread (pager_port_bucket, pager_demuxer, 1000 * 30, 1000 * 60 * 5, 0); + + return NULL; } /* Initialize paging for this device. */ @@ -151,18 +156,27 @@ init_dev_paging () { if (! pager_port_bucket) { - static struct mutex pager_global_lock = MUTEX_INITIALIZER; + static pthread_mutex_t pager_global_lock = PTHREAD_MUTEX_INITIALIZER; - mutex_lock (&pager_global_lock); + pthread_mutex_lock (&pager_global_lock); if (pager_port_bucket == NULL) { + pthread_t thread; + error_t err; + pager_port_bucket = ports_create_bucket (); /* Make a thread to service paging requests. */ - cthread_detach (cthread_fork ((cthread_fn_t)service_paging_requests, - (any_t)0)); + err = pthread_create (&thread, NULL, service_paging_requests, NULL); + if (!err) + pthread_detach (thread); + else + { + errno = err; + perror ("pthread_create"); + } } - mutex_unlock (&pager_global_lock); + pthread_mutex_unlock (&pager_global_lock); } } @@ -226,7 +240,7 @@ dev_get_memory_object (struct dev *dev, vm_prot_t prot, memory_object_t *memobj) init_dev_paging (); - mutex_lock (&dev->pager_lock); + pthread_mutex_lock (&dev->pager_lock); if (dev->pager == NULL) { @@ -235,7 +249,7 @@ dev_get_memory_object (struct dev *dev, vm_prot_t prot, memory_object_t *memobj) 1, MEMORY_OBJECT_COPY_DELAY); if (dev->pager == NULL) { - mutex_unlock (&dev->pager_lock); + pthread_mutex_unlock (&dev->pager_lock); return errno; } created = 1; @@ -247,7 +261,7 @@ dev_get_memory_object (struct dev *dev, vm_prot_t prot, memory_object_t *memobj) /* Pager is currently being destroyed, try again. */ { dev->pager = 0; - mutex_unlock (&dev->pager_lock); + pthread_mutex_unlock (&dev->pager_lock); return dev_get_memory_object (dev, prot, memobj); } else @@ -258,7 +272,7 @@ dev_get_memory_object (struct dev *dev, vm_prot_t prot, memory_object_t *memobj) if (created) ports_port_deref (dev->pager); - mutex_unlock (&dev->pager_lock); + pthread_mutex_unlock (&dev->pager_lock); } return err; |