delete some old libsnes libco junk
This commit is contained in:
parent
a9cda4a21f
commit
ea7c12cee8
Binary file not shown.
Binary file not shown.
|
@ -1,178 +0,0 @@
|
||||||
/*
|
|
||||||
libco.sjlj (2008-01-28)
|
|
||||||
author: Nach
|
|
||||||
license: public domain
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note this was designed for UNIX systems. Based on ideas expressed in a paper
|
|
||||||
* by Ralf Engelschall.
|
|
||||||
* For SJLJ on other systems, one would want to rewrite springboard() and
|
|
||||||
* co_create() and hack the jmb_buf stack pointer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define LIBCO_C
|
|
||||||
#define LIBCO_EXPORT
|
|
||||||
#include "../bsnes/libco/libco.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <setjmp.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
jmp_buf context;
|
|
||||||
coentry_t coentry;
|
|
||||||
void *stack;
|
|
||||||
unsigned long seh_frame, stack_top, stack_bottom;
|
|
||||||
cothread_t caller;
|
|
||||||
} cothread_struct;
|
|
||||||
|
|
||||||
static thread_local cothread_struct co_primary;
|
|
||||||
static thread_local cothread_struct *co_running = 0;
|
|
||||||
|
|
||||||
|
|
||||||
//links of interest
|
|
||||||
//http://connect.microsoft.com/VisualStudio/feedback/details/100319/really-wierd-behaviour-in-crt-io-coupled-with-some-inline-assembly
|
|
||||||
//http://en.wikipedia.org/wiki/Thread_Information_Block
|
|
||||||
//http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/72093e46-4524-4f54-9f36-c7e8a309d1db/ //FS warning
|
|
||||||
|
|
||||||
|
|
||||||
#define WINVER 0x0400
|
|
||||||
#define _WIN32_WINNT 0x0400
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#pragma warning(disable:4733)
|
|
||||||
#pragma warning(disable:4311)
|
|
||||||
|
|
||||||
static void capture_fs(cothread_struct* rec)
|
|
||||||
{
|
|
||||||
int temp;
|
|
||||||
__asm mov eax, dword ptr fs:[0];
|
|
||||||
__asm mov temp, eax;
|
|
||||||
rec->seh_frame = temp;
|
|
||||||
__asm mov eax, dword ptr fs:[4];
|
|
||||||
__asm mov temp, eax;
|
|
||||||
rec->stack_top = temp;
|
|
||||||
__asm mov eax, dword ptr fs:[8];
|
|
||||||
__asm mov temp, eax;
|
|
||||||
rec->stack_bottom = temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void restore_fs(cothread_struct* rec)
|
|
||||||
{
|
|
||||||
int temp;
|
|
||||||
temp = rec->seh_frame;
|
|
||||||
__asm mov eax, temp;
|
|
||||||
__asm mov dword ptr fs:[0], eax
|
|
||||||
temp = rec->stack_top;
|
|
||||||
__asm mov eax, temp;
|
|
||||||
__asm mov dword ptr fs:[4], eax
|
|
||||||
temp = rec->stack_bottom;
|
|
||||||
__asm mov eax, temp;
|
|
||||||
__asm mov dword ptr fs:[8], eax
|
|
||||||
}
|
|
||||||
|
|
||||||
static void os_co_wrapper()
|
|
||||||
{
|
|
||||||
cothread_struct* rec = (cothread_struct*)co_active();
|
|
||||||
//__try
|
|
||||||
//{
|
|
||||||
rec->coentry();
|
|
||||||
//}
|
|
||||||
//__except(EXCEPTION_EXECUTE_HANDLER)
|
|
||||||
//{
|
|
||||||
// //unhandled win32 exception in coroutine.
|
|
||||||
// //this coroutine will now be suspended permanently and control will be yielded to caller, for lack of anything better to do.
|
|
||||||
// //perhaps the process should just terminate.
|
|
||||||
// for(;;)
|
|
||||||
// {
|
|
||||||
// //dead coroutine
|
|
||||||
// co_switch(rec->caller);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void os_co_create(cothread_struct* rec, unsigned int size, coentry_t coentry)
|
|
||||||
{
|
|
||||||
_JUMP_BUFFER* jb = (_JUMP_BUFFER*)&rec->context;
|
|
||||||
cothread_struct temp;
|
|
||||||
|
|
||||||
jb->Esp = (unsigned long)rec->stack + size - 4;
|
|
||||||
jb->Eip = (unsigned long)os_co_wrapper;
|
|
||||||
|
|
||||||
rec->stack_top = jb->Esp + 4;
|
|
||||||
rec->stack_bottom = (unsigned long)rec->stack;
|
|
||||||
|
|
||||||
//wild assumption about SEH frame.. seems to work
|
|
||||||
capture_fs(&temp);
|
|
||||||
rec->seh_frame = temp.seh_frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void os_pre_setjmp(cothread_t target)
|
|
||||||
{
|
|
||||||
cothread_struct* rec = (cothread_struct*)target;
|
|
||||||
capture_fs(co_running);
|
|
||||||
rec->caller = co_running;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void os_pre_longjmp(cothread_struct* rec)
|
|
||||||
{
|
|
||||||
restore_fs(rec);
|
|
||||||
}
|
|
||||||
|
|
||||||
__declspec(dllexport) cothread_t co_active()
|
|
||||||
{
|
|
||||||
if(!co_running) co_running = &co_primary;
|
|
||||||
return (cothread_t)co_running;
|
|
||||||
}
|
|
||||||
|
|
||||||
__declspec(dllexport) cothread_t co_create(unsigned int size, void (*coentry)(void))
|
|
||||||
{
|
|
||||||
cothread_struct *thread;
|
|
||||||
|
|
||||||
if(!co_running) co_running = &co_primary;
|
|
||||||
|
|
||||||
thread = (cothread_struct*)malloc(sizeof(cothread_struct));
|
|
||||||
if(thread)
|
|
||||||
{
|
|
||||||
thread->coentry = coentry;
|
|
||||||
thread->stack = malloc(size);
|
|
||||||
{
|
|
||||||
setjmp(thread->context);
|
|
||||||
os_co_create(thread,size,coentry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (cothread_t)thread;
|
|
||||||
}
|
|
||||||
|
|
||||||
__declspec(dllexport) void co_delete(cothread_t cothread)
|
|
||||||
{
|
|
||||||
if(cothread)
|
|
||||||
{
|
|
||||||
if(((cothread_struct*)cothread)->stack)
|
|
||||||
{
|
|
||||||
free(((cothread_struct*)cothread)->stack);
|
|
||||||
}
|
|
||||||
free(cothread);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
__declspec(dllexport) void co_switch(cothread_t cothread)
|
|
||||||
{
|
|
||||||
os_pre_setjmp(cothread);
|
|
||||||
if(!setjmp(co_running->context))
|
|
||||||
{
|
|
||||||
co_running = (cothread_struct*)cothread;
|
|
||||||
os_pre_longjmp(co_running);
|
|
||||||
longjmp(co_running->context,0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,20 +0,0 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
|
||||||
# Visual Studio 2010
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libco_msvc_win32", "libco_msvc_win32.vcxproj", "{C5D03072-BBF9-4DED-8CE6-5467736251BF}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{C5D03072-BBF9-4DED-8CE6-5467736251BF}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{C5D03072-BBF9-4DED-8CE6-5467736251BF}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{C5D03072-BBF9-4DED-8CE6-5467736251BF}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{C5D03072-BBF9-4DED-8CE6-5467736251BF}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
|
@ -1,111 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{C5D03072-BBF9-4DED-8CE6-5467736251BF}</ProjectGuid>
|
|
||||||
<RootNamespace>libco_msvc_win32</RootNamespace>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
|
|
||||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
|
|
||||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
|
|
||||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
|
|
||||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
|
|
||||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
|
|
||||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
|
|
||||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
|
||||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
|
||||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
|
|
||||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<PreBuildEvent>
|
|
||||||
<Command>
|
|
||||||
</Command>
|
|
||||||
</PreBuildEvent>
|
|
||||||
<ClCompile>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBCO_MSVC_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<MinimalRebuild>true</MinimalRebuild>
|
|
||||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
|
||||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<TargetMachine>MachineX86</TargetMachine>
|
|
||||||
</Link>
|
|
||||||
<PostBuildEvent>
|
|
||||||
<Command>copy $(TargetPath) ..\..\BizHawk.MultiClient\output\dll</Command>
|
|
||||||
</PostBuildEvent>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<PreBuildEvent>
|
|
||||||
<Command>
|
|
||||||
</Command>
|
|
||||||
</PreBuildEvent>
|
|
||||||
<ClCompile>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBCO_MSVC_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<TargetMachine>MachineX86</TargetMachine>
|
|
||||||
</Link>
|
|
||||||
<PostBuildEvent>
|
|
||||||
<Command>copy $(TargetPath) ..\..\BizHawk.MultiClient\output\dll</Command>
|
|
||||||
</PostBuildEvent>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="libco_msvc_win32.c" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="readme.txt" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
|
@ -1,12 +0,0 @@
|
||||||
* Why does this exist?
|
|
||||||
|
|
||||||
Because zeromus can't figure out how to successfully compile this code in mingw32.
|
|
||||||
My efforts are in trying-to-port-to-mingw-win32.c; I don't know why it isn't working.
|
|
||||||
|
|
||||||
* Why do we need this code?
|
|
||||||
|
|
||||||
Because libco needs to be a bit more properly win32 in order for it to get used from .net code.
|
|
||||||
.net throws exceptions in each thread when it needs to suspend them for GC.
|
|
||||||
Those exceptions get garbled without more proper win32 stack frame setup, and the process terminates.
|
|
||||||
Additionally, you wont be able to debug very well from callbacks out of a coroutine into c# without this.
|
|
||||||
* Note: you can't debug very well anyway due to mingw code having no debug symbols in the callstack.
|
|
|
@ -1,178 +0,0 @@
|
||||||
//links of interest
|
|
||||||
//http://connect.microsoft.com/VisualStudio/feedback/details/100319/really-wierd-behaviour-in-crt-io-coupled-with-some-inline-assembly
|
|
||||||
//http://en.wikipedia.org/wiki/Thread_Information_Block
|
|
||||||
//http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/72093e46-4524-4f54-9f36-c7e8a309d1db/ //FS warning
|
|
||||||
|
|
||||||
#define LIBCO_C
|
|
||||||
#define LIBCO_EXPORT
|
|
||||||
#include "../bsnes/libco/libco.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <setjmp.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef void (*coentry_t)(void);
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
jmp_buf context;
|
|
||||||
coentry_t coentry;
|
|
||||||
void *stack;
|
|
||||||
unsigned long seh_frame, stack_top, stack_bottom;
|
|
||||||
cothread_t caller;
|
|
||||||
} cothread_struct;
|
|
||||||
|
|
||||||
static thread_local cothread_struct co_primary;
|
|
||||||
static thread_local cothread_struct *co_running = 0;
|
|
||||||
|
|
||||||
#define WINVER 0x0400
|
|
||||||
#define _WIN32_WINNT 0x0400
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#ifndef _MSC_VER
|
|
||||||
typedef struct __JUMP_BUFFER {
|
|
||||||
unsigned long Ebp;
|
|
||||||
unsigned long Ebx;
|
|
||||||
unsigned long Edi;
|
|
||||||
unsigned long Esi;
|
|
||||||
unsigned long Esp;
|
|
||||||
unsigned long Eip;
|
|
||||||
unsigned long Registration;
|
|
||||||
unsigned long TryLevel;
|
|
||||||
unsigned long Cookie;
|
|
||||||
unsigned long UnwindFunc;
|
|
||||||
unsigned long UnwindData[6];
|
|
||||||
} _JUMP_BUFFER;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#pragma warning(disable:4733)
|
|
||||||
#pragma warning(disable:4311)
|
|
||||||
|
|
||||||
static void capture_fs(cothread_struct* rec)
|
|
||||||
{
|
|
||||||
asm(
|
|
||||||
"mov %0, dword ptr fs:[0];"
|
|
||||||
"mov %1, dword ptr fs:[4];"
|
|
||||||
"mov %2, dword ptr fs:[8];"
|
|
||||||
:"=r"(rec->seh_frame), "=r"(rec->stack_top), "=r"(rec->stack_bottom)
|
|
||||||
:
|
|
||||||
:
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void restore_fs(cothread_struct* rec)
|
|
||||||
{
|
|
||||||
asm(
|
|
||||||
"mov dword ptr fs:[0], %0;"
|
|
||||||
"mov dword ptr fs:[4], %1;"
|
|
||||||
"mov dword ptr fs:[8], %2;"
|
|
||||||
:
|
|
||||||
:"r"(rec->seh_frame), "r"(rec->stack_top), "r"(rec->stack_bottom)
|
|
||||||
:
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void os_co_wrapper()
|
|
||||||
{
|
|
||||||
cothread_struct* rec = (cothread_struct*)co_active();
|
|
||||||
//__try
|
|
||||||
//{
|
|
||||||
rec->coentry();
|
|
||||||
//}
|
|
||||||
//__except(EXCEPTION_EXECUTE_HANDLER)
|
|
||||||
//{
|
|
||||||
// //unhandled win32 exception in coroutine.
|
|
||||||
// //this coroutine will now be suspended permanently and control will be yielded to caller, for lack of anything better to do.
|
|
||||||
// //perhaps the process should just terminate.
|
|
||||||
// for(;;)
|
|
||||||
// {
|
|
||||||
// //dead coroutine
|
|
||||||
// co_switch(rec->caller);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void os_co_create(cothread_struct* rec, unsigned int size, coentry_t coentry)
|
|
||||||
{
|
|
||||||
_JUMP_BUFFER* jb = (_JUMP_BUFFER*)&rec->context;
|
|
||||||
cothread_struct temp;
|
|
||||||
|
|
||||||
jb->Esp = (unsigned long)rec->stack + size - 4;
|
|
||||||
jb->Eip = (unsigned long)os_co_wrapper;
|
|
||||||
|
|
||||||
rec->stack_top = jb->Esp + 4;
|
|
||||||
rec->stack_bottom = (unsigned long)rec->stack;
|
|
||||||
|
|
||||||
//wild assumption about SEH frame.. seems to work
|
|
||||||
capture_fs(&temp);
|
|
||||||
rec->seh_frame = temp.seh_frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void os_pre_setjmp(cothread_t target)
|
|
||||||
{
|
|
||||||
cothread_struct* rec = (cothread_struct*)target;
|
|
||||||
capture_fs(co_running);
|
|
||||||
rec->caller = co_running;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void os_pre_longjmp(cothread_struct* rec)
|
|
||||||
{
|
|
||||||
restore_fs(rec);
|
|
||||||
}
|
|
||||||
|
|
||||||
cothread_t co_active()
|
|
||||||
{
|
|
||||||
if(!co_running) co_running = &co_primary;
|
|
||||||
return (cothread_t)co_running;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
cothread_t co_create(unsigned int size, void (*coentry)(void))
|
|
||||||
{
|
|
||||||
cothread_struct *thread;
|
|
||||||
|
|
||||||
if(!co_running) co_running = &co_primary;
|
|
||||||
|
|
||||||
thread = (cothread_struct*)malloc(sizeof(cothread_struct));
|
|
||||||
if(thread)
|
|
||||||
{
|
|
||||||
thread->coentry = coentry;
|
|
||||||
thread->stack = malloc(size);
|
|
||||||
{
|
|
||||||
setjmp(thread->context);
|
|
||||||
os_co_create(thread,size,coentry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (cothread_t)thread;
|
|
||||||
}
|
|
||||||
|
|
||||||
void co_delete(cothread_t cothread)
|
|
||||||
{
|
|
||||||
if(cothread)
|
|
||||||
{
|
|
||||||
if(((cothread_struct*)cothread)->stack)
|
|
||||||
{
|
|
||||||
free(((cothread_struct*)cothread)->stack);
|
|
||||||
}
|
|
||||||
free(cothread);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void co_switch(cothread_t cothread)
|
|
||||||
{
|
|
||||||
os_pre_setjmp(cothread);
|
|
||||||
if(!setjmp(co_running->context))
|
|
||||||
{
|
|
||||||
co_running = (cothread_struct*)cothread;
|
|
||||||
os_pre_longjmp(co_running);
|
|
||||||
longjmp(co_running->context,0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
Loading…
Reference in New Issue