void x_cgo_init(G *g, void (*setg)(void*)) { pthread_attr_t attr; size_t size; void *handle; setg_gcc = setg; pthread_attr_init(&attr); pthread_attr_getstacksize(&attr, &size); g->stackguard = (uintptr)&attr - size + 4096; pthread_attr_destroy(&attr); // Locate symbol for the system pthread_create function. handle = dlopen("libpthread.so", RTLD_LAZY); if(handle == NULL) { fprintf(stderr, "dlopen: failed to load libpthread: %s\n", dlerror()); abort(); } sys_pthread_create = dlsym(handle, "pthread_create"); if(sys_pthread_create == NULL) { fprintf(stderr, "dlsym: failed to find pthread_create: %s\n", dlerror()); abort(); } dlclose(handle); tcb_fixup(1); }
static void* threadentry(void *v) { ThreadStart ts; tcb_fixup(0); ts = *(ThreadStart*)v; free(v); ts.g->stackbase = (uintptr)&ts; /* * _cgo_sys_thread_start set stackguard to stack size; * change to actual guard pointer. */ ts.g->stackguard = (uintptr)&ts - ts.g->stackguard + 4096; /* * Set specific keys. */ setg_gcc((void*)ts.g); crosscall_386(ts.fn); return nil; }
static void * thread_start_wrapper(void *arg) { struct thread_args args = *(struct thread_args *)arg; free(arg); tcb_fixup(0); return args.func(args.arg); }
static void* threadentry(void *v) { ThreadStart ts; tcb_fixup(0); ts = *(ThreadStart*)v; free(v); /* * Set specific keys. */ setg_gcc((void*)ts.g); crosscall_amd64(ts.fn); return nil; }
void x_cgo_init(G *g, void (*setg)(void*)) { pthread_attr_t attr; size_t size; setg_gcc = setg; pthread_attr_init(&attr); pthread_attr_getstacksize(&attr, &size); g->stacklo = (uintptr)&attr - size + 4096; pthread_attr_destroy(&attr); if(pthread_once(&init_pthread_wrapper_once, init_pthread_wrapper) != 0) { fprintf(stderr, "runtime/cgo: failed to initialize pthread_create wrapper\n"); abort(); } tcb_fixup(1); }