|
1 | 1 | function New-IcingaThreadInstance() |
2 | 2 | { |
3 | 3 | param ( |
4 | | - [string]$Name, |
5 | | - $ThreadPool, |
6 | | - [ScriptBlock]$ScriptBlock, |
7 | | - [string]$Command, |
8 | | - [hashtable]$CmdParameters, |
9 | | - [array]$Arguments, |
10 | | - [Switch]$Start |
| 4 | + [string]$Name = '', |
| 5 | + [string]$ThreadName = $null, |
| 6 | + $ThreadPool = $null, |
| 7 | + [ScriptBlock]$ScriptBlock = $null, |
| 8 | + [string]$Command = '', |
| 9 | + [hashtable]$CmdParameters = @{ }, |
| 10 | + [array]$Arguments = @(), |
| 11 | + [Switch]$Start = $FALSE, |
| 12 | + [switch]$CheckAliveState = $FALSE |
11 | 13 | ); |
12 | 14 |
|
13 | | - $CallStack = Get-PSCallStack; |
14 | | - $SourceCommand = $CallStack[1].Command; |
| 15 | + if ([string]::IsNullOrEmpty($ThreadName)) { |
| 16 | + $CallStack = Get-PSCallStack; |
| 17 | + $SourceCommand = $CallStack[1].Command; |
15 | 18 |
|
16 | | - if ([string]::IsNullOrEmpty($Name)) { |
17 | | - $Name = New-IcingaThreadHash -ShellScript $ScriptBlock -Arguments $Arguments; |
18 | | - } |
| 19 | + if ([string]::IsNullOrEmpty($Name)) { |
| 20 | + $Name = New-IcingaThreadHash -ShellScript $ScriptBlock -Arguments $Arguments; |
| 21 | + } |
| 22 | + |
| 23 | + $ThreadName = [string]::Format('{0}::{1}::{2}::0', $SourceCommand, $Command, $Name); |
| 24 | + |
| 25 | + [int]$ThreadIndex = 0; |
| 26 | + |
| 27 | + while ($TRUE) { |
| 28 | + |
| 29 | + if ($Global:Icinga.Public.Threads.ContainsKey($ThreadName) -eq $FALSE) { |
| 30 | + break; |
| 31 | + } |
19 | 32 |
|
20 | | - $ThreadName = [string]::Format('{0}::{1}::{2}::0', $SourceCommand, $Command, $Name); |
| 33 | + $ThreadIndex += 1; |
| 34 | + $ThreadName = [string]::Format('{0}::{1}::{2}::{3}', $SourceCommand, $Command, $Name, $ThreadIndex); |
| 35 | + } |
| 36 | + } |
21 | 37 |
|
22 | 38 | Write-IcingaDebugMessage -Message ( |
23 | 39 | [string]::Format( |
@@ -51,6 +67,9 @@ function New-IcingaThreadInstance() |
51 | 67 | [void]$Shell.AddParameter('JeaEnabled', $Global:Icinga.Protected.JEAContext); |
52 | 68 | } |
53 | 69 |
|
| 70 | + [void]$Shell.AddCommand('Set-IcingaEnvironmentThreadName'); |
| 71 | + [void]$Shell.AddParameter('ThreadName', $ThreadName); |
| 72 | + |
54 | 73 | [void]$Shell.AddCommand($Command); |
55 | 74 |
|
56 | 75 | $CodeHash = $Command; |
@@ -94,16 +113,13 @@ function New-IcingaThreadInstance() |
94 | 113 | Add-Member -InputObject $Thread -MemberType NoteProperty -Name Started -Value $FALSE; |
95 | 114 | } |
96 | 115 |
|
97 | | - [int]$ThreadIndex = 0; |
98 | | - |
99 | | - while ($TRUE) { |
100 | | - |
101 | | - if ($Global:Icinga.Public.Threads.ContainsKey($ThreadName) -eq $FALSE) { |
102 | | - $Global:Icinga.Public.Threads.Add($ThreadName, $Thread); |
103 | | - break; |
104 | | - } |
| 116 | + $Global:Icinga.Public.Threads.Add($ThreadName, $Thread); |
105 | 117 |
|
106 | | - $ThreadIndex += 1; |
107 | | - $ThreadName = [string]::Format('{0}::{1}::{2}::{3}', $SourceCommand, $Command, $Name, $ThreadIndex); |
| 118 | + if ($CheckAliveState) { |
| 119 | + Set-IcingaForWindowsThreadAlive ` |
| 120 | + -ThreadName $ThreadName ` |
| 121 | + -ThreadCmd $Command ` |
| 122 | + -ThreadArgs $CmdParameters ` |
| 123 | + -ThreadPool $ThreadPool; |
108 | 124 | } |
109 | 125 | } |
0 commit comments