提交 caf26412 编写于 作者: E Erik Skultety

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: NErik Skultety <eskultet@redhat.com>
上级 cdbe1332
......@@ -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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册