in pq/pq.go [88:134]
func New(delegate Delegate, settings Settings) (*Queue, error) {
const op = "pq/new"
if delegate == nil {
return nil, errOp(op).of(InvalidParam).report("delegate must not be nil")
}
accessor, errKind := makeAccess(delegate)
if errKind != NoError {
return nil, errOp(op).of(errKind)
}
pageSize := delegate.PageSize()
q := &Queue{
accessor: accessor,
settings: settings,
pagePool: newPagePool(pageSize),
}
// use pointer address as ID for correlating error messages
q.id = queueID(uintptr(unsafe.Pointer(q)))
accessor.quID = q.id
rootBuf, err := q.accessor.ReadRoot()
if err != nil {
return nil, wrapErr(op, err).of(InitFailed).
report("failed to read queue header")
}
root := castQueueRootPage(rootBuf[:])
if root.version.Get() != queueVersion {
cause := &Error{
kind: InitFailed,
msg: fmt.Sprintf("queue version %v", root.version.Get()),
}
return nil, wrapErr(op, cause).of(InitFailed)
}
tracef("open queue: %p (pageSize: %v)\n", q, pageSize)
traceQueueHeader(root)
q.version = root.version.Get()
q.hdrOffset = q.accessor.RootFileOffset()
q.onInit()
return q, nil
}