If you want to identify goroutines at runtime, you can find in the
attachments patches for Golang 1.10 to allow to assign a name to a
goroutine.
These are patches against Golang 1.10 because I have been using the gccgo
runtime that comes with GCC 8.4.
This could help you forward for what you want.
Hugo
On Tue, Jun 30, 2020 at 9:50 AM Jan Mercl <0xj...@gmail.com> wrote:
> On Tue, Jun 30, 2020 at 9:36 AM Durga Someswararao G
> wrote:
>
> > Is it possible to get goroutine id when we creted?
> > Is it possible to get goroutines count while we creating?
> > Is it possible to terminate a goroutine based on ID like if any
> goroutine has infinite loops?
> > Is it possible to clean up memory of variable like we have free in C?
>
> The answer to all of the above questions, in the first approximation, is
> no.
>
> Unsafe tricks may help to achieve some of those goals. What's the
> purpose? Is this a XY problem?
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/CAA40n-ULnCkc7hw0c%3DQCTSAvyP3ZO4rXmTEjm5fb6m2QTJC%3Duw%40mail.gmail.com
> .
>
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/CAARrXCTo3W4s6ahPDNHktU6U_uefRbjnENiDNkfA6Smqb7BCqg%40mail.gmail.com.
From 99d77ef6698838e3c77178a2c719369b3cac9f25 Mon Sep 17 00:00:00 2001
From: Hugo Cornelis
Date: Tue, 2 Jun 2020 19:44:08 +0200
Subject: [PATCH 2/2] improved goroutine name reporting wrt parsing
---
libgo/go/runtime/traceback_gccgo.go | 7 ++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/libgo/go/runtime/traceback_gccgo.go b/libgo/go/runtime/traceback_gccgo.go
index b53dc6f8e30..652d3d7ba71 100644
--- a/libgo/go/runtime/traceback_gccgo.go
+++ b/libgo/go/runtime/traceback_gccgo.go
@@ -8,6 +8,7 @@
package runtime
import (
+ "os"
"runtime/internal/sys"
"sync/atomic"
"unsafe"
@@ -15,6 +16,9 @@ import (
func GoroutineSetName(name string) {
var length uint32
+
+ os.Stderr.WriteString("GoroutineSetName(" + name + ")\n")
+
if len(name) > GoroutineNameLengthMax {
length = GoroutineNameLengthMax
} else {
@@ -28,6 +32,7 @@ func GoroutineSetName(name string) {
atomic.StoreUint32(&_g_.nameLength, 0)
copy(_g_.name[:], name[0:length])
atomic.StoreUint32(&_g_.nameLength, length)
+
}
func printcreatedby(gp *g) {
@@ -174,7 +179,7 @@ func goroutineheader(gp *g) {
nameLength := atomic.LoadUint32(&gp.nameLength)
if nameLength != 0 {
- print("goroutine ", gp.goid, " '")
+ print("goroutine, name: ", gp.goid, " '")
gwrite(gp.name[0:nameLength])
print("' [", status)
} else {
--
2.17.1
From 89996ebc2d19c9a8e0ee7d567c95430d81f42b26 Mon Sep 17 00:00:00 2001
From: Hugo Cornelis
Date: Mon, 18 May 2020 14:49:03 +0200
Subject: [PATCH 1/2] added goroutine naming
---
libgo/go/runtime/proc.go| 1 +
libgo/go/runtime/runtime2.go| 7 +++
libgo/go/runtime/traceback_gccgo.go | 32 -
3 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/libgo/go/runtime/proc.go b/libgo/go/runtime/proc.go
index a6746c9f0a8..10a2ffc2f62 100644
--- a/libgo/go/runtime/proc.go
+++ b/libgo/go/runtime/proc.go
@@ -2614,6 +2614,7 @@ func goexit0(gp *g) {
gp.param = nil
gp.labels = nil
gp.timer = nil
+ gp.nameLength = 0
if gcBlackenEnabled != 0 && gp.gcAssistBytes > 0 {
// Flush assist credit to the global pool. This gives
diff --git a/libgo/go/runtime/runtime2.go b/libgo/go/runtime/runtime2.go
index 0299d5a788f..0ff04fa867a 100644
--- a/libgo/go/runtime/runtime2.go
+++ b/libgo/go/runtime/runtime2.go
@@ -88,6 +88,10 @@ const (
_Gscanwaiting = _Gscan + _Gwaiting // 0x1004
)
+const (
+ GoroutineNameLengthMax = 30
+)
+
const (
// P status
_Pidle= iota
@@ -435,6 +439,9 @@ type g struct {
context g_ucontext_t // saved context for setcontext
stackcontext [10]uintptr // split-stack context
+
+ nameLength uint32
+ name[GoroutineNameLengthMax] uint8
}
type m struct {
diff --git a/libgo/go/runtime/traceback_gccgo.go b/libgo/go/runtime/traceback_gccgo.go
index 8551ec19ac3..b53dc6f8e30 100644
--- a/libgo/go/runtime/traceback_gccgo.go
+++ b/libgo/go/runtime/traceback_gccgo.go
@@ -9,9 +9,27 @@ package runtime
import (
"runtime/internal/sys"
+ "sync/atomic"
"unsafe"
)
+func GoroutineSetName(name string) {
+ var length uint32
+ if len(name) > GoroutineNameLengthMax {
+ length = GoroutineNameLengthMax
+ } else {
+ length = uint32(len(name))
+ }
+
+ _g_ := getg()
+
+ //! is locking required here? Play safe wrt goroutin