mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-20 07:59:00 +00:00
util: Introduce virFileWaitForExists
Since we have a number of places where we workaround timing issues with devices, attributes (files in general) not being available at the time of processing them by calling usleep in a loop for a fixed number of tries, we could as well have a utility function that would do that. Therefore we won't have to duplicate this ugly workaround even more. Signed-off-by: Erik Skultety <eskultet@redhat.com>
This commit is contained in:
parent
cdbe13329a
commit
caf26412b6
@ -1756,6 +1756,7 @@ virFileStripSuffix;
|
||||
virFileTouch;
|
||||
virFileUnlock;
|
||||
virFileUpdatePerm;
|
||||
virFileWaitForExists;
|
||||
virFileWrapperFdClose;
|
||||
virFileWrapperFdFree;
|
||||
virFileWrapperFdNew;
|
||||
|
@ -4177,3 +4177,34 @@ virFileReadValueString(char **value, const char *format, ...)
|
||||
VIR_FREE(str);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* virFileWaitForExists:
|
||||
* @path: absolute path to a sysfs attribute (can be a symlink)
|
||||
* @ms: how long to wait (in milliseconds)
|
||||
* @tries: how many times should we try to wait for @path to become accessible
|
||||
*
|
||||
* Checks the existence of @path. In case the file defined by @path
|
||||
* doesn't exist, we wait for it to appear in @ms milliseconds (for up to
|
||||
* @tries attempts).
|
||||
*
|
||||
* Returns 0 on success, -1 on error, setting errno appropriately.
|
||||
*/
|
||||
int
|
||||
virFileWaitForExists(const char *path,
|
||||
size_t ms,
|
||||
size_t tries)
|
||||
{
|
||||
errno = 0;
|
||||
|
||||
/* wait for @path to be accessible in @ms milliseconds, up to @tries */
|
||||
while (tries-- > 0 && !virFileExists(path)) {
|
||||
if (tries == 0 || errno != ENOENT)
|
||||
return -1;
|
||||
|
||||
usleep(ms * 1000);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -349,6 +349,8 @@ int virFileReadValueScaledInt(unsigned long long *value, const char *format, ...
|
||||
int virFileReadValueString(char **value, const char *format, ...)
|
||||
ATTRIBUTE_FMT_PRINTF(2, 3);
|
||||
|
||||
int virFileWaitForExists(const char *path, size_t ms, size_t tries);
|
||||
|
||||
|
||||
int virFileInData(int fd,
|
||||
int *inData,
|
||||
|
Loading…
x
Reference in New Issue
Block a user