Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 // Copyright 2009 The Go Authors. All rights reserved. | 1 // Copyright 2009 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 #include "runtime.h" | 5 #include "runtime.h" |
6 #include "defs.h" | 6 #include "defs.h" |
7 #include "os.h" | 7 #include "os.h" |
8 | 8 |
9 #pragma dynimport runtime·LoadLibraryEx LoadLibraryExA "kernel32.dll" | 9 #pragma dynimport runtime·LoadLibraryEx LoadLibraryExA "kernel32.dll" |
10 #pragma dynimport runtime·GetProcAddress GetProcAddress "kernel32.dll" | 10 #pragma dynimport runtime·GetProcAddress GetProcAddress "kernel32.dll" |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
291 // MOV callbackasm, AX | 291 // MOV callbackasm, AX |
292 void* (*x)(void) = runtime·callbackasm; | 292 void* (*x)(void) = runtime·callbackasm; |
293 *p++ = 0xb8; | 293 *p++ = 0xb8; |
294 *(uint32*)p = (uint32)x; | 294 *(uint32*)p = (uint32)x; |
295 p += 4; | 295 p += 4; |
296 // CALL AX | 296 // CALL AX |
297 *p++ = 0xff; | 297 *p++ = 0xff; |
298 *p = 0xd0; | 298 *p = 0xd0; |
299 } | 299 } |
300 | 300 |
301 enum { StackGuard = 256 }; // defined in proc.c | 301 enum { StackGuard = 2048 }; // defined in proc.c |
hector
2011/01/22 00:39:39
StackGuard is now equal to 2048. Not sure how this
brainman
2011/01/22 02:31:11
Set StackGuard to 2048. I think we should get rid
| |
302 | 302 |
303 #pragma textflag 7 | 303 #pragma textflag 7 |
304 void* | 304 void* |
305 runtime·callback(void *arg, void (*fn)(void), int32 argsize) | 305 runtime·callback(void *arg, void (*fn)(void), int32 argsize) |
306 { | 306 { |
307 Gobuf msched, g1sched; | 307 Gobuf msched, g1sched; |
308 G *g1; | 308 G *g1; |
309 void *sp, *gostack; | 309 void *sp, *gostack; |
310 void **p; | 310 void **p; |
311 USED(argsize); | 311 USED(argsize); |
312 | 312 |
313 | 313 |
314 if(g != m->g0) | 314 if(g != m->g0) |
315 runtime·throw("bad g in callback"); | 315 runtime·throw("bad g in callback"); |
316 | 316 |
317 g1 = m->curg; | 317 g1 = m->curg; |
318 | 318 |
319 gostack = m->gostack; // preserve previous call stack paramete rs | 319 gostack = m->gostack; // preserve previous call stack paramete rs |
320 msched = m->sched; | 320 msched = m->sched; |
321 g1sched = g1->sched; | 321 g1sched = g1->sched; |
322 | 322 |
323 runtime·startcgocallback(g1); | 323 runtime·startcgocallback(g1); |
324 | 324 |
325 » sp = g1->sched.sp - 8;» » // our go function will have one input p aram (pointer to args) and one return value | 325 » sp = g1->sched.sp - 4 - 4;» // one input, one output |
326 | 326 |
327 if(sp < g1->stackguard - StackGuard + 4) // +4 for return address | 327 if(sp < g1->stackguard - StackGuard + 4) // +4 for return address |
328 runtime·throw("g stack overflow in callback"); | 328 runtime·throw("g stack overflow in callback"); |
329 ········ | 329 ········ |
330 p = sp; | 330 p = sp; |
331 p[0] = arg; | 331 p[0] = arg; |
332 | 332 |
333 runtime·runcgocallback(g1, sp, fn); | 333 runtime·runcgocallback(g1, sp, fn); |
334 | 334 |
335 runtime·endcgocallback(g1); | 335 runtime·endcgocallback(g1); |
336 | 336 |
337 g1->sched = g1sched;· | 337 g1->sched = g1sched;· |
338 m->sched = msched; | 338 m->sched = msched; |
339 m->gostack = gostack; // restore previous call stack parameter s | 339 m->gostack = gostack; // restore previous call stack parameter s |
340 | 340 |
341 return p[1]; | 341 return p[1]; |
342 } | 342 } |
LEFT | RIGHT |