| 161 | } |
| 162 | |
| 163 | func getReaderBufSizeUnsafe(cn *pool.Conn) int { |
| 164 | cnPtr := (*struct { |
| 165 | id uint64 // First field in pool.Conn |
| 166 | usedAt atomic.Int64 // Second field (atomic) |
| 167 | lastPutAt atomic.Int64 // Third field (atomic) |
| 168 | checkoutAt atomic.Int64 // Fourth field (atomic) |
| 169 | netConnAtomic atomic.Value // atomic.Value for net.Conn |
| 170 | rd *proto.Reader |
| 171 | bw *bufio.Writer |
| 172 | wr *proto.Writer |
| 173 | // We only need fields up to rd, so we can stop here |
| 174 | })(unsafe.Pointer(cn)) |
| 175 | |
| 176 | if cnPtr.rd == nil { |
| 177 | return -1 |
| 178 | } |
| 179 | |
| 180 | // proto.Reader internal structure |
| 181 | rdPtr := (*struct { |
| 182 | rd *bufio.Reader |
| 183 | })(unsafe.Pointer(cnPtr.rd)) |
| 184 | |
| 185 | if rdPtr.rd == nil { |
| 186 | return -1 |
| 187 | } |
| 188 | |
| 189 | // bufio.Reader internal structure |
| 190 | bufReaderPtr := (*struct { |
| 191 | buf []byte |
| 192 | rd interface{} |
| 193 | r, w int |
| 194 | err error |
| 195 | lastByte int |
| 196 | lastRuneSize int |
| 197 | })(unsafe.Pointer(rdPtr.rd)) |
| 198 | |
| 199 | return len(bufReaderPtr.buf) |
| 200 | } |