56 lines
1.5 KiB
Go
56 lines
1.5 KiB
Go
// Copyright 2018 The Periph Authors. All rights reserved.
|
|
// Use of this source code is governed under the Apache License, Version 2.0
|
|
// that can be found in the LICENSE file.
|
|
|
|
// This file contains the single threaded driver loading code, to be used on
|
|
// low performance cores.
|
|
|
|
// +build tinygo
|
|
|
|
package periph
|
|
|
|
import (
|
|
"errors"
|
|
"strconv"
|
|
)
|
|
|
|
func initImpl() (*State, error) {
|
|
state = &State{}
|
|
// At this point, byName is guaranteed to be immutable.
|
|
stages, err := explodeStages()
|
|
if err != nil {
|
|
return state, err
|
|
}
|
|
loaded := make(map[string]struct{}, len(byName))
|
|
for _, s := range stages {
|
|
s.loadSerial(state, loaded)
|
|
}
|
|
return state, nil
|
|
}
|
|
|
|
// loadSerial loads all the drivers for this stage, one after the other.
|
|
func (s *stage) loadSerial(state *State, loaded map[string]struct{}) {
|
|
for name, drv := range s.drvs {
|
|
// Intentionally do not look at After(), only Prerequisites().
|
|
for _, dep := range drv.Prerequisites() {
|
|
if _, ok := loaded[dep]; !ok {
|
|
state.Skipped = insertDriverFailure(state.Skipped, DriverFailure{drv, errors.New("dependency not loaded: " + strconv.Quote(dep))})
|
|
goto loop
|
|
}
|
|
}
|
|
|
|
// Not skipped driver, attempt loading in a goroutine.
|
|
if ok, err := drv.Init(); ok {
|
|
if err == nil {
|
|
state.Loaded = insertDriver(state.Loaded, drv)
|
|
loaded[name] = struct{}{}
|
|
} else {
|
|
state.Failed = insertDriverFailure(state.Failed, DriverFailure{drv, err})
|
|
}
|
|
} else {
|
|
state.Skipped = insertDriverFailure(state.Skipped, DriverFailure{drv, err})
|
|
}
|
|
loop:
|
|
}
|
|
}
|