mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 19:41:16 +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;
|
virFileTouch;
|
||||||
virFileUnlock;
|
virFileUnlock;
|
||||||
virFileUpdatePerm;
|
virFileUpdatePerm;
|
||||||
|
virFileWaitForExists;
|
||||||
virFileWrapperFdClose;
|
virFileWrapperFdClose;
|
||||||
virFileWrapperFdFree;
|
virFileWrapperFdFree;
|
||||||
virFileWrapperFdNew;
|
virFileWrapperFdNew;
|
||||||
|
@ -4177,3 +4177,34 @@ virFileReadValueString(char **value, const char *format, ...)
|
|||||||
VIR_FREE(str);
|
VIR_FREE(str);
|
||||||
return ret;
|
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, ...)
|
int virFileReadValueString(char **value, const char *format, ...)
|
||||||
ATTRIBUTE_FMT_PRINTF(2, 3);
|
ATTRIBUTE_FMT_PRINTF(2, 3);
|
||||||
|
|
||||||
|
int virFileWaitForExists(const char *path, size_t ms, size_t tries);
|
||||||
|
|
||||||
|
|
||||||
int virFileInData(int fd,
|
int virFileInData(int fd,
|
||||||
int *inData,
|
int *inData,
|
||||||
|
Loading…
Reference in New Issue
Block a user