Hello, On Fri, 6 Nov 2026 18:34:24 Samuel Thibault wrote:
> Ok, then you can use a local struct port_bucket* variable to store the > pointer while you are unsure whether the function will succeed, and then > either store to the global variable on success, or deallocate the bucket > on failure. We can keep the check on pager_port_bucket by first saving the result of ports_create_bucket into a static variable, tmp_port_bucket. If ports_create_bucket succeeds but pager_start_workers fails, we simply refrain from assigning the value from tmp_port_bucket to pager_port_bucket. This way, we avoid the need to create and deallocate a local variable. Thanks, -- Mikhail Karpov
From 400a435bb2d3ed5887e356313ba117a928fb3597 Mon Sep 17 00:00:00 2001 From: Mikhail Karpov <[email protected]> Date: Sat, 7 Nov 2026 18:47:49 +0700 Subject: [PATCH 4/4] Added check for ports_create_bucket in storeio/pager.c --- storeio/pager.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/storeio/pager.c b/storeio/pager.c index 7a26efa..70d2b94 100644 --- a/storeio/pager.c +++ b/storeio/pager.c @@ -145,9 +145,10 @@ static struct port_bucket *pager_port_bucket = 0; static struct pager_requests *pager_requests; /* Initialize paging for this device. */ -static void +static error_t init_dev_paging (void) { + error_t err = 0; if (! pager_port_bucket) { static pthread_mutex_t pager_global_lock = PTHREAD_MUTEX_INITIALIZER; @@ -155,20 +156,35 @@ init_dev_paging (void) pthread_mutex_lock (&pager_global_lock); if (pager_port_bucket == NULL) { - error_t err; - - pager_port_bucket = ports_create_bucket (); + static struct port_bucket *tmp_port_bucket = NULL; + if (!tmp_port_bucket) + { + tmp_port_bucket = ports_create_bucket (); + if (!tmp_port_bucket) + { + err = errno; + error (0, err, "ports_create_bucket"); + goto out; + } + } /* Start libpagers worker threads. */ - err = pager_start_workers (pager_port_bucket, &pager_requests); + err = pager_start_workers (tmp_port_bucket, &pager_requests); if (err) { - errno = err; error (0, err, "pager_start_workers"); + goto out; } + + pager_port_bucket = tmp_port_bucket; + tmp_port_bucket = NULL; } + + out: pthread_mutex_unlock (&pager_global_lock); } + + return err; } void @@ -229,7 +245,9 @@ dev_get_memory_object (struct dev *dev, vm_prot_t prot, memory_object_t *memobj) { int created = 0; - init_dev_paging (); + err = init_dev_paging (); + if (err) + return err; pthread_mutex_lock (&dev->pager_lock); -- 2.43.0
