[libvirt] [PATCH 3/8] Force usage of virThreadCreate

Jiri Denemark jdenemar at redhat.com
Mon Mar 23 13:26:02 UTC 2015


We want all threads to be set as workers or to have a job assigned to
them, which can easily be achieved in virThreadCreate wrapper to
pthread_create. Let's make sure we always use the wrapper.

Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---
 cfg.mk                              |  9 +++++++++
 src/nwfilter/nwfilter_learnipaddr.c | 15 ++++++---------
 src/nwfilter/nwfilter_learnipaddr.h |  1 -
 3 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/cfg.mk b/cfg.mk
index 6885f9e..661cccc 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -999,6 +999,12 @@ sc_prohibit_sysconf_pagesize:
 	halt='use virGetSystemPageSize[KB] instead of sysconf(_SC_PAGESIZE)' \
 	  $(_sc_search_regexp)
 
+sc_prohibit_pthread_create:
+	@prohibit='\bpthread_create\b' \
+	exclude='sc_prohibit_pthread_create' \
+	halt="avoid using 'pthread_create', use 'virThreadCreate' instead" \
+	  $(_sc_search_regexp)
+
 # We don't use this feature of maint.mk.
 prev_version_file = /dev/null
 
@@ -1192,3 +1198,6 @@ exclude_file_name_regexp--sc_prohibit_virXXXFree = \
 
 exclude_file_name_regexp--sc_prohibit_sysconf_pagesize = \
   ^(cfg\.mk|src/util/virutil\.c)$$
+
+exclude_file_name_regexp--sc_prohibit_pthread_create = \
+  ^(cfg\.mk|src/util/virthread\.c|tests/.*)$$
diff --git a/src/nwfilter/nwfilter_learnipaddr.c b/src/nwfilter/nwfilter_learnipaddr.c
index 1b875c3..5b55055 100644
--- a/src/nwfilter/nwfilter_learnipaddr.c
+++ b/src/nwfilter/nwfilter_learnipaddr.c
@@ -374,7 +374,7 @@ procDHCPOpts(struct dhcp *dhcp, int dhcp_opts_len,
  * will require that the IP address was taken from an ARP packet or an IPv4
  * packet. Both flags can be set at the same time.
  */
-static void *
+static void
 learnIPAddressThread(void *arg)
 {
     char errbuf[PCAP_ERRBUF_SIZE] = {0};
@@ -638,8 +638,6 @@ learnIPAddressThread(void *arg)
         techdriver->applyDropAllRules(req->ifname);
     }
 
-    memset(&req->thread, 0x0, sizeof(req->thread));
-
     VIR_DEBUG("pcap thread terminating for interface %s\n", req->ifname);
 
     virNWFilterUnlockIface(req->ifname);
@@ -648,8 +646,6 @@ learnIPAddressThread(void *arg)
     virNWFilterDeregisterLearnReq(req->ifindex);
 
     virNWFilterIPAddrLearnReqFree(req);
-
-    return 0;
 }
 
 
@@ -686,6 +682,7 @@ virNWFilterLearnIPAddress(virNWFilterTechDriverPtr techdriver,
                           enum howDetect howDetect)
 {
     int rc;
+    virThread thread;
     virNWFilterIPAddrLearnReqPtr req = NULL;
     virNWFilterHashTablePtr ht = NULL;
 
@@ -742,10 +739,10 @@ virNWFilterLearnIPAddress(virNWFilterTechDriverPtr techdriver,
     if (rc < 0)
         goto err_free_req;
 
-    if (pthread_create(&req->thread,
-                       NULL,
-                       learnIPAddressThread,
-                       req) != 0)
+    if (virThreadCreate(&thread,
+                        false,
+                        learnIPAddressThread,
+                        req) != 0)
         goto err_dereg_req;
 
     return 0;
diff --git a/src/nwfilter/nwfilter_learnipaddr.h b/src/nwfilter/nwfilter_learnipaddr.h
index 1cc881a..b93ed38 100644
--- a/src/nwfilter/nwfilter_learnipaddr.h
+++ b/src/nwfilter/nwfilter_learnipaddr.h
@@ -49,7 +49,6 @@ struct _virNWFilterIPAddrLearnReq {
     enum howDetect howDetect;
 
     int status;
-    pthread_t thread;
     volatile bool terminate;
 };
 
-- 
2.3.3




More information about the libvir-list mailing list