Re: getcontext() -> Bus error?
Re: getcontext() -> Bus error?
- Subject: Re: getcontext() -> Bus error?
- From: Terry Lambert <email@hidden>
- Date: Wed, 13 Feb 2008 20:56:05 -0800
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
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-).
Sorry? You lost me! Which stack variable?
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?
Kind regards,
Edd
On Feb 11, 2008, at 11:10 AM, Edd Dawson <email@hidden> 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.
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Darwin-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden