• This repository has been archived on 05/Dec/2019
  • Stars
    star
    111
  • Rank 314,510 (Top 7 %)
  • Language
    Go
  • License
    Other
  • Created about 9 years ago
  • Updated almost 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

[DEPRECATED] Expose goroutine id to wild world. Alternative approach is https://github.com/huandu/go-tls

Hacking goroutine

Build Status

[DEPRECATED]

Package goroutine is merely a hack. It exports goroutine id to outside so that you can use it for whatever purpose. However, it's highly recommended to not use this package in your daily life. It may be broken at any go release as it's a hack.

Usage

Get the latest version through go get -u github.com/huandu/goroutine.

Get current goroutine id with goroutine.GoroutineId().

// Get id of current goroutine.
var id int64 = goroutine.GoroutineId()
println(id)

See godoc for more details.

Supported builds

Package goroutine is not well tested due to lack of test machines. Ideally, it should work on all go >= go1.5.

Tested platforms.

  • Darwin (Mac OSX 10.11.6) + amd64 CPU
    • go1.5.1
    • go1.6.3
    • go1.7
    • go1.7.1
    • go1.7.3
    • go1.7.4
    • go1.7.5
    • go1.8
    • go1.8.1
    • go1.9
    • go1.9.2
  • Travis CI (See https://travis-ci.org/huandu/goroutine)
    • go1.5
    • go1.5.1
    • go1.5.2
    • go1.5.3
    • go1.5.4
    • go1.6
    • go1.6.1
    • go1.6.2
    • go1.6.3
    • go1.7
    • go1.7.1
    • go1.7.2
    • go1.7.3
    • go1.7.4
    • go1.7.5
    • go1.8
    • go1.8.1
    • go1.8.2
    • go1.8.3
    • go1.9
    • go1.9.1
    • go1.9.2

How it works

Go runtime inside a Go program binary is statically linked. It means, if I know Go version and runtime source code for this version, I can copy struct declaration from runtime package source to my package and cast runtime internal pointers to its underlying struct safely. As Go source code is open for everyone, I can always find the right struct for an interesting runtime pointer and then manipulate it.

In this package, I just get current goroutine pointer (copy the getg() implementation from compiler), cast it to a right struct and then return the id. It sounds simple but of course not. The struct g refers to many other internal types defined in runtime package. I cannot simply copy some necessary types to make it work. I have to scan all types and constants in runtime and its internal packages to make the struct g well defined. Another challenge is that Go authors update runtime structs in nearly every major version (or even in a minor version). I have to maintain hacked code for every Go release respectively. I develop a semi-automatical tool to make things easier. The tool is not smart enough. I may need to think of other better way to avoid to generate hacked source code for every Go release.

NOTE: Starting from go1.7.2, Go compiler generates some constant definitions for runtime package according to build flags and environment when building. It makes current hack impossible to handle all posibile flags and environment combinations. I make a hack to detour it and no impact to the major task of this package - get goroutine id. However, it's not a perfect solution.

I'm thinking of a perfect solution. If you have any suggestion, please open issue and let me know. Many thanks.

License

This package is licensed under MIT license. See LICENSE for details.

More Repositories

1

go-sqlbuilder

A flexible and powerful SQL string builder library plus a zero-config ORM.
Go
1,445
star
2

xstrings

Implements string functions widely used in other languages but absent in Go.
Go
1,398
star
3

facebook

A Facebook Graph API SDK For Go.
Go
1,330
star
4

skiplist

Fast and easy-to-use skip list for Go.
Go
375
star
5

go-clone

Clone any Go data structure deeply and thoroughly.
Go
302
star
6

go-tls

A bit safer approach to implement Thread Local Storage (TLS) for Go 1.7+.
Go
162
star
7

go-assert

Magic assert macros for Go.
Go
27
star
8

gin

gin - a simple & efficient HTML5 game engine
JavaScript
25
star
9

node-ascii85

Ascii85 (Base85) encoding/decoding module for node.js.
JavaScript
18
star
10

ObjCMixin

A ruby-like mixin in Object-C.
Objective-C
10
star
11

gin-samples

Samples using the gin
JavaScript
9
star
12

spritemapper

A Java program which creates sprite maps (or sprite sheets) from a set of input images.
Java
9
star
13

nocycle.js

Detect cycle `require` in node.js.
JavaScript
9
star
14

go-magicstring

Attach arbitrary data to a Go string
Go
7
star
15

handyhttpd

A handy http server to enable public http access on any folder within a few seconds.
Go
6
star
16

yuki

A flexible and efficient mysql client written in C
C
5
star
17

bashtools

Several bash scripts to make life easier
Shell
3
star
18

go-singleton

Generic singleton for Go.
Go
2
star
19

heybox-url

Calculate Heybox url hash.
JavaScript
2
star
20

node-facter

A wrapper for puppet `facter` tool
JavaScript
2
star
21

express-handler

Provide a per-request `this` object for express router handlers.
JavaScript
1
star
22

design-doc-chs

1
star