diff options
Diffstat (limited to 'internal/cpu/worker.go')
| -rw-r--r-- | internal/cpu/worker.go | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/internal/cpu/worker.go b/internal/cpu/worker.go new file mode 100644 index 0000000..06f6812 --- /dev/null +++ b/internal/cpu/worker.go @@ -0,0 +1,87 @@ +// Package cpu provides CPU stress testing with multiple algorithms and chaos modes. +package cpu + +import ( + "context" + "time" +) + +// worker.go implements the worker goroutine loop, chaos controller, and stress dispatching. + +func (s *Stresser) worker(ctx context.Context, id int) { + defer s.wg.Done() + + mode := s.config.Mode + if s.config.ChaosEnabled { + mode = s.getRandomMode() + } + + intensity := s.randomIntensity() + + ticker := time.NewTicker(10 * time.Millisecond) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + if s.config.ChaosEnabled { + s.mu.Lock() + mode = s.current + s.mu.Unlock() + intensity = s.randomIntensity() + } + + s.executeStress(ctx, mode, intensity) + + if s.config.ChaosEnabled { + s.sleepWithJitter(1, 50) + } + } + } +} + +func (s *Stresser) chaosController(ctx context.Context) { + ticker := time.NewTicker(s.config.ChaosInterval) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + s.mu.Lock() + s.current = s.getRandomMode() + s.mu.Unlock() + } + } +} + +func (s *Stresser) executeStress(ctx context.Context, mode Mode, intensity int) { + switch mode { + case ModePrime: + s.stressPrime(ctx, intensity) + case ModeMatrix: + s.stressMatrix(ctx, intensity) + case ModeHash: + s.stressHash(ctx, intensity) + case ModeBitwise: + s.stressBitwise(ctx, intensity) + case ModeFloat: + s.stressFloat(ctx, intensity) + case ModeRecurse: + s.stressRecurse(ctx, intensity) + case ModeCompress: + s.stressCompress(ctx, intensity) + case ModeEncrypt: + s.stressEncrypt(ctx, intensity) + case ModeSort: + s.stressSort(ctx, intensity) + case ModeBusy: + s.stressBusy(ctx, intensity) + case ModeRandom: + randomMode := allModes[s.rand.Intn(len(allModes))] + s.executeStress(ctx, randomMode, intensity) + } +} |
