|
|
|
@ -9,6 +9,10 @@
|
|
|
|
|
|
|
|
|
|
boost::thread_specific_ptr<int> ptr;
|
|
|
|
|
|
|
|
|
|
// http://www.boost.org/doc/libs/1_60_0/libs/context/doc/html/context/context.html
|
|
|
|
|
#include <boost/context/all.hpp>
|
|
|
|
|
boost::context::fcontext_t fcm,fc1,fc2;
|
|
|
|
|
|
|
|
|
|
void test_thread()
|
|
|
|
|
{
|
|
|
|
|
if (ptr.get() == 0) {
|
|
|
|
@ -17,6 +21,23 @@ void test_thread()
|
|
|
|
|
std::cout << "Hello, World! from thread" << std::endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void f1(intptr_t)
|
|
|
|
|
{
|
|
|
|
|
std::cout<<"f1: entered"<<std::endl;
|
|
|
|
|
std::cout<<"f1: call jump_fcontext( & fc1, fc2, 0)"<< std::endl;
|
|
|
|
|
boost::context::jump_fcontext(&fc1,fc2,0);
|
|
|
|
|
std::cout<<"f1: return"<<std::endl;
|
|
|
|
|
boost::context::jump_fcontext(&fc1,fcm,0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void f2(intptr_t)
|
|
|
|
|
{
|
|
|
|
|
std::cout<<"f2: entered"<<std::endl;
|
|
|
|
|
std::cout<<"f2: call jump_fcontext( & fc2, fc1, 0)"<<std::endl;
|
|
|
|
|
boost::context::jump_fcontext(&fc2,fc1,0);
|
|
|
|
|
BOOST_ASSERT(false&&!"f2: never returns");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
|
|
|
{
|
|
|
|
|
(void)argc;
|
|
|
|
@ -29,5 +50,15 @@ int main(int argc, char *argv[])
|
|
|
|
|
boost::thread thrd(test_thread);
|
|
|
|
|
thrd.join();
|
|
|
|
|
|
|
|
|
|
std::size_t size(8192);
|
|
|
|
|
void* sp1(std::malloc(size));
|
|
|
|
|
void* sp2(std::malloc(size));
|
|
|
|
|
|
|
|
|
|
fc1=boost::context::make_fcontext(sp1,size,f1);
|
|
|
|
|
fc2=boost::context::make_fcontext(sp2,size,f2);
|
|
|
|
|
|
|
|
|
|
std::cout<<"main: call jump_fcontext( & fcm, fc1, 0)"<<std::endl;
|
|
|
|
|
boost::context::jump_fcontext(&fcm,fc1,0);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|