code: func (t *Collection) mkNode(itemIn *itemLoc, leftIn *nodeLoc, rightIn *nodeLoc,
  	numNodesIn uint64, numBytesIn uint64) *node {
  	freeNodeLock.Lock()
  	allocStats.MkNodes++
  	t.allocStats.MkNodes++
  	n := freeNodes
  	if n == nil {
  		allocStats.AllocNodes++
  		t.allocStats.AllocNodes++
  		freeNodeLock.Unlock()
  		atomic.AddUint64(&t.store.nodeAllocs, 1)
  		n = &node{}
  	} else {
  		freeNodes = n.next
  		allocStats.CurFreeNodes--
  		freeNodeLock.Unlock()
  	}
  	if itemIn != nil {
  		i := itemIn.Item()
  		if i != nil {
  			t.store.ItemAddRef(t, i)
  		}
  	}
  	n.item.Copy(itemIn)
  	n.left.Copy(leftIn)
  	n.right.Copy(rightIn)
  	n.numNodes = numNodesIn
  	n.numBytes = numBytesIn
  	n.next = nil
  	return n
  }
docs: // Assumes that the caller serializes invocations.