Skip to content

Commit

Permalink
fix: support windows compiler
Browse files Browse the repository at this point in the history
  • Loading branch information
joway committed Jul 23, 2024
1 parent 2bf73f2 commit 363b2e8
Show file tree
Hide file tree
Showing 5 changed files with 134 additions and 127 deletions.
89 changes: 0 additions & 89 deletions netpoll.go

This file was deleted.

45 changes: 45 additions & 0 deletions netpoll_config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// Copyright 2022 CloudWeGo Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package netpoll

import (
"context"
"io"
)

// global config
var (
defaultLinkBufferSize = pagesize
featureAlwaysNoCopyRead = false
)

// Config expose some tuning parameters to control the internal behaviors of netpoll.
// Every parameter with the default zero value should keep the default behavior of netpoll.
type Config struct {
PollerNum int // number of pollers
BufferSize int // default size of a new connection's LinkBuffer
Runner func(ctx context.Context, f func()) // runner for event handler, most of the time use a goroutine pool.
LoggerOutput io.Writer // logger output
LoadBalance LoadBalance // load balance for poller picker
Feature // define all features that not enable by default
}

// Feature expose some new features maybe promoted as a default behavior but not yet.
type Feature struct {
// AlwaysNoCopyRead allows some copy Read functions like ReadBinary/ReadString
// will use NoCopy read and will not reuse the underlying buffer.
// It gains more performance benefits when need read much big string/bytes in codec.
AlwaysNoCopyRead bool
}
122 changes: 84 additions & 38 deletions netpoll_options.go → netpoll_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,43 +12,47 @@
// See the License for the specific language governing permissions and
// limitations under the License.

//go:build darwin || netbsd || freebsd || openbsd || dragonfly || linux
// +build darwin netbsd freebsd openbsd dragonfly linux

package netpoll

import (
"context"
"io"
"log"
"net"
"os"
"runtime"
"sync"
"time"
)

var (
pollmanager = newManager(runtime.GOMAXPROCS(0)/20 + 1) // pollmanager manage all pollers
logger = log.New(os.Stderr, "", log.LstdFlags)

// global config
defaultLinkBufferSize = pagesize
featureAlwaysNoCopyRead = false
)

// Config expose some tuning parameters to control the internal behaviors of netpoll.
// Every parameter with the default zero value should keep the default behavior of netpoll.
type Config struct {
PollerNum int // number of pollers
BufferSize int // default size of a new connection's LinkBuffer
Runner func(ctx context.Context, f func()) // runner for event handler, most of the time use a goroutine pool.
LoggerOutput io.Writer // logger output
LoadBalance LoadBalance // load balance for poller picker
Feature // define all features that not enable by default
// Option .
type Option struct {
f func(*options)
}

// Feature expose some new features maybe promoted as a default behavior but not yet.
type Feature struct {
// AlwaysNoCopyRead allows some copy Read functions like ReadBinary/ReadString
// will use NoCopy read and will not reuse the underlying buffer.
// It gains more performance benefits when need read much big string/bytes in codec.
AlwaysNoCopyRead bool
type options struct {
onPrepare OnPrepare
onConnect OnConnect
onDisconnect OnDisconnect
onRequest OnRequest
readTimeout time.Duration
writeTimeout time.Duration
idleTimeout time.Duration
}

// Initialize the pollers actively. By default, it's lazy initialized.
// It's safe to call it multi times.
func Initialize() {
// The first call of Pick() will init pollers
_ = pollmanager.Pick()
}

// Configure the internal behaviors of netpoll.
Expand Down Expand Up @@ -79,17 +83,10 @@ func Configure(config Config) (err error) {
return nil
}

// Initialize the pollers actively. By default, it's lazy initialized.
// It's safe to call it multi times.
func Initialize() {
// The first call of Pick() will init pollers
_ = pollmanager.Pick()
}

// SetNumLoops is used to set the number of pollers, generally do not need to actively set.
// By default, the number of pollers is equal to runtime.GOMAXPROCS(0)/20+1.
// If the number of cores in your service process is less than 20c, theoretically only one poller is needed.
// Otherwise you may need to adjust the number of pollers to achieve the best results.
// Otherwise, you may need to adjust the number of pollers to achieve the best results.
// Experience recommends assigning a poller every 20c.
//
// You can only use SetNumLoops before any connection is created. An example usage:
Expand Down Expand Up @@ -175,17 +172,66 @@ func WithIdleTimeout(timeout time.Duration) Option {
}}
}

// Option .
type Option struct {
f func(*options)
// NewEventLoop .
func NewEventLoop(onRequest OnRequest, ops ...Option) (EventLoop, error) {
opts := &options{
onRequest: onRequest,
}
for _, do := range ops {
do.f(opts)
}
return &eventLoop{
opts: opts,
stop: make(chan error, 1),
}, nil
}

type options struct {
onPrepare OnPrepare
onConnect OnConnect
onDisconnect OnDisconnect
onRequest OnRequest
readTimeout time.Duration
writeTimeout time.Duration
idleTimeout time.Duration
type eventLoop struct {
sync.Mutex
opts *options
svr *server
stop chan error
}

// Serve implements EventLoop.
func (evl *eventLoop) Serve(ln net.Listener) error {
npln, err := ConvertListener(ln)
if err != nil {
return err
}
evl.Lock()
evl.svr = newServer(npln, evl.opts, evl.quit)
evl.svr.Run()
evl.Unlock()

err = evl.waitQuit()
// ensure evl will not be finalized until Serve returns
runtime.SetFinalizer(evl, nil)
return err
}

// Shutdown signals a shutdown a begins server closing.
func (evl *eventLoop) Shutdown(ctx context.Context) error {
evl.Lock()
var svr = evl.svr
evl.svr = nil
evl.Unlock()

if svr == nil {
return nil
}
evl.quit(nil)
return svr.Close(ctx)
}

// waitQuit waits for a quit signal
func (evl *eventLoop) waitQuit() error {
return <-evl.stop
}

func (evl *eventLoop) quit(err error) {
select {
case evl.stop <- err:
default:
}
}
File renamed without changes.
5 changes: 5 additions & 0 deletions netpoll_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ import (
"time"
)

// Configure the internal behaviors of netpoll.
func Configure(config Config) (err error) {
return nil
}

// Option .
type Option struct {
f func(*options)
Expand Down

0 comments on commit 363b2e8

Please sign in to comment.