summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2022-04-08 18:54:26 +0200
committerVladislav Vaintroub <wlad@mariadb.com>2022-04-11 07:49:43 +0200
commit5a4a37076db1f3a77a40c9636b96eef5625b3d81 (patch)
tree6577128eba58b58b7da79c1aae27614eea847e05
parent284ff64cd6618ac9f90c182d46fa6f03b301b65b (diff)
downloadmariadb-git-5a4a37076db1f3a77a40c9636b96eef5625b3d81.tar.gz
MDEV-10183 implement service_manager_extend_timeout on Windows
The implementation calls SetServiceStatus() with updated SERVICE_STATUS::dwHint and SERVICE_STATUS::dwCheckpoint
-rw-r--r--include/my_service_manager.h7
-rw-r--r--sql/mysqld.cc6
-rw-r--r--sql/mysqld.h1
-rw-r--r--sql/winmain.cc3
4 files changed, 15 insertions, 2 deletions
diff --git a/include/my_service_manager.h b/include/my_service_manager.h
index 3eff1253f20..498fc762048 100644
--- a/include/my_service_manager.h
+++ b/include/my_service_manager.h
@@ -43,7 +43,12 @@
#define SD_LISTEN_FDS_START (0)
#define sd_notify(X, Y)
#define sd_notifyf(E, F, ...)
-#define service_manager_extend_timeout(I, FMTSTR, ...)
+#ifdef _WIN32
+ #define service_manager_extend_timeout(I, F, ...) \
+ mysqld_win_extend_service_timeout(I)
+#else
+ #define service_manager_extend_timeout(I, FMTSTR, ...)
+#endif
#endif
#endif /* MY_SERVICE_MANAGER_INCLUDED */
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index c3f745b4aae..a4220851fb6 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -2752,6 +2752,12 @@ void mysqld_win_set_startup_complete()
}
+void mysqld_win_extend_service_timeout(DWORD sec)
+{
+ my_report_svc_status((DWORD)-1, 0, 2*1000*sec);
+}
+
+
void mysqld_win_set_service_name(const char *name)
{
if (stricmp(name, "mysql"))
diff --git a/sql/mysqld.h b/sql/mysqld.h
index d0a33fabb51..7d41f61c4df 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -968,6 +968,7 @@ extern int mysqld_main(int argc, char **argv);
extern HANDLE hEventShutdown;
extern void mysqld_win_initiate_shutdown();
extern void mysqld_win_set_startup_complete();
+extern void mysqld_win_extend_service_timeout(DWORD sec);
extern void mysqld_set_service_status_callback(void (*)(DWORD, DWORD, DWORD));
extern void mysqld_win_set_service_name(const char *name);
#endif
diff --git a/sql/winmain.cc b/sql/winmain.cc
index f999767cb27..7def0aed531 100644
--- a/sql/winmain.cc
+++ b/sql/winmain.cc
@@ -81,7 +81,8 @@ static void report_svc_status(DWORD current_state, DWORD exit_code, DWORD wait_h
return;
static DWORD check_point= 1;
- svc_status.dwCurrentState= current_state;
+ if (current_state != (DWORD)-1)
+ svc_status.dwCurrentState= current_state;
svc_status.dwWaitHint= wait_hint;
if (exit_code)