From d6386ac3698aa665bf6fcec1c158f7840ff6b8d1 Mon Sep 17 00:00:00 2001 From: vibe Date: Tue, 7 May 2024 13:00:18 -0700 Subject: [PATCH] Fixes #9208 - puppet agent windows daemon startup inconsistency --- lib/puppet/util/windows/daemon.rb | 47 ++++++++++--------------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/lib/puppet/util/windows/daemon.rb b/lib/puppet/util/windows/daemon.rb index 4c8c949aee0..b895541a41e 100644 --- a/lib/puppet/util/windows/daemon.rb +++ b/lib/puppet/util/windows/daemon.rb @@ -187,25 +187,6 @@ class Daemon SetTheServiceStatus.call(SERVICE_STOPPED, NO_ERROR, 0, 0) end - ThreadProc = FFI::Function.new(:ulong, [:pointer]) do |lpParameter| - ste = FFI::MemoryPointer.new(SERVICE_TABLE_ENTRYW, 2) - - s = SERVICE_TABLE_ENTRYW.new(ste[0]) - s[:lpServiceName] = FFI::MemoryPointer.from_string('') - s[:lpServiceProc] = lpParameter - - s = SERVICE_TABLE_ENTRYW.new(ste[1]) - s[:lpServiceName] = nil - s[:lpServiceProc] = nil - - # No service to step, no service handle, no ruby exceptions, just terminate the thread.. - unless StartServiceCtrlDispatcherW(ste) - return 1 - end - - return 0 - end - # This is a shortcut for Daemon.new + Daemon#mainloop. # def self.mainloop @@ -255,26 +236,28 @@ def mainloop raise SystemCallError.new('CreateEvent', FFI.errno) end - hThread = CreateThread(nil, 0, ThreadProc, Service_Main, 0, nil) + hThread = Thread.new do + ste = FFI::MemoryPointer.new(SERVICE_TABLE_ENTRYW, 2) - if hThread == 0 - raise SystemCallError.new('CreateThread', FFI.errno) - end + s = SERVICE_TABLE_ENTRYW.new(ste[0]) + s[:lpServiceName] = FFI::MemoryPointer.from_string("") + s[:lpServiceProc] = Service_Main - events = FFI::MemoryPointer.new(:pointer, 2) - events.put_pointer(0, FFI::Pointer.new(hThread)) - events.put_pointer(FFI::Pointer.size, FFI::Pointer.new(@@hStartEvent)) + s = SERVICE_TABLE_ENTRYW.new(ste[1]) + s[:lpServiceName] = nil + s[:lpServiceProc] = nil - while (index = WaitForMultipleObjects(2, events, 0, 1000)) == WAIT_TIMEOUT + # No service to step, no service handle, no ruby exceptions, just terminate the thread.. + StartServiceCtrlDispatcherW(ste) end - if index == WAIT_FAILED - raise SystemCallError.new('WaitForMultipleObjects', FFI.errno) + while (index = WaitForSingleObject(@@hStartEvent, 1000)) == WAIT_TIMEOUT + # The thread exited, so the show is off. + raise "Service_Main thread exited abnormally" unless hThread.alive? end - # The thread exited, so the show is off. - if index == WAIT_OBJECT_0 - raise "Service_Main thread exited abnormally" + if index == WAIT_FAILED + raise SystemCallError.new("WaitForSingleObject", FFI.errno) end thr = Thread.new do