📄 stack.c
字号:
//// This file is part of the C++ threads library.//// Copyright (C) 2001 Orn E. Hansen#include "thread.h"#include "exception.h"#include "stack.h"#include "cloning.h"#include <cerrno>#include <cstring>#include <iostream.h>extern "C" {# include <malloc.h>};#if defined(_ARCH_PPC)# define THREADS_SP JB_GPR1#else# define THREADS_SP JB_SP#endifnamespace cpp_threads { ThreadStack::ThreadStack(int p_size) { _have_context = false; _saved = 0; if( p_size <= 0 ) p_size = 8*4096; _sp.size = p_size; _sp.stack = new char[p_size]; if( _sp.stack == 0 ) exception::fatal(ENOMEM); } ThreadStack::~ThreadStack() { delete _sp.stack; if( _have_context && _saved ) delete _saved; } bool ThreadStack::getcontext() { int x; _have_context = false; if( _saved ) delete _saved; if( (x = setjmp(_context)) == 0 ) { int size = (int)top() - _context->__jmpbuf[THREADS_SP]; _pos = &_sp.stack[_sp.size - size - 1]; _saved = new char[size+1]; if( _saved ) { _have_context = true; memcpy(_saved,_pos,size); } } else { ThreadStack *ts = (ThreadStack *)x; int size = (int)ts->top() - (int)ts->stack_pos(); memcpy(ts->stack_pos(),ts->saved_stack(),size); return true; } return false; } void ThreadStack::setcontext() { if( _have_context ) longjmp(_context,(int)this); } void * ThreadStack::stack_pos() { return _pos; } void * ThreadStack::saved_stack() { return _saved; } void *ThreadStack::top() { return (void *)(_sp.stack + _sp.size - 1); } ThreadStack::operator struct cppThreadStack() { return _sp; } ThreadStack::operator struct cppThreadStack *() { return &_sp; }};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -