func (b *MemoryBackend) Log(level Level, calldepth int, rec *Record) error {
	var size int32

	n := &node{Record: rec}
	np := unsafe.Pointer(n)

	// Add the record to the tail. If there's no records available, tail and
	// head will both be nil. When we successfully set the tail and the previous
	// value was nil, it's safe to set the head to the current value too.
	for {
		tailp := b.tail
		swapped := atomic.CompareAndSwapPointer(
			&b.tail,
			tailp,
			np,
		)
		if swapped == true {
			if tailp == nil {
				b.head = np
			} else {
				(*node)(tailp).next = n
			}
			size = atomic.AddInt32(&b.size, 1)
			break
		}
	}

	// Since one record was added, we might have overflowed the list. Remove
	// a record if that is the case. The size will fluctate a bit, but
	// eventual consistent.
	if b.maxSize > 0 && size > b.maxSize {
		for {
			headp := b.head
			head := (*node)(b.head)
			if head.next == nil {
				break
			}
			swapped := atomic.CompareAndSwapPointer(
				&b.head,
				headp,
				unsafe.Pointer(head.next),
			)
			if swapped == true {
				atomic.AddInt32(&b.size, -1)
				break
			}
		}
	}
	return nil
}
func (b *MemoryBackend) Log(level Level, calldepth int, rec *Record) error {
	var size int32

	n := &node{Record: rec}
	np := unsafe.Pointer(n)

	
	
	
	for {
		tailp := b.tail
		swapped := atomic.CompareAndSwapPointer(
			&b.tail,
			tailp,
			np,
		)
		if swapped == true {
			if tailp == nil {
				b.head = np
			} else {
				(*node)(tailp).next = n
			}
			size = atomic.AddInt32(&b.size, 1)
			break
		}
	}

	
	
	
	if b.maxSize > 0 && size > b.maxSize {
		for {
			headp := b.head
			head := (*node)(b.head)
			if head.next == nil {
				break
			}
			swapped := atomic.CompareAndSwapPointer(
				&b.head,
				headp,
				unsafe.Pointer(head.next),
			)
			if swapped == true {
				atomic.AddInt32(&b.size, -1)
				break
			}
		}
	}
	return nil
}
func ( b * MemoryBackend ) Log ( level Level , calldepth int , rec * Record ) error { var size int32 n := & node { Record : rec } np := unsafe . Pointer ( n ) // Add the record to the tail. If there's no records available, tail and // head will both be nil. When we successfully set the tail and the previous // value was nil, it's safe to set the head to the current value too. for { tailp := b . tail swapped := atomic . CompareAndSwapPointer ( & b . tail , tailp , np , ) if swapped == true { if tailp == nil { b . head = np } else { ( * node ) ( tailp ) . next = n } size = atomic . AddInt32 ( & b . size , 1 ) break } } // Since one record was added, we might have overflowed the list. Remove // a record if that is the case. The size will fluctate a bit, but // eventual consistent. if b . maxSize > 0 && size > b . maxSize { for { headp := b . head head := ( * node ) ( b . head ) if head . next == nil { break } swapped := atomic . CompareAndSwapPointer ( & b . head , headp , unsafe . Pointer ( head . next ) , ) if swapped == true { atomic . AddInt32 ( & b . size , - 1 ) break } } } return nil }
// Log implements the Log method required by Backend.
Log implements the Log method required by Backend .