It's OK for me. 2010/12/6 <[email protected]>
> This is an automated email from the git hooks/post-receive script. It was > generated because a ref change was pushed to the repository containing > the project "Tarantool -- an efficient key/value data store". > > The branch fiber-raise has been created > at f5e9d16768f3e5dacb675a0650b27439e18e324b (commit) > > > commit f5e9d16768f3e5dacb675a0650b27439e18e324b > Author: Yuriy Vostrikov <[email protected]> > Date: Mon Dec 6 14:32:12 2010 +0300 > > [core] Add ability to raise an exception in the other fiber. > > diff --git a/core/fiber.c b/core/fiber.c > index 1e9b741..328e4d0 100644 > --- a/core/fiber.c > +++ b/core/fiber.c > @@ -110,6 +110,24 @@ fiber_call(struct fiber *callee) > } > > void > +fiber_raise(struct fiber *callee, jmp_buf exc, int value) > +{ > + struct fiber *caller = fiber; > + > + assert(sp - call_stack < 8); > + assert(caller); > + > + fiber = callee; > + *sp++ = caller; > + > +#if CORO_ASM > + save_rbp(&caller->rbp); > +#endif > + callee->csw++; > + coro_save_and_longjmp(&caller->coro.ctx, exc, value); > +} > + > +void > yield(void) > { > struct fiber *callee = *(--sp); > diff --git a/include/fiber.h b/include/fiber.h > index 63e21ad..7a18070 100644 > --- a/include/fiber.h > +++ b/include/fiber.h > @@ -156,6 +156,7 @@ ssize_t fiber_flush_output(void); > void fiber_cleanup(void); > void fiber_gc(void); > void fiber_call(struct fiber *callee); > +void fiber_raise(struct fiber *callee, jmp_buf exc, int value); > int fiber_connect(struct sockaddr_in *addr); > void fiber_sleep(ev_tstamp s); > void fiber_info(struct tbuf *out); > diff --git a/third_party/coro/coro.c b/third_party/coro/coro.c > index 43c8824..3546628 100644 > --- a/third_party/coro/coro.c > +++ b/third_party/coro/coro.c > @@ -150,6 +150,40 @@ trampoline (int sig) > #endif > "\tret\n" > ); > + asm ( > + ".text\n" > + ".globl coro_save_and_longjmp\n" > + ".type coro_save_and_longjmp, @function\n" > + "coro_save_and_longjmp:\n" > + #if __amd64 > + #define NUM_SAVED 6 > + "\tpush %rbp\n" > + "\tpush %rbx\n" > + "\tpush %r12\n" > + "\tpush %r13\n" > + "\tpush %r14\n" > + "\tpush %r15\n" > + "\tmov %rsp, (%rdi)\n" > + "\tmovq %rsi, %rdi\n" > + "\tsubq $8, %rsp\n" > + "\tmovl %edx, %esi\n" > + "\tcall longjmp\n" > + #elif __i386 > + #define NUM_SAVED 4 > + "\tpush %ebp\n" > + "\tpush %ebx\n" > + "\tpush %esi\n" > + "\tpush %edi\n" > + "\tmov %esp, (%eax)\n" > + "\tsubl $0x28,%esp\n" > + "\tmovl %ecx,0x4(%esp)\n" > + "\tmovl %edx,(%esp)\n" > + "\tcall longjmp\n" > + #else > + #error unsupported architecture > + #endif > + "\tret\n" > + ); > > # endif > > diff --git a/third_party/coro/coro.h b/third_party/coro/coro.h > index bc84c0a..e931718 100644 > --- a/third_party/coro/coro.h > +++ b/third_party/coro/coro.h > @@ -262,16 +262,21 @@ struct coro_context { > }; > > # define coro_transfer(p,n) do { if (!coro_setjmp ((p)->env)) coro_longjmp > ((n)->env); } while (0) > +# define coro_save_and_longjmp(p,j,v) do { if (!coro_setjmp ((p)->env)) > longjmp (j,v); } while (0) > # define coro_destroy(ctx) (void *)(ctx) > > #elif CORO_ASM > > +# include <setjmp.h> /* for jmp_buf */ > + > struct coro_context { > void **sp; /* must be at offset 0 */ > }; > > void __attribute__ ((noinline, regparm(2))) > coro_transfer (coro_context *prev, coro_context *next); > +void __attribute__ ((noinline, regparm(3))) > +coro_save_and_longjmp (coro_context *prev, jmp_buf jump, int value); > > # define coro_destroy(ctx) (void *)(ctx) > > > > -- > Tarantool -- an efficient key/value data store > > _______________________________________________ > Mailing list: https://launchpad.net/~tarantool-developers > Post to : [email protected] > Unsubscribe : https://launchpad.net/~tarantool-developers > More help : https://help.launchpad.net/ListHelp > -- С уважением, Роман Токарев.
_______________________________________________ Mailing list: https://launchpad.net/~tarantool-developers Post to : [email protected] Unsubscribe : https://launchpad.net/~tarantool-developers More help : https://help.launchpad.net/ListHelp

