1
0
mirror of https://github.com/golang/go synced 2024-11-20 04:54:44 -07:00
go/src/runtime/runtime.h

297 lines
6.0 KiB
C
Raw Normal View History

2008-06-05 20:38:39 -06:00
// Copyright 2009 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.
/*
* basic types
*/
typedef signed char int8;
typedef unsigned char uint8;
typedef signed short int16;
typedef unsigned short uint16;
typedef signed int int32;
typedef unsigned int uint32;
typedef signed long long int int64;
typedef unsigned long long int uint64;
typedef float float32;
typedef double float64;
/*
* get rid of C types
*/
#define unsigned XXunsigned
#define signed XXsigned
#define char XXchar
#define short XXshort
#define int XXint
#define long XXlong
#define float XXfloat
#define double XXdouble
/*
* defined types
*/
typedef uint8 bool;
typedef uint8 byte;
2008-07-13 15:29:46 -06:00
typedef struct String *string;
typedef struct Sigs Sigs;
typedef struct Sigi Sigi;
typedef struct Map Map;
typedef struct Gobuf Gobuf;
typedef struct G G;
typedef struct M M;
typedef struct Stktop Stktop;
2008-07-13 15:29:46 -06:00
typedef struct Alg Alg;
typedef struct Lock Lock;
typedef struct Rendez Rendez;
typedef struct Mem Mem;
2008-07-13 15:29:46 -06:00
/*
* per cpu declaration
*/
extern register G* g; // R15
extern register M* m; // R14
/*
* defined constants
*/
enum
{
// G status
Gidle,
Grunnable,
Grunning,
2008-07-14 15:33:39 -06:00
Gwaiting,
2008-07-13 15:29:46 -06:00
Gdead,
};
enum
{
true = 1,
false = 0,
};
/*
* structures
*/
struct Lock
{
uint32 key;
};
struct Rendez
{
Lock* l;
uint32 sleeping; // someone is sleeping (Linux)
};
2008-07-13 15:29:46 -06:00
struct String
2008-06-05 20:38:39 -06:00
{
int32 len;
byte str[1];
2008-07-13 15:29:46 -06:00
};
struct Sigs
2008-06-05 20:38:39 -06:00
{
byte* name;
uint32 hash;
void (*fun)(void);
2008-07-13 15:29:46 -06:00
};
struct Sigi
2008-06-05 20:38:39 -06:00
{
byte* name;
uint32 hash;
uint32 offset;
2008-07-13 15:29:46 -06:00
};
2008-06-05 20:38:39 -06:00
struct Map
{
Sigi* si;
Sigs* ss;
Map* link;
int32 bad;
int32 unused;
void (*fun[])(void);
};
struct Gobuf
{
byte* SP;
byte* PC;
};
struct G
{
byte* stackguard; // must not move
byte* stackbase; // must not move
byte* stack0; // first stack segment
Gobuf sched;
G* alllink; // on allg
void* param; // passed parameter on wakeup
int16 status;
int32 goid;
int32 selgen; // valid sudog pointer
G* runlink;
Lock runlock;
M* m; // for debuggers
};
struct Mem
{
uint8* hunk;
uint32 nhunk;
uint64 nmmap;
uint64 nmal;
};
struct M
{
G* g0; // g0 w interrupt stack - must not move
uint64 morearg; // arg to morestack - must not move
uint64 cret; // return value from C - must not move
G* curg; // current running goroutine
G* lastg; // last running goroutine - to emulate fifo
Gobuf sched;
Gobuf morestack;
byte* moresp;
int32 siz1;
int32 siz2;
Rendez waitr;
M* waitlink;
int32 pid; // for debuggers
Mem mem;
};
2008-07-14 15:33:39 -06:00
struct Stktop
2008-07-13 15:29:46 -06:00
{
uint8* oldbase;
uint8* oldsp;
uint64 magic;
uint8* oldguard;
};
2008-07-13 15:29:46 -06:00
struct Alg
{
2008-07-13 15:29:46 -06:00
uint64 (*hash)(uint32, void*);
uint32 (*equal)(uint32, void*, void*);
void (*print)(uint32, void*);
void (*copy)(uint32, void*, void*);
};
2008-07-13 15:29:46 -06:00
struct SigTab
2008-06-05 20:38:39 -06:00
{
2008-07-13 15:29:46 -06:00
int32 catch;
int8 *name;
2008-06-05 20:38:39 -06:00
};
/*
* defined macros
* you need super-goru privilege
* to add this list.
*/
#define nelem(x) (sizeof(x)/sizeof((x)[0]))
#define nil ((void*)0)
2008-07-13 15:29:46 -06:00
/*
* external data
*/
extern Alg algarray[3];
extern string emptystring;
M* allm;
G* allg;
int32 goidgen;
extern int32 gomaxprocs;
2008-07-13 15:29:46 -06:00
/*
* common functions and data
*/
int32 strcmp(byte*, byte*);
int32 findnull(int8*);
void dump(byte*, int32);
int32 runetochar(byte*, int32);
int32 chartorune(uint32*, byte*);
2008-06-05 20:38:39 -06:00
/*
2008-06-16 23:34:50 -06:00
* very low level c-called
2008-06-05 20:38:39 -06:00
*/
int32 gogo(Gobuf*);
int32 gosave(Gobuf*);
int32 gogoret(Gobuf*, uint64);
void retfromnewstack(void);
void setspgoto(byte*, void(*)(void), void(*)(void));
2008-06-05 20:38:39 -06:00
void FLUSH(void*);
void* getu(void);
2008-06-16 23:34:50 -06:00
void throw(int8*);
2008-07-13 15:29:46 -06:00
uint32 rnd(uint32, uint32);
2008-06-05 20:38:39 -06:00
void prints(int8*);
void mcpy(byte*, byte*, uint32);
void* mal(uint32);
2008-06-16 23:34:50 -06:00
uint32 cmpstring(string, string);
void initsig(void);
void traceback(uint8 *pc, uint8 *sp, G* gp);
void tracebackothers(G*);
int32 open(byte*, int32, ...);
int32 read(int32, void*, int32);
int32 write(int32, void*, int32);
void close(int32);
int32 fstat(int32, void*);
bool cas(uint32*, uint32, uint32);
uint32 xadd(uint32*, uint32);
void exit1(int32);
void ready(G*);
byte* getenv(int8*);
int32 atoi(byte*);
void newosproc(M *mm, G *gg, void *stk, void (*fn)(void*), void *arg);
int32 getprocid(void);
/*
* mutual exclusion locks. in the uncontended case,
* as fast as spin locks (just a few user-level instructions),
* but on the contention path they sleep in the kernel.
*/
void lock(Lock*);
void unlock(Lock*);
void lockinit(Lock*);
/*
* sleep and wakeup.
* a Rendez is somewhere to sleep. it is protected by the lock r->l.
* the caller must acquire r->l, check the condition, and if the
* condition is false, call rsleep. rsleep will atomically drop the lock
* and go to sleep. a subsequent rwakeup (caller must hold r->l)
* will wake up the guy who is rsleeping. the lock keeps rsleep and
* rwakeup from missing each other.
* n.b. only one proc can rsleep on a given rendez at a time.
*/
void rsleep(Rendez*);
void rwakeup(Rendez*);
void rwakeupandunlock(Rendez*);
2008-06-16 23:34:50 -06:00
/*
* low level go -called
*/
void sys·goexit(void);
void sys·gosched(void);
void sys·exit(int32);
void sys·write(int32, void*, int32);
void sys·breakpoint(void);
uint8* sys·mmap(byte*, uint32, int32, int32, int32, uint32);
void sys·memclr(byte*, uint32);
void sys·setcallerpc(void*, void*);
void* sys·getcallerpc(void*);
void sys·sigaction(int64, void*, void*);
void sys·rt_sigaction(int64, void*, void*, uint64);
2008-06-05 20:38:39 -06:00
/*
2008-06-16 23:34:50 -06:00
* runtime go-called
2008-06-05 20:38:39 -06:00
*/
void sys·printbool(bool);
void sys·printfloat(float64);
void sys·printint(int64);
void sys·printstring(string);
void sys·printpc(void*);
void sys·printpointer(void*);
void sys·catstring(string, string, string);
void sys·cmpstring(string, string, int32);
void sys·slicestring(string, int32, int32, string);
void sys·indexstring(string, int32, byte);
void sys·intstring(int64, string);
void sys·ifaces2i(Sigi*, Sigs*, Map*, void*);
void sys·ifacei2i(Sigi*, Map*, void*);
void sys·ifacei2s(Sigs*, Map*, void*);
/*
* User go-called
*/
void sys·readfile(string, string, bool);
void sys·bytestorune(byte*, int32, int32, int32, int32);
void sys·stringtorune(string, int32, int32, int32, int32);