func New()

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
}