|  | // Copyright 2011 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | // +build ignore | 
|  |  | 
|  | #ifdef WIN32 | 
|  | // A Windows DLL is unable to call an arbitrary function in | 
|  | // the main executable. Work around that by making the main | 
|  | // executable pass the callback function pointer to us. | 
|  | void (*goCallback)(void); | 
|  | __declspec(dllexport) void setCallback(void *f) | 
|  | { | 
|  | goCallback = (void (*)())f; | 
|  | } | 
|  | __declspec(dllexport) void sofunc(void); | 
|  | #else | 
|  | extern void goCallback(void); | 
|  | void setCallback(void *f) { (void)f; } | 
|  | #endif | 
|  |  | 
|  | // OpenBSD and older Darwin lack TLS support | 
|  | #if !defined(__OpenBSD__) && !defined(__APPLE__) | 
|  | __thread int tlsvar = 12345; | 
|  | #endif | 
|  |  | 
|  | void sofunc(void) | 
|  | { | 
|  | goCallback(); | 
|  | } |