github.com/pawelgaczynski/gain@v0.4.0-alpha.0.20230821120126-41f1e60a18da/read.go (about) 1 // Copyright (c) 2023 Paweł Gaczyński 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package gain 16 17 import ( 18 "github.com/pawelgaczynski/gain/pkg/errors" 19 "github.com/pawelgaczynski/giouring" 20 ) 21 22 type reader struct { 23 ring *giouring.Ring 24 recvMsg bool 25 } 26 27 func (r *reader) addReadRequest(conn *connection) error { 28 entry := r.ring.GetSQE() 29 if entry == nil { 30 return errors.ErrGettingSQE 31 } 32 33 conn.inboundBuffer.GrowIfUnsufficientFreeSpace() 34 35 if r.recvMsg { 36 entry.PrepareRecvMsg(conn.fd, conn.msgHdr, 0) 37 entry.UserData = readDataFlag | uint64(conn.key) 38 } else { 39 entry.PrepareRecv( 40 conn.fd, 41 uintptr(conn.inboundWriteAddress()), 42 uint32(conn.inboundBuffer.Available()), 43 0) 44 entry.UserData = readDataFlag | uint64(conn.fd) 45 } 46 47 conn.state = connRead 48 conn.setKernelSpace() 49 50 return nil 51 } 52 53 func newReader(ring *giouring.Ring, recvMsg bool) *reader { 54 return &reader{ 55 ring: ring, 56 recvMsg: recvMsg, 57 } 58 }