return ret;
}
+typedef struct _virDomainDriverAutoStartState {
+ virDomainDriverAutoStartConfig *cfg;
+ bool first;
+} virDomainDriverAutoStartState;
+
static int
virDomainDriverAutoStartOne(virDomainObj *vm,
void *opaque)
{
- virDomainDriverAutoStartConfig *cfg = opaque;
+ virDomainDriverAutoStartState *state = opaque;
virObjectLock(vm);
virObjectRef(vm);
if (vm->autostart && !virDomainObjIsActive(vm)) {
virResetLastError();
- cfg->callback(vm, cfg->opaque);
+ if (state->cfg->delayMS) {
+ if (!state->first) {
+ g_usleep(state->cfg->delayMS * 1000ull);
+ } else {
+ state->first = false;
+ }
+ }
+
+ state->cfg->callback(vm, state->cfg->opaque);
}
virDomainObjEndAPI(&vm);
virDomainDriverAutoStart(virDomainObjList *domains,
virDomainDriverAutoStartConfig *cfg)
{
+ virDomainDriverAutoStartState state = { .cfg = cfg, .first = true };
bool autostart;
VIR_DEBUG("Run autostart stateDir=%s", cfg->stateDir);
if (virDriverShouldAutostart(cfg->stateDir, &autostart) < 0 ||
return;
}
- virDomainObjListForEach(domains, false, virDomainDriverAutoStartOne, cfg);
+ virDomainObjListForEach(domains, false, virDomainDriverAutoStartOne, &state);
}
const char *stateDir;
virDomainDriverAutoStartCallback callback;
void *opaque;
+ unsigned int delayMS; /* milliseconds to wait between initiating the
+ * startup of each guest */
} virDomainDriverAutoStartConfig;
void virDomainDriverAutoStart(virDomainObjList *domains,