Applied, thanks! Samuel
Mikhail Karpov, le lun. 09 nov. 2026 12:49:32 +0700, a ecrit: > Hello, > > On Sun, 8 Nov 2026 16:44:29 Samuel Thibault wrote: > > > > Also, what is the correct way to deallocate a port_bucket? Judging by > > > create-bucket.c, a single call to free (port_bucket) is not sufficient. > > > > It seems so, according to the hurd_ihash_destroy call at least. > > > > > Perhaps it would be worth adding a dedicated function for this in > libports? > > > > Yes, it should have been done already :) > > > > It should probably assert that the ihash is already empty and the > > threadpool is empty. > > I think we can do it this way. > > Thanks, > > -- > Mikhail Karpov > From b766cbc05d64c3be338a02c96c25fb87034f99f4 Mon Sep 17 00:00:00 2001 > From: Mikhail Karpov <[email protected]> > Date: Mon, 9 Nov 2026 12:43:05 +0700 > Subject: [PATCH 2/3] Added a function that destroys a bucket > > --- > libports/Makefile | 2 +- > libports/create-bucket.c | 10 ++++------ > libports/destroy-bucket.c | 33 +++++++++++++++++++++++++++++++++ > libports/ports.h | 3 +++ > 4 files changed, 41 insertions(+), 7 deletions(-) > create mode 100644 libports/destroy-bucket.c > > diff --git a/libports/Makefile b/libports/Makefile > index c67d8fe..bc95330 100644 > --- a/libports/Makefile > +++ b/libports/Makefile > @@ -21,7 +21,7 @@ dir := libports > makemode := library > > libname = libports > -SRCS = create-bucket.c create-class.c \ > +SRCS = create-bucket.c create-class.c destroy-bucket.c \ > reallocate-port.c reallocate-from-external.c destroy-right.c \ > lookup-port.c port-ref.c port-ref-weak.c port-deref.c port-deref-weak.c \ > no-senders.c begin-rpc.c end-rpc.c manage-one-thread.c manage-multithread.c > \ > diff --git a/libports/create-bucket.c b/libports/create-bucket.c > index 4c82786..0e291d7 100644 > --- a/libports/create-bucket.c > +++ b/libports/create-bucket.c > @@ -42,10 +42,7 @@ ports_create_bucket (void) > > ret = malloc (sizeof (struct port_bucket)); > if (! ret) > - { > - errno = ENOMEM; > - return NULL; > - } > + return NULL; > > err = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_PORT_SET, > &ret->portset); > @@ -63,10 +60,11 @@ ports_create_bucket (void) > /* Create the notify_port for this bucket. */ > pthread_once (&init_notify_port_class_once, init_notify_port_class); > err = ports_create_port (notify_port_class, ret, > - sizeof (struct port_info), > - &ret->notify_port); > + sizeof (struct port_info), > + &ret->notify_port); > if (err) > { > + mach_port_deallocate (mach_task_self (), ret->portset); > hurd_ihash_destroy (&ret->htable); > free (ret); > errno = err; > diff --git a/libports/destroy-bucket.c b/libports/destroy-bucket.c > new file mode 100644 > index 0000000..4909b16 > --- /dev/null > +++ b/libports/destroy-bucket.c > @@ -0,0 +1,33 @@ > +/* Destroy the bucket. > + Copyright (C) 2026 Free Software Foundation, Inc. > + > + This file is part of the GNU Hurd. > + > + The GNU Hurd 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. > + > + The GNU Hurd 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ > + > +#include "ports.h" > + > +void > +ports_destroy_bucket (struct port_bucket *bucket) > +{ > + assert_backtrace (bucket->htable.nr_items == 0); > + assert_backtrace (bucket->threadpool.old_threads == 0 > + && bucket->threadpool.young_threads == 0); > + > + mach_port_deallocate (mach_task_self (), bucket->portset); > + ports_port_deref (bucket->notify_port); > + hurd_ihash_destroy (&bucket->htable); > + free (bucket); > +} > diff --git a/libports/ports.h b/libports/ports.h > index 072c8a0..b946618 100644 > --- a/libports/ports.h > +++ b/libports/ports.h > @@ -175,6 +175,9 @@ struct port_bucket *ports_create_bucket (void); > struct port_class *ports_create_class (void (*clean_routine)(void *), > void (*dropweak_routine)(void *)); > > +/* Destroy the BUCKET. */ > +void ports_destroy_bucket (struct port_bucket *bucket); > + > /* Create and return in RESULT a new port in CLASS and BUCKET; SIZE bytes > will be allocated to hold the port structure and whatever private data the > user desires. */ > -- > 2.43.0 > > From 92bdbee83b8d8fc10c96183a0988955d7d565691 Mon Sep 17 00:00:00 2001 > From: Mikhail Karpov <[email protected]> > Date: Mon, 9 Nov 2026 12:44:54 +0700 > Subject: [PATCH 3/3] Added check for ports_create_bucket in storeio/pager.c > > --- > storeio/pager.c | 27 ++++++++++++++++++++------- > 1 file changed, 20 insertions(+), 7 deletions(-) > > diff --git a/storeio/pager.c b/storeio/pager.c > index 7a26efa..8e0bc4b 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,30 @@ init_dev_paging (void) > pthread_mutex_lock (&pager_global_lock); > if (pager_port_bucket == NULL) > { > - error_t err; > - > - pager_port_bucket = ports_create_bucket (); > + struct port_bucket *bucket = ports_create_bucket (); > + if (! 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 (bucket, &pager_requests); > if (err) > { > - errno = err; > + ports_destroy_bucket (bucket); > error (0, err, "pager_start_workers"); > } > + else > + pager_port_bucket = bucket; > } > + > + out: > pthread_mutex_unlock (&pager_global_lock); > } > + > + return err; > } > > void > @@ -229,7 +240,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 > -- Samuel RM> Mauvais OS, changer d'OS (c)(r)(tm) J'ai windows 98 et comment faire pour changer l'os de windows 98? Dans ajout et suppression du programme et il ne parle pas d'os. -+- DN in : GNU -+- L'O.S. est las, hélas, c'est là qu'est l'os -+-
