//go:build linux

package load

import (
	
	
	
	
	

	
)

func () (*AvgStat, error) {
	return AvgWithContext(context.Background())
}

func ( context.Context) (*AvgStat, error) {
	,  := fileAvgWithContext()
	if  != nil {
		,  = sysinfoAvgWithContext()
	}
	return , 
}

func sysinfoAvgWithContext( context.Context) (*AvgStat, error) {
	var  syscall.Sysinfo_t
	 := syscall.Sysinfo(&)
	if  != nil {
		return nil, 
	}

	const  = 16
	return &AvgStat{
		Load1:  float64(.Loads[0]) / float64(1<<),
		Load5:  float64(.Loads[1]) / float64(1<<),
		Load15: float64(.Loads[2]) / float64(1<<),
	}, nil
}

func fileAvgWithContext( context.Context) (*AvgStat, error) {
	,  := readLoadAvgFromFile()
	if  != nil {
		return nil, 
	}

	,  := strconv.ParseFloat([0], 64)
	if  != nil {
		return nil, 
	}
	,  := strconv.ParseFloat([1], 64)
	if  != nil {
		return nil, 
	}
	,  := strconv.ParseFloat([2], 64)
	if  != nil {
		return nil, 
	}

	 := &AvgStat{
		Load1:  ,
		Load5:  ,
		Load15: ,
	}

	return , nil
}

// Misc returnes miscellaneous host-wide statistics.
// Note: the name should be changed near future.
func () (*MiscStat, error) {
	return MiscWithContext(context.Background())
}

func ( context.Context) (*MiscStat, error) {
	 := common.HostProc("stat")
	,  := os.ReadFile()
	if  != nil {
		return nil, 
	}

	 := &MiscStat{}
	 := strings.Split(string(), "\n")
	for ,  := range  {
		 := strings.Fields()
		if len() != 2 {
			continue
		}
		,  := strconv.ParseInt([1], 10, 64)
		if  != nil {
			continue
		}
		switch [0] {
		case "processes":
			.ProcsCreated = 
		case "procs_running":
			.ProcsRunning = 
		case "procs_blocked":
			.ProcsBlocked = 
		case "ctxt":
			.Ctxt = 
		default:
			continue
		}

	}

	,  := getProcsTotal()
	if  != nil {
		return , 
	}
	.ProcsTotal = 

	return , nil
}

func getProcsTotal() (int64, error) {
	,  := readLoadAvgFromFile()
	if  != nil {
		return 0, 
	}
	return strconv.ParseInt(strings.Split([3], "/")[1], 10, 64)
}

func readLoadAvgFromFile() ([]string, error) {
	 := common.HostProc("loadavg")
	,  := os.ReadFile()
	if  != nil {
		return nil, 
	}

	 := strings.Fields(string())
	return , nil
}