From c75adc040ca2767545e9cff51575b2ac1706efcd Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Fri, 15 Nov 2013 11:53:55 +0100 Subject: libdiskfs: remove dead assignment Found using the Clang Static Analyzer. * libdiskfs/io-write.c (diskfs_S_io_write): Remove dead assignment. --- libdiskfs/io-write.c | 1 - 1 file changed, 1 deletion(-) diff --git a/libdiskfs/io-write.c b/libdiskfs/io-write.c index 26e0be43..2967c4c8 100644 --- a/libdiskfs/io-write.c +++ b/libdiskfs/io-write.c @@ -56,7 +56,6 @@ diskfs_S_io_write (struct protid *cred, goto out; } - err = 0; while (off + (off_t) datalen > np->allocsize) { err = diskfs_grow (np, off + datalen, cred); -- cgit v1.2.3 From 95e50540529d5a411880acbb6ee9f743226243a8 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Fri, 15 Nov 2013 11:56:50 +0100 Subject: libdiskfs: fix error handling Found using the Clang Static Analyzer. * libdiskfs/dir-renamed.c (diskfs_rename_dir): Fix error handling. --- libdiskfs/dir-renamed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libdiskfs/dir-renamed.c b/libdiskfs/dir-renamed.c index d73dc282..9b7ec3a6 100644 --- a/libdiskfs/dir-renamed.c +++ b/libdiskfs/dir-renamed.c @@ -132,7 +132,7 @@ diskfs_rename_dir (struct node *fdp, struct node *fnp, const char *fromname, if (tdp->dn_stat.st_nlink == diskfs_link_max - 1) { err = EMLINK; - return EMLINK; + goto out; } tdp->dn_stat.st_nlink++; tdp->dn_set_ctime = 1; -- cgit v1.2.3 From 5d3b00abe9a506ab3c3310cfb82394534463c40b Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Fri, 15 Nov 2013 12:10:05 +0100 Subject: ext2fs: fix error handling Found using the Clang Static Analyzer. * ext2fs/dir.c (diskfs_lookup_hard): Fix error handling. --- ext2fs/dir.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext2fs/dir.c b/ext2fs/dir.c index c0752466..a7eeaaa4 100644 --- a/ext2fs/dir.c +++ b/ext2fs/dir.c @@ -195,6 +195,8 @@ diskfs_lookup_hard (struct node *dp, const char *name, enum lookup_type type, err = vm_map (mach_task_self (), &buf, buflen, 0, 1, memobj, 0, 0, prot, prot, 0); mach_port_deallocate (mach_task_self (), memobj); + if (err) + return err; inum = 0; -- cgit v1.2.3 From e4e5c29fb254a05a134886ee6518e3d7cfde1cc6 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Fri, 15 Nov 2013 12:26:32 +0100 Subject: libshouldbeinlibc: fix dead assignment Found using the Clang Static Analyzer. * libshouldbeinlibc/timefmt.c (fmt_past_time): Fix dead assignment, normalize adjacent white space. --- libshouldbeinlibc/timefmt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libshouldbeinlibc/timefmt.c b/libshouldbeinlibc/timefmt.c index 7ce973bc..a28f58bd 100644 --- a/libshouldbeinlibc/timefmt.c +++ b/libshouldbeinlibc/timefmt.c @@ -338,8 +338,8 @@ fmt_past_time (struct timeval *tv, struct timeval *now, end = stpcpy (end, *dfmt); end = stpcpy (end, *sep); - end = stpcpy (end, *fmt); - + stpcpy (end, *fmt); + used = strftime (buf, width + 1, whole_fmt, &tm); } -- cgit v1.2.3 From dc96b68a826a652d514f994d1f7932fb6fff87a7 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Fri, 15 Nov 2013 12:57:27 +0100 Subject: mach-defpager: fix the page offsets returned by pager_pages Previously the increment was outside the loop body, turning it into a dead increment. Move the increment into the loop body as it is done in the true branch above. This fixes the offsets recorded in the default_pager_page_t objects. Found using the Clang Static Analyzer. * mach-defpager/default_pager.c (pager_pages): Fix returned page offsets. --- mach-defpager/default_pager.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mach-defpager/default_pager.c b/mach-defpager/default_pager.c index 8e466f72..a65a5fe1 100644 --- a/mach-defpager/default_pager.c +++ b/mach-defpager/default_pager.c @@ -879,12 +879,13 @@ pager_pages(pager, pages, numpages) offset += vm_page_size; } } else { - for (emap = &map[size]; map < emap; map++) + for (emap = &map[size]; map < emap; map++) { if ( ! no_block(*map) ) { if (actual++ < numpages) pages++->dpp_offset = offset; } - offset += vm_page_size; + offset += vm_page_size; + } } return actual; } -- cgit v1.2.3 From ef0b64d8d0ee7851a4d149ef8e39c133e4b788b7 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Fri, 15 Nov 2013 13:04:53 +0100 Subject: mach-defpager: do not remove -Wall from CFLAGS Bother, said Pooh. * Makefile: Do not remove -Wall from CFLAGS. --- mach-defpager/Makefile | 3 --- 1 file changed, 3 deletions(-) diff --git a/mach-defpager/Makefile b/mach-defpager/Makefile index 5a98d690..e38a0bea 100644 --- a/mach-defpager/Makefile +++ b/mach-defpager/Makefile @@ -35,6 +35,3 @@ LDFLAGS += -static include ../Makeconf MIGSFLAGS = -DSEQNOS - -# Don't even bother. -CFLAGS := $(filter-out -Wall,$(CFLAGS)) -- cgit v1.2.3 From 8f39f8bf905ca84db4c853733f6a3d3a3011c237 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Fri, 15 Nov 2013 20:36:58 +0100 Subject: Clean up the included header files * libihash/ihash.c: Clean up the included header files. * libshouldbeinlibc/cacheq.c: Likewise. * libshouldbeinlibc/canon-host.c: Likewise. * libshouldbeinlibc/fsysops.c: Likewise. * libshouldbeinlibc/idvec-auth.c: Likewise. * libshouldbeinlibc/idvec.c: Likewise. * libshouldbeinlibc/idvec.h: Likewise. * libshouldbeinlibc/localhost.c: Likewise. * libshouldbeinlibc/maptime.c: Likewise. * libshouldbeinlibc/nullauth.c: Likewise. * libshouldbeinlibc/portxlate.c: Likewise. * libshouldbeinlibc/shared-dom.c: Likewise. * libshouldbeinlibc/ugids-argp.c: Likewise. * libshouldbeinlibc/ugids-auth.c: Likewise. * libshouldbeinlibc/ugids-imply.c: Likewise. * libshouldbeinlibc/ugids-merge.c: Likewise. * libshouldbeinlibc/ugids-subtract.c: Likewise. * libshouldbeinlibc/ugids-verify-auth.c: Likewise. * libshouldbeinlibc/ugids-verify.c: Likewise. * libshouldbeinlibc/ugids.c: Likewise. * libshouldbeinlibc/ugids.h: Likewise. * libshouldbeinlibc/wire.c: Likewise. --- libihash/ihash.c | 4 +--- libshouldbeinlibc/cacheq.c | 2 +- libshouldbeinlibc/canon-host.c | 1 - libshouldbeinlibc/fsysops.c | 1 + libshouldbeinlibc/idvec-auth.c | 1 + libshouldbeinlibc/idvec.c | 3 ++- libshouldbeinlibc/idvec.h | 1 - libshouldbeinlibc/localhost.c | 2 +- libshouldbeinlibc/maptime.c | 1 - libshouldbeinlibc/nullauth.c | 2 -- libshouldbeinlibc/portxlate.c | 2 +- libshouldbeinlibc/shared-dom.c | 3 --- libshouldbeinlibc/ugids-argp.c | 3 +-- libshouldbeinlibc/ugids-auth.c | 2 +- libshouldbeinlibc/ugids-imply.c | 3 ++- libshouldbeinlibc/ugids-merge.c | 3 ++- libshouldbeinlibc/ugids-subtract.c | 4 ++-- libshouldbeinlibc/ugids-verify-auth.c | 7 +------ libshouldbeinlibc/ugids-verify.c | 7 +------ libshouldbeinlibc/ugids.c | 1 + libshouldbeinlibc/ugids.h | 2 ++ libshouldbeinlibc/wire.c | 2 +- 22 files changed, 22 insertions(+), 35 deletions(-) diff --git a/libihash/ihash.c b/libihash/ihash.c index fe9eaedf..be1c5803 100644 --- a/libihash/ihash.c +++ b/libihash/ihash.c @@ -26,13 +26,11 @@ #endif #include -#include #include -#include #include #include -#include +#include "ihash.h" /* The prime numbers of the form 4 * i + 3 for some i, all greater diff --git a/libshouldbeinlibc/cacheq.c b/libshouldbeinlibc/cacheq.c index 5649903a..c1be59c0 100644 --- a/libshouldbeinlibc/cacheq.c +++ b/libshouldbeinlibc/cacheq.c @@ -19,7 +19,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include -#include +#include #include "cacheq.h" diff --git a/libshouldbeinlibc/canon-host.c b/libshouldbeinlibc/canon-host.c index ea6c7195..41068d30 100644 --- a/libshouldbeinlibc/canon-host.c +++ b/libshouldbeinlibc/canon-host.c @@ -20,7 +20,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include diff --git a/libshouldbeinlibc/fsysops.c b/libshouldbeinlibc/fsysops.c index f26069df..dbcae672 100644 --- a/libshouldbeinlibc/fsysops.c +++ b/libshouldbeinlibc/fsysops.c @@ -25,6 +25,7 @@ #include #include #include +#include /* Make FSYS readonly or writable. */ error_t diff --git a/libshouldbeinlibc/idvec-auth.c b/libshouldbeinlibc/idvec-auth.c index bb7f4afd..1858bd6a 100644 --- a/libshouldbeinlibc/idvec-auth.c +++ b/libshouldbeinlibc/idvec-auth.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "idvec.h" diff --git a/libshouldbeinlibc/idvec.c b/libshouldbeinlibc/idvec.c index d18871f9..7fdee104 100644 --- a/libshouldbeinlibc/idvec.c +++ b/libshouldbeinlibc/idvec.c @@ -20,7 +20,8 @@ #include #include -#include + +#include "idvec.h" /* Return a new, empty, idvec, or NULL if there wasn't enough memory. */ struct idvec * diff --git a/libshouldbeinlibc/idvec.h b/libshouldbeinlibc/idvec.h index abbc273e..d6ec1553 100644 --- a/libshouldbeinlibc/idvec.h +++ b/libshouldbeinlibc/idvec.h @@ -22,7 +22,6 @@ #include #include -#include #include #include diff --git a/libshouldbeinlibc/localhost.c b/libshouldbeinlibc/localhost.c index f0225116..9b7d4e09 100644 --- a/libshouldbeinlibc/localhost.c +++ b/libshouldbeinlibc/localhost.c @@ -19,9 +19,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include -#include #include #include +#include /* Return the name of the localhost. This is just a wrapper for gethostname, which takes care of allocating a big enough buffer, and caches the result diff --git a/libshouldbeinlibc/maptime.c b/libshouldbeinlibc/maptime.c index cacf4b6f..971e05f7 100644 --- a/libshouldbeinlibc/maptime.c +++ b/libshouldbeinlibc/maptime.c @@ -20,7 +20,6 @@ #include #include -#include #include #include "maptime.h" diff --git a/libshouldbeinlibc/nullauth.c b/libshouldbeinlibc/nullauth.c index 4ba10a76..3a98e558 100644 --- a/libshouldbeinlibc/nullauth.c +++ b/libshouldbeinlibc/nullauth.c @@ -19,8 +19,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include -#include #include /* Obtain an empty authentication handle and use it for further diff --git a/libshouldbeinlibc/portxlate.c b/libshouldbeinlibc/portxlate.c index 8888e2c2..f78abbf1 100644 --- a/libshouldbeinlibc/portxlate.c +++ b/libshouldbeinlibc/portxlate.c @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include +#include #include #include diff --git a/libshouldbeinlibc/shared-dom.c b/libshouldbeinlibc/shared-dom.c index 0f8efdf8..0115fced 100644 --- a/libshouldbeinlibc/shared-dom.c +++ b/libshouldbeinlibc/shared-dom.c @@ -18,10 +18,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include -#include #include -#include /* Returns a pointer into HOST1 that is the part of the domain shared with HOST2. If the two do not share anything, the return value will point to diff --git a/libshouldbeinlibc/ugids-argp.c b/libshouldbeinlibc/ugids-argp.c index dc076d27..43a54d70 100644 --- a/libshouldbeinlibc/ugids-argp.c +++ b/libshouldbeinlibc/ugids-argp.c @@ -20,12 +20,11 @@ #include #include -#include #include -#include #include #include #include +#include #include "ugids.h" diff --git a/libshouldbeinlibc/ugids-auth.c b/libshouldbeinlibc/ugids-auth.c index d7ec9daa..0e4f84dc 100644 --- a/libshouldbeinlibc/ugids-auth.c +++ b/libshouldbeinlibc/ugids-auth.c @@ -18,9 +18,9 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include +#include "idvec.h" #include "ugids.h" /* Make an auth port from UGIDS and return it in AUTH, using authority in diff --git a/libshouldbeinlibc/ugids-imply.c b/libshouldbeinlibc/ugids-imply.c index 9c2a8a2c..272ba664 100644 --- a/libshouldbeinlibc/ugids-imply.c +++ b/libshouldbeinlibc/ugids-imply.c @@ -18,8 +18,9 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include +#include +#include "idvec.h" #include "ugids.h" /* Mark as implied all gids in UGIDS that can be implied from its uids. */ diff --git a/libshouldbeinlibc/ugids-merge.c b/libshouldbeinlibc/ugids-merge.c index 924e1ed9..f97da07c 100644 --- a/libshouldbeinlibc/ugids-merge.c +++ b/libshouldbeinlibc/ugids-merge.c @@ -18,8 +18,9 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include +#include +#include "idvec.h" #include "ugids.h" static error_t diff --git a/libshouldbeinlibc/ugids-subtract.c b/libshouldbeinlibc/ugids-subtract.c index eecba20e..b56e397b 100644 --- a/libshouldbeinlibc/ugids-subtract.c +++ b/libshouldbeinlibc/ugids-subtract.c @@ -18,9 +18,9 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include -#include +#include +#include "idvec.h" #include "ugids.h" /* Remove the gids in SUB from those in GIDS, except where they are implied diff --git a/libshouldbeinlibc/ugids-verify-auth.c b/libshouldbeinlibc/ugids-verify-auth.c index 28e3bdab..0e85b1b6 100644 --- a/libshouldbeinlibc/ugids-verify-auth.c +++ b/libshouldbeinlibc/ugids-verify-auth.c @@ -19,17 +19,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ #include -#include #include -#include -#include -#include -#include -#include #include #include +#include "idvec.h" #include "ugids.h" /* Accumulated information from authentication various passwords. */ diff --git a/libshouldbeinlibc/ugids-verify.c b/libshouldbeinlibc/ugids-verify.c index f9d45c63..5686bdf8 100644 --- a/libshouldbeinlibc/ugids-verify.c +++ b/libshouldbeinlibc/ugids-verify.c @@ -18,15 +18,10 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include -#include #include -#include -#include #include -#include -#include +#include "idvec.h" #include "ugids.h" /* Verify that we have the right to the ids in UGIDS, given that we already diff --git a/libshouldbeinlibc/ugids.c b/libshouldbeinlibc/ugids.c index 2b9b6b71..db1ce3c8 100644 --- a/libshouldbeinlibc/ugids.c +++ b/libshouldbeinlibc/ugids.c @@ -21,6 +21,7 @@ #include #include +#include "idvec.h" #include "ugids.h" /* Return a new ugids structure, or 0 if an allocation error occurs. */ diff --git a/libshouldbeinlibc/ugids.h b/libshouldbeinlibc/ugids.h index 10e7a242..5d0e1134 100644 --- a/libshouldbeinlibc/ugids.h +++ b/libshouldbeinlibc/ugids.h @@ -24,6 +24,8 @@ #include /* For inline function stuff. */ #include #include +#include +#include #ifdef UGIDS_DEFINE_EI #define UGIDS_EI diff --git a/libshouldbeinlibc/wire.c b/libshouldbeinlibc/wire.c index bafc9599..b9540955 100644 --- a/libshouldbeinlibc/wire.c +++ b/libshouldbeinlibc/wire.c @@ -21,9 +21,9 @@ #include #include -#include #include #include +#include #pragma weak _DYNAMIC #pragma weak dlopen -- cgit v1.2.3 From e971ab1a229d1ef1d5c1e5e1ff52ec597c55270e Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Mon, 11 Nov 2013 20:53:07 +0100 Subject: libports: implement lockless management of threads ports_manage_port_operations_multithread uses two values, totalthreads and nreqthreads, to manage the threads it creates. Previously a lock was used to synchronize the access to them. Use atomic operations instead. * libports/manage-multithread.c (ports_manage_port_operations_multithread): Use atomic operations instead of a lock to synchronize the access to totalthreads and nreqthreads. --- libports/manage-multithread.c | 53 +++++++++++++++---------------------------- 1 file changed, 18 insertions(+), 35 deletions(-) diff --git a/libports/manage-multithread.c b/libports/manage-multithread.c index 0c2da005..842665a5 100644 --- a/libports/manage-multithread.c +++ b/libports/manage-multithread.c @@ -91,9 +91,12 @@ ports_manage_port_operations_multithread (struct port_bucket *bucket, int global_timeout, void (*hook)()) { - volatile unsigned int nreqthreads; - volatile unsigned int totalthreads; - pthread_spinlock_t lock = PTHREAD_SPINLOCK_INITIALIZER; + /* totalthreads is the number of total threads created. nreqthreads + is the number of threads not currently servicing any client. The + initial values account for the main thread. */ + unsigned int totalthreads = 1; + unsigned int nreqthreads = 1; + pthread_attr_t attr; auto void * thread_function (void *); @@ -120,30 +123,22 @@ ports_manage_port_operations_multithread (struct port_bucket *bucket, /* msgt_unused = */ 0 }; - pthread_spin_lock (&lock); - assert (nreqthreads); - nreqthreads--; - if (nreqthreads != 0) - pthread_spin_unlock (&lock); - else + if (__atomic_sub_fetch (&nreqthreads, 1, __ATOMIC_RELAXED) == 0) /* No thread would be listening for requests, spawn one. */ { pthread_t pthread_id; error_t err; - totalthreads++; - nreqthreads++; - pthread_spin_unlock (&lock); + __atomic_add_fetch (&totalthreads, 1, __ATOMIC_RELAXED); + __atomic_add_fetch (&nreqthreads, 1, __ATOMIC_RELAXED); err = pthread_create (&pthread_id, &attr, thread_function, NULL); if (!err) pthread_detach (pthread_id); else { - pthread_spin_lock (&lock); - totalthreads--; - nreqthreads--; - pthread_spin_unlock (&lock); + __atomic_sub_fetch (&totalthreads, 1, __ATOMIC_RELAXED); + __atomic_sub_fetch (&nreqthreads, 1, __ATOMIC_RELAXED); /* There is not much we can do at this point. The code and design of the Hurd servers just don't handle thread creation failure. */ @@ -189,9 +184,7 @@ ports_manage_port_operations_multithread (struct port_bucket *bucket, status = 1; } - pthread_spin_lock (&lock); - nreqthreads++; - pthread_spin_unlock (&lock); + __atomic_add_fetch (&nreqthreads, 1, __ATOMIC_RELAXED); return status; } @@ -203,8 +196,7 @@ ports_manage_port_operations_multithread (struct port_bucket *bucket, int timeout; error_t err; - /* No need to lock as an approximation is sufficient. */ - adjust_priority (totalthreads); + adjust_priority (__atomic_load_n (&totalthreads, __ATOMIC_RELAXED)); if (hook) (*hook) (); @@ -224,30 +216,21 @@ ports_manage_port_operations_multithread (struct port_bucket *bucket, if (master) { - pthread_spin_lock (&lock); - if (totalthreads != 1) - { - pthread_spin_unlock (&lock); - goto startover; - } + if (__atomic_load_n (&totalthreads, __ATOMIC_RELAXED) != 1) + goto startover; } else { - pthread_spin_lock (&lock); - if (nreqthreads == 1) + if (__atomic_sub_fetch (&nreqthreads, 1, __ATOMIC_RELAXED) == 0) { /* No other thread is listening for requests, continue. */ - pthread_spin_unlock (&lock); + __atomic_add_fetch (&nreqthreads, 1, __ATOMIC_RELAXED); goto startover; } - nreqthreads--; - totalthreads--; - pthread_spin_unlock (&lock); + __atomic_sub_fetch (&totalthreads, 1, __ATOMIC_RELAXED); } return NULL; } - nreqthreads = 1; - totalthreads = 1; thread_function ((void *) 1); } -- cgit v1.2.3