static-scoped functions highlight unchecked pthread_create problem

Jim Meyering jim at meyering.net
Tue Oct 5 08:03:35 UTC 2010


Now that I've static-scoped another batch of functions,
I'm seeing this new warning:

  proxy.c: In function 'repl_worker':
  proxy.c:796: warning: no return statement in function returning non-void [-Wreturn-type]

repl_worker is returning void* because that's the signature
it must have, since it's used here:

    pthread_create(&tid,NULL,repl_worker,NULL);

pthread_create itself uses the return value from that start_routine
function if ever it returns.  Since repl_worker never returned,
of course, it didn't have a return statement.  However, it made
system calls that could fail.  In this case, it must return,
to indicate their failure.  If pthread_create is failing because there
is too little free memory or no free process table slot, then it would
obviously be better not to infloop here.

Here's a fix:

>From aeb23797cf2e1e8ce6d57ec341235d48abb05e2f Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering at redhat.com>
Date: Tue, 5 Oct 2010 08:02:00 +0200
Subject: [PATCH] don't ignore failed thread creation

* proxy.c (xpthread_create): New macro.
(repl_worker): Use it to diagnose thread creation failure and to
propagate any failure to caller.
---
 proxy.c |   25 ++++++++++++++++---------
 1 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/proxy.c b/proxy.c
index bf4c165..fa25e54 100644
--- a/proxy.c
+++ b/proxy.c
@@ -744,6 +744,16 @@ repl_worker_bcreate (repl_item *item)
 	DPRINTF("%s returning\n",__func__);
 }

+/* Use this to diagnose failed thread creation.  */
+#define xpthread_create(thread, start_routine, msg)			\
+  do {									\
+    int err = pthread_create (thread, NULL, start_routine, NULL);	\
+    if (err) {								\
+      error (0, err, msg);						\
+      return NULL;							\
+    }									\
+  } while (0)
+
 static void *
 repl_worker (void *notused ATTRIBUTE_UNUSED)
 {
@@ -764,15 +774,12 @@ repl_worker (void *notused ATTRIBUTE_UNUSED)
 		switch (item->type) {
 		case REPL_PUT:
 			if (pipe(item->pipes) >= 0) {
-				if (proxy_host) {
-					pthread_create(&prod,NULL,
-						proxy_repl_prod,item);
-				}
-				else {
-					pthread_create(&prod,NULL,
-						proxy_repl_prod_fs,item);
-				}
-				pthread_create(&cons,NULL,proxy_repl_cons,item);
+				xpthread_create(&prod, (proxy_host
+							? proxy_repl_prod
+							: proxy_repl_prod_fs),
+					      "failed to start producer thread");
+				xpthread_create(&cons,proxy_repl_cons,
+					      "failed to start consumer thread");
 				pthread_join(prod,NULL);
 				pthread_join(cons,NULL);
 			}
--
1.7.3.1.45.g9855b


More information about the iwhd-devel mailing list