@@ -106,79 +106,90 @@ func New() APIImplementor {
106
106
}
107
107
108
108
func (APIImplementor ) GetBIOSSerialNumber () (string , error ) {
109
- bios , err := cim .QueryBIOSElement (cim .BIOSSelectorList )
110
- if err != nil {
111
- return "" , fmt .Errorf ("failed to get BIOS element: %w" , err )
112
- }
109
+ var sn string
110
+ err := cim .WithCOMThread (func () error {
111
+ bios , err := cim .QueryBIOSElement (cim .BIOSSelectorList )
112
+ if err != nil {
113
+ return fmt .Errorf ("failed to get BIOS element: %w" , err )
114
+ }
113
115
114
- sn , err : = cim .GetBIOSSerialNumber (bios )
115
- if err != nil {
116
- return "" , fmt .Errorf ("failed to get BIOS serial number property: %w" , err )
117
- }
116
+ sn , err = cim .GetBIOSSerialNumber (bios )
117
+ if err != nil {
118
+ return fmt .Errorf ("failed to get BIOS serial number property: %w" , err )
119
+ }
118
120
119
- return sn , nil
121
+ return nil
122
+ })
123
+ return sn , err
120
124
}
121
125
122
126
func (impl APIImplementor ) GetService (name string ) (* ServiceInfo , error ) {
123
- service , err := impl .serviceFactory .GetService (name )
124
- if err != nil {
125
- return nil , fmt .Errorf ("failed to get service %s: %w" , name , err )
126
- }
127
+ var serviceInfo * ServiceInfo
128
+ err := cim .WithCOMThread (func () error {
129
+ service , err := impl .serviceFactory .GetService (name )
130
+ if err != nil {
131
+ return fmt .Errorf ("failed to get service %s: %w" , name , err )
132
+ }
127
133
128
- displayName , err := cim .GetServiceDisplayName (service )
129
- if err != nil {
130
- return nil , fmt .Errorf ("failed to get displayName property of service %s: %w" , name , err )
131
- }
134
+ displayName , err := cim .GetServiceDisplayName (service )
135
+ if err != nil {
136
+ return fmt .Errorf ("failed to get displayName property of service %s: %w" , name , err )
137
+ }
132
138
133
- state , err := cim .GetServiceState (service )
134
- if err != nil {
135
- return nil , fmt .Errorf ("failed to get state property of service %s: %w" , name , err )
136
- }
139
+ state , err := cim .GetServiceState (service )
140
+ if err != nil {
141
+ return fmt .Errorf ("failed to get state property of service %s: %w" , name , err )
142
+ }
137
143
138
- startMode , err := cim .GetServiceStartMode (service )
139
- if err != nil {
140
- return nil , fmt .Errorf ("failed to get startMode property of service %s: %w" , name , err )
141
- }
144
+ startMode , err := cim .GetServiceStartMode (service )
145
+ if err != nil {
146
+ return fmt .Errorf ("failed to get startMode property of service %s: %w" , name , err )
147
+ }
142
148
143
- return & ServiceInfo {
144
- DisplayName : displayName ,
145
- StartType : serviceStartModeToStartType (startMode ),
146
- Status : serviceState (state ),
147
- }, nil
149
+ serviceInfo = & ServiceInfo {
150
+ DisplayName : displayName ,
151
+ StartType : serviceStartModeToStartType (startMode ),
152
+ Status : serviceState (state ),
153
+ }
154
+ return nil
155
+ })
156
+ return serviceInfo , err
148
157
}
149
158
150
159
func (impl APIImplementor ) StartService (name string ) error {
151
- startService := func (service cim.ServiceInterface ) error {
152
- retVal , err := service .StartService ()
153
- if err != nil || (retVal != startServiceErrorCodeAccepted && retVal != startServiceErrorCodeAlreadyRunning ) {
154
- return fmt .Errorf ("error starting service name %s. return value: %d, error: %v" , name , retVal , err )
155
- }
156
- return nil
157
- }
158
- serviceRunningCheck := func () (bool , string , cim.ServiceInterface , error ) {
159
- service , err := impl .serviceFactory .GetService (name )
160
- if err != nil {
161
- return false , "" , nil , err
160
+ return cim .WithCOMThread (func () error {
161
+ startService := func (service cim.ServiceInterface ) error {
162
+ retVal , err := service .StartService ()
163
+ if err != nil || (retVal != startServiceErrorCodeAccepted && retVal != startServiceErrorCodeAlreadyRunning ) {
164
+ return fmt .Errorf ("error starting service name %s. return value: %d, error: %v" , name , retVal , err )
165
+ }
166
+ return nil
162
167
}
168
+ serviceRunningCheck := func () (bool , string , cim.ServiceInterface , error ) {
169
+ service , err := impl .serviceFactory .GetService (name )
170
+ if err != nil {
171
+ return false , "" , nil , err
172
+ }
163
173
164
- state , err := cim .GetServiceState (service )
165
- if err != nil {
166
- return false , state , service , err
167
- }
174
+ state , err := cim .GetServiceState (service )
175
+ if err != nil {
176
+ return false , state , service , err
177
+ }
168
178
169
- return state == serviceStateRunning , state , service , err
170
- }
179
+ return state == serviceStateRunning , state , service , err
180
+ }
171
181
172
- state , err := impl .serviceManager .WaitUntilServiceState (startService , serviceRunningCheck , serviceStateCheckInternal , serviceStateCheckTimeout )
173
- if err != nil && ! errors .Is (err , errTimedOut ) {
174
- return err
175
- }
182
+ state , err := impl .serviceManager .WaitUntilServiceState (startService , serviceRunningCheck , serviceStateCheckInternal , serviceStateCheckTimeout )
183
+ if err != nil && ! errors .Is (err , errTimedOut ) {
184
+ return err
185
+ }
176
186
177
- if state != serviceStateRunning {
178
- return fmt .Errorf ("timed out waiting for service %s to become running" , name )
179
- }
187
+ if state != serviceStateRunning {
188
+ return fmt .Errorf ("timed out waiting for service %s to become running" , name )
189
+ }
180
190
181
- return nil
191
+ return nil
192
+ })
182
193
}
183
194
184
195
func (impl APIImplementor ) stopSingleService (name string ) (bool , error ) {
@@ -221,24 +232,26 @@ func (impl APIImplementor) stopSingleService(name string) (bool, error) {
221
232
}
222
233
223
234
func (impl APIImplementor ) StopService (name string , force bool ) error {
224
- dependentRunning , err := impl .stopSingleService (name )
225
- if err == nil || ! dependentRunning || ! force {
226
- return err
227
- }
228
-
229
- serviceNames , err := impl .serviceManager .GetDependentsForService (name )
230
- if err != nil {
231
- return fmt .Errorf ("error getting dependent services for service name %s" , name )
232
- }
235
+ return cim .WithCOMThread (func () error {
236
+ dependentRunning , err := impl .stopSingleService (name )
237
+ if err == nil || ! dependentRunning || ! force {
238
+ return err
239
+ }
233
240
234
- for _ , serviceName := range serviceNames {
235
- _ , err = impl .stopSingleService (serviceName )
241
+ serviceNames , err := impl .serviceManager .GetDependentsForService (name )
236
242
if err != nil {
237
- return err
243
+ return fmt .Errorf ("error getting dependent services for service name %s" , name )
244
+ }
245
+
246
+ for _ , serviceName := range serviceNames {
247
+ _ , err = impl .stopSingleService (serviceName )
248
+ if err != nil {
249
+ return err
250
+ }
238
251
}
239
- }
240
252
241
- return nil
253
+ return nil
254
+ })
242
255
}
243
256
244
257
type ServiceManagerImpl struct {
0 commit comments