site_archiver@lists.apple.com Delivered-To: darwin-dev@lists.apple.com User-agent: Thunderbird 2.0.0.9 (Windows/20071031) On Feb 3, 2008, at 4:43 PM, Edd Dawson wrote: Thanks again, Kevin. That worked great! #define _XOPEN_SOURCE #include <ucontext.h> #include <signal.h> #include <cassert> #include <cstdio> #include <cstdlib> #include <vector> struct context { context(ucontext_t ctx, void (*func)()) : ctx_(ctx), func_(func), stack_(MINSIGSTKSZ) { ctx_.uc_stack.ss_sp = &stack_.front(); ctx_.uc_stack.ss_size = stack_.size(); ctx_.uc_link = 0; makecontext(&ctx_, func_, 0); } context(ucontext_t ctx) : ctx_(ctx), func_(0), stack_() { } static void change(context &from, context &to) { swapcontext(&from.ctx_, &to.ctx_); } ucontext_t ctx_; void (*func_)(); std::vector<char> stack_; }; std::vector<context *> all; void die(const char *msg) { perror(msg); exit(666); } void hello() { puts("hello"); assert(all.size() == 2); context::change(*all[1], *all[0]); } int main() { ucontext_t ctx; if (getcontext(&ctx) == -1) die("getcontext failed"); all.push_back(new context(ctx)); if (getcontext(&ctx) == -1) die("getcontext failed"); all.push_back(new context(ctx, &hello)); assert(all.size() == 2); context::change(*all[0], *all[1]); return 0; } I'm compiling with: g++ getcontext3.cpp -o getcontext3 -W -Wall -ansi -pedantic Thanks again for all your help so far! Kind regards, Edd _______________________________________________ Do not post admin requests to the list. They will be ignored. Darwin-dev mailing list (Darwin-dev@lists.apple.com) Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/darwin-dev/site_archiver%40lists.appl... Kevin Van Vechten wrote: That seems to have stopped the bus error -- thanks! -- but now I'm getting what I believe is fishy behaviour from swapcontext(). The following program prints "about to swapcontext()..." indefinitely. The 4096-byte stack storage provided is too small for Darwin. The stack size should be at least MINSIGSTKSZ (include signal.h to get this constant). I hope this is my final question on the matter. The following code is failing on Leopard. The assert() in main() is triggered. The vector's size appears to be 3?! This email sent to site_archiver@lists.apple.com