[dpdk-dev] [PATCH v3] eal/windows: fix invalid thread handle

Tasnim Bashar tbashar at mellanox.com
Tue Jun 16 20:53:09 CEST 2020


> From: Thomas Monjalon <thomas at monjalon.net>
> 02/06/2020 04:00, Tasnim Bashar:
> > Casting thread ID to handle is not accurate way to get thread handle.
> > Need to use OpenThread function to get thread handle from thread ID.
> >
> > pthread_setaffinity_np and pthread_getaffinity_np functions for
> > Windows are affected because of it.
> >
> > Signed-off-by: Tasnim Bashar <tbashar at mellanox.com>
> > ---
> > v3: WA to remove warning(-Wmaybe-uninitialized)
> 
> The -Wmaybe-uninitialized warning was there before this patch.
> Shouldn't it be a separate patch before this one?

The warning appeared only on this patch, so we don't need to separate it
> 
> >  static inline int
> > -eal_get_thread_affinity_mask(pthread_t threadid, unsigned long
> > *cpuset)
> > +eal_get_thread_affinity_mask(pthread_t threadid, rte_cpuset_t
> > +*cpuset)
> >  {
> >  	/* Workaround for the lack of a GetThreadAffinityMask()
> >  	 *API in Windows
> >  	 */
> > -		/* obtain previous mask by setting dummy mask */
> > -	DWORD dwprevaffinitymask =
> > -		SetThreadAffinityMask((HANDLE) threadid, 0x1);
> > +	DWORD_PTR dwprevaffinitymask;
> 
> Please use underscores to separate parts in names.
> 
> > +	HANDLE thread_handle;
> > +	DWORD_PTR ret;
> > +
> > +	thread_handle = OpenThread(THREAD_ALL_ACCESS, FALSE, threadid);
> > +	if (thread_handle == NULL) {
> > +		RTE_LOG_WIN32_ERR("OpenThread()");
> > +		return -1;
> > +	}
> > +
> > +	/* obtain previous mask by setting dummy mask */
> > +	dwprevaffinitymask = SetThreadAffinityMask(thread_handle, 0x1);
> > +	if (dwprevaffinitymask == 0) {
> > +		RTE_LOG_WIN32_ERR("SetThreadAffinityMask()");
> > +		CloseHandle(thread_handle);
> > +		return -1;
> > +	}
> > +
> >  	/* set it back! */
> > -	SetThreadAffinityMask((HANDLE) threadid, dwprevaffinitymask);
> > -	*cpuset = dwprevaffinitymask;
> > +	ret = SetThreadAffinityMask(thread_handle, dwprevaffinitymask);
> > +	if (ret == 0) {
> > +		RTE_LOG_WIN32_ERR("SetThreadAffinityMask()");
> > +		CloseHandle(thread_handle);
> > +		return -1;
> > +	}
> > +	memset(cpuset, 0, sizeof(rte_cpuset_t));
> 
> Shouldn't we use RTE_CPU_ZERO instead of memset?
If we use CPU_ZERO or CPU_SET, we still get the same warning!
> 
> > +	*cpuset->_bits = dwprevaffinitymask;
> > +	CloseHandle(thread_handle);
> >  	return 0;
> >  }
> 
> 



More information about the dev mailing list