// automatically generated by stateify.

package refs

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

func (w *WeakRef) StateTypeName() string {
	return "pkg/refs.WeakRef"
}

func (w *WeakRef) StateFields() []string {
	return []string{
		"obj",
		"user",
	}
}

func (w *WeakRef) beforeSave() {}

// +checklocksignore
func (w *WeakRef) StateSave(stateSinkObject state.Sink) {
	w.beforeSave()
	var objValue savedReference
	objValue = w.saveObj()
	stateSinkObject.SaveValue(0, objValue)
	stateSinkObject.Save(1, &w.user)
}

func (w *WeakRef) afterLoad() {}

// +checklocksignore
func (w *WeakRef) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(1, &w.user)
	stateSourceObject.LoadValue(0, new(savedReference), func(y interface{}) { w.loadObj(y.(savedReference)) })
}

func (r *AtomicRefCount) StateTypeName() string {
	return "pkg/refs.AtomicRefCount"
}

func (r *AtomicRefCount) StateFields() []string {
	return []string{
		"refCount",
		"name",
		"stack",
	}
}

func (r *AtomicRefCount) beforeSave() {}

// +checklocksignore
func (r *AtomicRefCount) StateSave(stateSinkObject state.Sink) {
	r.beforeSave()
	stateSinkObject.Save(0, &r.refCount)
	stateSinkObject.Save(1, &r.name)
	stateSinkObject.Save(2, &r.stack)
}

func (r *AtomicRefCount) afterLoad() {}

// +checklocksignore
func (r *AtomicRefCount) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &r.refCount)
	stateSourceObject.Load(1, &r.name)
	stateSourceObject.Load(2, &r.stack)
}

func (s *savedReference) StateTypeName() string {
	return "pkg/refs.savedReference"
}

func (s *savedReference) StateFields() []string {
	return []string{
		"obj",
	}
}

func (s *savedReference) beforeSave() {}

// +checklocksignore
func (s *savedReference) StateSave(stateSinkObject state.Sink) {
	s.beforeSave()
	stateSinkObject.Save(0, &s.obj)
}

func (s *savedReference) afterLoad() {}

// +checklocksignore
func (s *savedReference) StateLoad(stateSourceObject state.Source) {
	stateSourceObject.Load(0, &s.obj)
}

func (l *weakRefList) StateTypeName() string {
	return "pkg/refs.weakRefList"
}

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

func (l *weakRefList) beforeSave() {}

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

func (l *weakRefList) afterLoad() {}

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

func (e *weakRefEntry) StateTypeName() string {
	return "pkg/refs.weakRefEntry"
}

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

func (e *weakRefEntry) beforeSave() {}

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

func (e *weakRefEntry) afterLoad() {}

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

func init() {
	state.Register((*WeakRef)(nil))
	state.Register((*AtomicRefCount)(nil))
	state.Register((*savedReference)(nil))
	state.Register((*weakRefList)(nil))
	state.Register((*weakRefEntry)(nil))
}
