On 09/29/2012 03:07 PM, Benjamin Wang (gendwang) wrote:
Hi,
Currently virInitialize() method defined in libvirt.c has the
following code:
int
virInitialize(void)
{
if (initialized)
return 0;
initialized = 1;
if (virThreadInitialize() < 0 ||
virErrorInitialize() < 0 ||
virRandomInitialize(time(NULL) ^ getpid()) ||
virNodeSuspendInit() < 0)
return -1;
......
}
When two threads access virInitialize method, there is no lock for the
"initialized" parameter. If the first thread enters this method and
set "initialized" to 1,
the second thread could see that "initialized" is 1(Because
initialized is not volatiled, I say could). In some situation, before
the first thread finishes all the initialization,
the second thread could use some resources which should be initialized
in Initialize method.
If you have any comments, please let me know. Thanks!
B.R.
Benjamin Wang
As the comments above the function said,
"It's better to call this routine at startup in multithreaded
applications to avoid potential race when initializing the library."
Guannan