// automatically generated by stateify.

package waiter

import (
	"gvisor.dev/gvisor/pkg/state"
)

func (e *Entry) StateTypeName() string {
	return "pkg/waiter.Entry"
}

func (e *Entry) StateFields() []string {
	return []string{
		"Callback",
		"mask",
		"waiterEntry",
	}
}

func (e *Entry) beforeSave() {}

// +checklocksignore
func (e *Entry) StateSave(stateSinkObject state.Sink) {
	e.beforeSave()
	stateSinkObject.Save(0, &e.Callback)
	stateSinkObject.Save(1, &e.mask)
	stateSinkObject.Save(2, &e.waiterEntry)
}

func (e *Entry) afterLoad() {}

// +checklocksignore
func (e *Entry) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &e.Callback)
	stateSourceObject.Load(1, &e.mask)
	stateSourceObject.Load(2, &e.waiterEntry)
}

func (q *Queue) StateTypeName() string {
	return "pkg/waiter.Queue"
}

func (q *Queue) StateFields() []string {
	return []string{
		"list",
	}
}

func (q *Queue) beforeSave() {}

// +checklocksignore
func (q *Queue) StateSave(stateSinkObject state.Sink) {
	q.beforeSave()
	stateSinkObject.Save(0, &q.list)
}

func (q *Queue) afterLoad() {}

// +checklocksignore
func (q *Queue) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &q.list)
}

func (l *waiterList) StateTypeName() string {
	return "pkg/waiter.waiterList"
}

func (l *waiterList) StateFields() []string {
	return []string{
		"head",
		"tail",
	}
}

func (l *waiterList) beforeSave() {}

// +checklocksignore
func (l *waiterList) StateSave(stateSinkObject state.Sink) {
	l.beforeSave()
	stateSinkObject.Save(0, &l.head)
	stateSinkObject.Save(1, &l.tail)
}

func (l *waiterList) afterLoad() {}

// +checklocksignore
func (l *waiterList) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &l.head)
	stateSourceObject.Load(1, &l.tail)
}

func (e *waiterEntry) StateTypeName() string {
	return "pkg/waiter.waiterEntry"
}

func (e *waiterEntry) StateFields() []string {
	return []string{
		"next",
		"prev",
	}
}

func (e *waiterEntry) beforeSave() {}

// +checklocksignore
func (e *waiterEntry) StateSave(stateSinkObject state.Sink) {
	e.beforeSave()
	stateSinkObject.Save(0, &e.next)
	stateSinkObject.Save(1, &e.prev)
}

func (e *waiterEntry) afterLoad() {}

// +checklocksignore
func (e *waiterEntry) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &e.next)
	stateSourceObject.Load(1, &e.prev)
}

func init() {
	state.Register((*Entry)(nil))
	state.Register((*Queue)(nil))
	state.Register((*waiterList)(nil))
	state.Register((*waiterEntry)(nil))
}
