diff --git a/cfg.mk b/cfg.mk index 6885f9e0f3..661cccc8fa 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 1b875c3ebe..5b5505538f 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 1cc881a782..b93ed38cff 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; };