// Copyright 2018 The gVisor Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package epoll import ( "gvisor.dev/gvisor/pkg/refs" "gvisor.dev/gvisor/pkg/waiter" ) // afterLoad is invoked by stateify. func (p *pollEntry) afterLoad() { p.waiter.Callback = &readyCallback{context: p} p.file = refs.NewWeakRef(p.id.File, p) p.id.File.EventRegister(&p.waiter, p.mask) } // afterLoad is invoked by stateify. func (e *EventPoll) afterLoad() { e.listsMu.Lock() defer e.listsMu.Unlock() for _, ls := range []*pollEntryList{&e.waitingList, &e.readyList, &e.disabledList} { for it := ls.Front(); it != nil; it = it.Next() { it.curList = ls } } for it := e.waitingList.Front(); it != nil; { entry := it it = it.Next() if entry.id.File.Readiness(entry.mask) != 0 { e.waitingList.Remove(entry) e.readyList.PushBack(entry) entry.curList = &e.readyList e.Notify(waiter.EventIn) } } }