gcc/libgo
Ian Lance Taylor f41bf58736 runtime: dropg before CAS g status to _Grunnable/_Gwaiting
Currently, we dropg (which clears gp.m) after we CAS the g status
    to _Grunnable or _Gwaiting. Immediately after CASing the g status,
    another thread may CAS it to _Gscan status and scan its stack.
    With precise stack scan, it accesses gp.m in order to switch to g
    and back (in doscanstackswitch). This races with dropg. If
    doscanstackswitch reads gp.m, then dropg runs, when we restore
    the m at the end of the scan it will set to a stale value. Worse,
    if dropg runs after doscanstackswitch sets the new m, gp will be
    running with a nil m.
    
    To fix this, we do dropg before CAS g status to _Grunnable or
    _Gwaiting. We can do this safely if we are CASing from _Grunning,
    as we own the g when it is in _Grunning. There is one case where
    we CAS from _Gsyscall to _Grunnable. It is not safe to dropg when
    it is in _Gsyscall, as precise stack scan needs to read gp.m in
    order to signal the m. So we need to introduce a transient state,
    _Gexitingsyscall, between _Gsyscall and _Grunnable, where the GC
    should not scan its stack.
    
    In is a little unfortunate that we have to add another g status.
    We could reuse an existing one (e.g. _Gcopystack), but it is
    clearer and safer to just use a new one, as Austin suggested.
    
    Reviewed-on: https://go-review.googlesource.com/c/158157

From-SVN: r268001
2019-01-17 02:14:28 +00:00
..
config re PR bootstrap/82856 (--enable-maintainter-mode broken by incompatiblity of gcc's required automake and modern Perl) 2018-10-31 20:46:17 +00:00
go runtime: dropg before CAS g status to _Grunnable/_Gwaiting 2019-01-17 02:14:28 +00:00
misc/cgo libgo: update to Go 1.11 2018-09-24 21:46:21 +00:00
runtime runtime: in doscanstackswitch, set gp->m before gogo 2019-01-07 22:07:26 +00:00
testsuite re PR bootstrap/82856 (--enable-maintainter-mode broken by incompatiblity of gcc's required automake and modern Perl) 2018-10-31 20:46:17 +00:00
LICENSE
MERGE libgo: update to Go 1.11.1 release 2018-10-08 14:21:30 +00:00
Makefile.am re PR bootstrap/82856 (--enable-maintainter-mode broken by incompatiblity of gcc's required automake and modern Perl) 2018-10-31 20:46:17 +00:00
Makefile.in re PR bootstrap/82856 (--enable-maintainter-mode broken by incompatiblity of gcc's required automake and modern Perl) 2018-10-31 20:46:17 +00:00
PATENTS
README libgo/README: Minor updates. 2015-03-13 18:53:13 +00:00
README.gcc
VERSION libgo: update to Go 1.11.1 release 2018-10-08 14:21:30 +00:00
aclocal.m4 re PR bootstrap/82856 (--enable-maintainter-mode broken by incompatiblity of gcc's required automake and modern Perl) 2018-10-31 20:46:17 +00:00
check-packages.txt libgo: update to Go 1.11 2018-09-24 21:46:21 +00:00
config.h.in internal/bytealg: support systems that don't have memmem 2018-10-02 16:45:51 +00:00
configure re PR bootstrap/82856 (--enable-maintainter-mode broken by incompatiblity of gcc's required automake and modern Perl) 2018-10-31 20:46:17 +00:00
configure.ac re PR bootstrap/82856 (--enable-maintainter-mode broken by incompatiblity of gcc's required automake and modern Perl) 2018-10-31 20:46:17 +00:00
goarch.sh libgo: support x32 as GOARCH=amd64p32 GOOS=linux 2018-10-01 20:17:11 +00:00
godeps.sh libgo: update to Go1.10beta1 2018-01-09 01:23:08 +00:00
gotool-packages.txt libgo: update to Go 1.11 2018-09-24 21:46:21 +00:00
libgo-packages.txt libgo: update to Go 1.11 2018-09-24 21:46:21 +00:00
libgo.imp Big merge of changes to gofrontend repo that were postponed due to the 2017-05-10 17:26:09 +00:00
match.sh libgo: update to Go 1.11 2018-09-24 21:46:21 +00:00
merge.sh libgo: update to Go 1.11 2018-09-24 21:46:21 +00:00
mkrsysinfo.sh libgo: adapt Solaris 12 references 2017-11-14 14:26:04 +00:00
mkruntimeinc.sh libgo: refactor code to enumerate stdlib packages 2018-05-02 21:57:35 +00:00
mksigtab.sh libgo: don't use grep -q in mksigtab.sh 2017-11-22 00:27:29 +00:00
mksysinfo.sh syscall: always define WEXITED and WNOWAIT on GNU/Linux 2018-11-26 23:58:34 +00:00
mvifdiff.sh runtime: introduce mvifdiff.sh script to replace GCC's move-if-change 2014-12-01 01:06:29 +00:00
sysinfo.c syscall: remove Ustat 2018-06-22 14:25:52 +00:00

README

See ../README.

This is the runtime support library for the Go programming language.
This library is intended for use with the Go frontend.

This library should not be stripped when it is installed.  Go code
relies on being able to look up file/line information, which comes
from the debugging info using the libbacktrace library.

The library has only been tested on GNU/Linux using glibc, and on
Solaris.  It should not be difficult to port to other operating
systems.

Directories:

go
  A copy of the Go library from http://golang.org/, with several
  changes for gccgo.

runtime
  Runtime functions, written in C, which are called directly by the
  compiler or by the library.

Contributing
============

To contribute patches to the files in this directory, please see
http://golang.org/doc/gccgo_contribute.html .

The master copy of these files is hosted at
http://code.google.com/p/gofrontend .  Changes to these files require
signing a Google contributor license agreement.  If you are the
copyright holder, you will need to agree to the individual contributor
license agreement at
http://code.google.com/legal/individual-cla-v1.0.html.  This agreement
can be completed online.

If your organization is the copyright holder, the organization will
need to agree to the corporate contributor license agreement at
http://code.google.com/legal/corporate-cla-v1.0.html.

If the copyright holder for your code has already completed the
agreement in connection with another Google open source project, it
does not need to be completed again.