summaryrefslogtreecommitdiff
path: root/internal/cpu/worker.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/cpu/worker.go')
-rw-r--r--internal/cpu/worker.go87
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)
+ }
+}