summaryrefslogtreecommitdiff
path: root/server-tools/instance-manager/instance.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server-tools/instance-manager/instance.cc')
-rw-r--r--server-tools/instance-manager/instance.cc45
1 files changed, 23 insertions, 22 deletions
diff --git a/server-tools/instance-manager/instance.cc b/server-tools/instance-manager/instance.cc
index 39381b457ab..2ed369ba245 100644
--- a/server-tools/instance-manager/instance.cc
+++ b/server-tools/instance-manager/instance.cc
@@ -469,37 +469,38 @@ int Instance::stop()
struct timespec timeout;
uint waitchild= (uint) DEFAULT_SHUTDOWN_DELAY;
- if (options.shutdown_delay_val)
- waitchild= options.shutdown_delay_val;
+ if (is_running())
+ {
+ if (options.shutdown_delay_val)
+ waitchild= options.shutdown_delay_val;
- kill_instance(SIGTERM);
- /* sleep on condition to wait for SIGCHLD */
+ kill_instance(SIGTERM);
+ /* sleep on condition to wait for SIGCHLD */
- timeout.tv_sec= time(NULL) + waitchild;
- timeout.tv_nsec= 0;
- if (pthread_mutex_lock(&LOCK_instance))
- goto err;
+ timeout.tv_sec= time(NULL) + waitchild;
+ timeout.tv_nsec= 0;
+ if (pthread_mutex_lock(&LOCK_instance))
+ return ER_STOP_INSTANCE;
- while (options.get_pid() != 0) /* while server isn't stopped */
- {
- int status;
+ while (options.get_pid() != 0) /* while server isn't stopped */
+ {
+ int status;
- status= pthread_cond_timedwait(&COND_instance_stopped,
- &LOCK_instance,
- &timeout);
- if (status == ETIMEDOUT || status == ETIME)
- break;
- }
+ status= pthread_cond_timedwait(&COND_instance_stopped,
+ &LOCK_instance,
+ &timeout);
+ if (status == ETIMEDOUT || status == ETIME)
+ break;
+ }
- pthread_mutex_unlock(&LOCK_instance);
+ pthread_mutex_unlock(&LOCK_instance);
- kill_instance(SIGKILL);
+ kill_instance(SIGKILL);
- return 0;
+ return 0;
+ }
return ER_INSTANCE_IS_NOT_STARTED;
-err:
- return ER_STOP_INSTANCE;
}
#ifdef __WIN__