mirror of git://gcc.gnu.org/git/gcc.git
parent
8c92028ea1
commit
a10d35a8ba
|
|
@ -1,4 +1,4 @@
|
||||||
65bf677ab8d8
|
0ddbdc3c7ce2
|
||||||
|
|
||||||
The first line of this file holds the Mercurial revision number of the
|
The first line of this file holds the Mercurial revision number of the
|
||||||
last merge done from the master library sources.
|
last merge done from the master library sources.
|
||||||
|
|
|
||||||
|
|
@ -620,8 +620,8 @@ func (db *DB) conn() (*driverConn, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// If db.maxOpen > 0 and the number of open connections is over the limit
|
// If db.maxOpen > 0 and the number of open connections is over the limit
|
||||||
// or there are no free connection, then make a request and wait.
|
// and there are no free connection, make a request and wait.
|
||||||
if db.maxOpen > 0 && (db.numOpen >= db.maxOpen || db.freeConn.Len() == 0) {
|
if db.maxOpen > 0 && db.numOpen >= db.maxOpen && db.freeConn.Len() == 0 {
|
||||||
// Make the connRequest channel. It's buffered so that the
|
// Make the connRequest channel. It's buffered so that the
|
||||||
// connectionOpener doesn't block while waiting for the req to be read.
|
// connectionOpener doesn't block while waiting for the req to be read.
|
||||||
ch := make(chan interface{}, 1)
|
ch := make(chan interface{}, 1)
|
||||||
|
|
|
||||||
|
|
@ -1005,6 +1005,29 @@ func TestMaxOpenConns(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSingleOpenConn(t *testing.T) {
|
||||||
|
db := newTestDB(t, "people")
|
||||||
|
defer closeDB(t, db)
|
||||||
|
|
||||||
|
db.SetMaxOpenConns(1)
|
||||||
|
|
||||||
|
rows, err := db.Query("SELECT|people|name|")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if err = rows.Close(); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
// shouldn't deadlock
|
||||||
|
rows, err = db.Query("SELECT|people|name|")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if err = rows.Close(); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// golang.org/issue/5323
|
// golang.org/issue/5323
|
||||||
func TestStmtCloseDeps(t *testing.T) {
|
func TestStmtCloseDeps(t *testing.T) {
|
||||||
if testing.Short() {
|
if testing.Short() {
|
||||||
|
|
|
||||||
|
|
@ -513,12 +513,7 @@ func (fd *netFD) WriteTo(buf []byte, sa syscall.Sockaddr) (int, error) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (*netFD, error) {
|
func (fd *netFD) acceptOne(toAddr func(syscall.Sockaddr) Addr, rawsa []syscall.RawSockaddrAny, o *operation) (*netFD, error) {
|
||||||
if err := fd.readLock(); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer fd.readUnlock()
|
|
||||||
|
|
||||||
// Get new socket.
|
// Get new socket.
|
||||||
s, err := sysSocket(fd.family, fd.sotype, 0)
|
s, err := sysSocket(fd.family, fd.sotype, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -537,9 +532,7 @@ func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (*netFD, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Submit accept request.
|
// Submit accept request.
|
||||||
o := &fd.rop
|
|
||||||
o.handle = s
|
o.handle = s
|
||||||
var rawsa [2]syscall.RawSockaddrAny
|
|
||||||
o.rsan = int32(unsafe.Sizeof(rawsa[0]))
|
o.rsan = int32(unsafe.Sizeof(rawsa[0]))
|
||||||
_, err = rsrv.ExecIO(o, "AcceptEx", func(o *operation) error {
|
_, err = rsrv.ExecIO(o, "AcceptEx", func(o *operation) error {
|
||||||
return syscall.AcceptEx(o.fd.sysfd, o.handle, (*byte)(unsafe.Pointer(&rawsa[0])), 0, uint32(o.rsan), uint32(o.rsan), &o.qty, &o.o)
|
return syscall.AcceptEx(o.fd.sysfd, o.handle, (*byte)(unsafe.Pointer(&rawsa[0])), 0, uint32(o.rsan), uint32(o.rsan), &o.qty, &o.o)
|
||||||
|
|
@ -556,6 +549,45 @@ func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (*netFD, error) {
|
||||||
return nil, &OpError{"Setsockopt", fd.net, fd.laddr, err}
|
return nil, &OpError{"Setsockopt", fd.net, fd.laddr, err}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return netfd, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fd *netFD) accept(toAddr func(syscall.Sockaddr) Addr) (*netFD, error) {
|
||||||
|
if err := fd.readLock(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer fd.readUnlock()
|
||||||
|
|
||||||
|
o := &fd.rop
|
||||||
|
var netfd *netFD
|
||||||
|
var err error
|
||||||
|
var rawsa [2]syscall.RawSockaddrAny
|
||||||
|
for {
|
||||||
|
netfd, err = fd.acceptOne(toAddr, rawsa[:], o)
|
||||||
|
if err == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// Sometimes we see WSAECONNRESET and ERROR_NETNAME_DELETED is
|
||||||
|
// returned here. These happen if connection reset is received
|
||||||
|
// before AcceptEx could complete. These errors relate to new
|
||||||
|
// connection, not to AcceptEx, so ignore broken connection and
|
||||||
|
// try AcceptEx again for more connections.
|
||||||
|
operr, ok := err.(*OpError)
|
||||||
|
if !ok {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
errno, ok := operr.Err.(syscall.Errno)
|
||||||
|
if !ok {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
switch errno {
|
||||||
|
case syscall.ERROR_NETNAME_DELETED, syscall.WSAECONNRESET:
|
||||||
|
// ignore these and try again
|
||||||
|
default:
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Get local and peer addr out of AcceptEx buffer.
|
// Get local and peer addr out of AcceptEx buffer.
|
||||||
var lrsa, rrsa *syscall.RawSockaddrAny
|
var lrsa, rrsa *syscall.RawSockaddrAny
|
||||||
var llen, rlen int32
|
var llen, rlen int32
|
||||||
|
|
|
||||||
|
|
@ -1770,6 +1770,8 @@ runtime_memorydump(void)
|
||||||
void
|
void
|
||||||
runtime_gchelper(void)
|
runtime_gchelper(void)
|
||||||
{
|
{
|
||||||
|
uint32 nproc;
|
||||||
|
|
||||||
gchelperstart();
|
gchelperstart();
|
||||||
|
|
||||||
// parallel mark for over gc roots
|
// parallel mark for over gc roots
|
||||||
|
|
@ -1786,7 +1788,8 @@ runtime_gchelper(void)
|
||||||
|
|
||||||
runtime_parfordo(work.sweepfor);
|
runtime_parfordo(work.sweepfor);
|
||||||
bufferList[runtime_m()->helpgc].busy = 0;
|
bufferList[runtime_m()->helpgc].busy = 0;
|
||||||
if(runtime_xadd(&work.ndone, +1) == work.nproc-1)
|
nproc = work.nproc; // work.nproc can change right after we increment work.ndone
|
||||||
|
if(runtime_xadd(&work.ndone, +1) == nproc-1)
|
||||||
runtime_notewakeup(&work.alldone);
|
runtime_notewakeup(&work.alldone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue