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:
Erik Skultety 2017-06-20 16:09:33 +02:00
parent cdbe13329a
commit caf26412b6
3 changed files with 34 additions and 0 deletions

View File

@ -1756,6 +1756,7 @@ virFileStripSuffix;
virFileTouch; virFileTouch;
virFileUnlock; virFileUnlock;
virFileUpdatePerm; virFileUpdatePerm;
virFileWaitForExists;
virFileWrapperFdClose; virFileWrapperFdClose;
virFileWrapperFdFree; virFileWrapperFdFree;
virFileWrapperFdNew; virFileWrapperFdNew;

View File

@ -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;
}

View File

@ -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,