// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // This file contains CRC32 algorithms that are not specific to any architecture // and don't use hardware acceleration. // // The simple (and slow) CRC32 implementation only uses a 256*4 bytes table. // // The slicing-by-8 algorithm is a faster implementation that uses a bigger // table (8*256*4 bytes). package crc32 // simpleMakeTable allocates and constructs a Table for the specified // polynomial. The table is suitable for use with the simple algorithm // (simpleUpdate). func simpleMakeTable(poly uint32) *Table { t := new(Table) simplePopulateTable(poly, t) return t } // simplePopulateTable constructs a Table for the specified polynomial, suitable // for use with simpleUpdate. func simplePopulateTable(poly uint32, t *Table) { for i := 0; i < 256; i++ { crc := uint32(i) for j := 0; j < 8; j++ { if crc&1 == 1 { crc = (crc >> 1) ^ poly } else { crc >>= 1 } } t[i] = crc } } // simpleUpdate uses the simple algorithm to update the CRC, given a table that // was previously computed using simpleMakeTable. func simpleUpdate(crc uint32, tab *Table, p []byte) uint32 { crc = ^crc for _, v := range p { crc = tab[byte(crc)^v] ^ (crc >> 8) } return ^crc } // Use slicing-by-8 when payload >= this value. const slicing8Cutoff = 16 // slicing8Table is array of 8 Tables, used by the slicing-by-8 algorithm. type slicing8Table [8]Table // slicingMakeTable constructs a slicing8Table for the specified polynomial. The // table is suitable for use with the slicing-by-8 algorithm (slicingUpdate). func slicingMakeTable(poly uint32) *slicing8Table { t := new(slicing8Table) simplePopulateTable(poly, &t[0]) for i := 0; i < 256; i++ { crc := t[0][i] for j := 1; j < 8; j++ { crc = t[0][crc&0xFF] ^ (crc >> 8) t[j][i] = crc } } return t } // slicingUpdate uses the slicing-by-8 algorithm to update the CRC, given a // table that was previously computed using slicingMakeTable. func slicingUpdate(crc uint32, tab *slicing8Table, p []byte) uint32 { if len(p) >= slicing8Cutoff { crc = ^crc for len(p) > 8 { crc ^= uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24 crc = tab[0][p[7]] ^ tab[1][p[6]] ^ tab[2][p[5]] ^ tab[3][p[4]] ^ tab[4][crc>>24] ^ tab[5][(crc>>16)&0xFF] ^ tab[6][(crc>>8)&0xFF] ^ tab[7][crc&0xFF] p = p[8:] } crc = ^crc } if len(p) == 0 { return crc } return simpleUpdate(crc, &tab[0], p) }
session(release): write data/sessions/a/2/a21ba5ed018c2536: no space left on device
github.com/go-macaron/session@v0.0.0-20190805070824-1a3cdc6f5659/session.go:199 (0x8b2934) gopkg.in/macaron.v1@v1.3.9/context.go:79 (0x83d0a0) github.com/go-macaron/inject@v0.0.0-20160627170012-d8a0b8677191/inject.go:157 (0x80ab07) github.com/go-macaron/inject@v0.0.0-20160627170012-d8a0b8677191/inject.go:135 (0x80a8a8) gopkg.in/macaron.v1@v1.3.9/context.go:121 (0x83d1f8) gopkg.in/macaron.v1@v1.3.9/context.go:112 (0x84fdb5) gopkg.in/macaron.v1@v1.3.9/recovery.go:161 (0x84fda8) gopkg.in/macaron.v1@v1.3.9/logger.go:40 (0x840c73) github.com/go-macaron/inject@v0.0.0-20160627170012-d8a0b8677191/inject.go:157 (0x80ab07) github.com/go-macaron/inject@v0.0.0-20160627170012-d8a0b8677191/inject.go:135 (0x80a8a8) gopkg.in/macaron.v1@v1.3.9/context.go:121 (0x83d1f8) gopkg.in/macaron.v1@v1.3.9/router.go:187 (0x850fc6) gopkg.in/macaron.v1@v1.3.9/router.go:303 (0x8493e5) gopkg.in/macaron.v1@v1.3.9/macaron.go:220 (0x841fca) net/http/server.go:2836 (0x7a79b2) net/http/server.go:1924 (0x7a341b) runtime/asm_amd64.s:1373 (0x46f9f0)