⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stack.c

📁 用c++包装好的线程库,直接拿来使用,提高效率.
💻 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 + -