site_archiver@lists.apple.com Delivered-To: darwin-dev@lists.apple.com This declaration is on the main program stack: ucontext_t ctx; it's not allocated on the heap (e.g. via malloc), and it's not global. -- Terry Sorry? You lost me! Which stack variable? 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... On Feb 12, 2008, at 10:15 AM, Edd Dawson wrote: Terry Lambert wrote: Given your use of a stack variable, it makes all sorts if sense. 8-). This isn't an entirely pointless follow-up; if you can shed some light on why the code failed on Darwin but not on Linux, I'm interested to know more. All I thought I needed to do before calling makecontext() was ensure that I had a stack allocated and uc_link set appropriately? On Feb 11, 2008, at 11:10 AM, Edd Dawson <lists@mr-edd.co.uk> wrote: Edd Dawson wrote: Kevin Van Vechten wrote: On Feb 3, 2008, at 4:43 PM, Edd Dawson wrote: 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?! #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; } This all works fine when I move getcontext() in to the same function as the associated makecontext(), which makes sense from a certain point of view. This email sent to site_archiver@lists.apple.com
participants (1)
-
Terry Lambert