package main

import (
	"fmt"
	"os"
	"runtime/trace"
	"sync"
)

// hitungTotal menjumlahkan bilangan dari 0 sampai n-1.
func hitungTotal(n int) int {
	total := 0
	for i := range n {
		total += i
	}
	return total
}

func main() {
	berkas, err := os.CreateTemp("", "trace-*.out")
	if err != nil {
		fmt.Println("gagal membuat berkas trace:", err)
		return
	}

	if err := trace.Start(berkas); err != nil {
		fmt.Println("gagal memulai trace:", err)
		return
	}

	// Empat goroutine dikerjakan penjadwal; hasilnya dikumpulkan lewat channel.
	hasil := make(chan int, 4)
	var wg sync.WaitGroup
	for i := 1; i <= 4; i++ {
		wg.Add(1)
		go func(bagian int) {
			defer wg.Done()
			hasil <- hitungTotal(bagian * 1000)
		}(i)
	}
	wg.Wait()
	close(hasil)

	jumlah := 0
	for v := range hasil {
		jumlah += v
	}

	trace.Stop()
	berkas.Close()

	fmt.Println("jumlah total:", jumlah)
	fmt.Println("trace berhasil dibuat: true")
}
