kicad-developers team mailing list archive
-
kicad-developers team
-
Mailing list archive
-
Message #22808
[RFC PATCH] No more boost::context
-
To:
Kicad Developers <kicad-developers@xxxxxxxxxxxxxxxxxxx>
-
From:
Tomasz Wlostowski <tomasz.wlostowski@xxxxxxx>
-
Date:
Thu, 21 Jan 2016 14:42:05 +0100
-
Authentication-results:
spf=pass (sender IP is 188.184.36.48) smtp.mailfrom=cern.ch; lists.launchpad.net; dkim=none (message not signed) header.d=none;lists.launchpad.net; dmarc=bestguesspass action=none header.from=cern.ch;
-
Spamdiagnosticmetadata:
NSPM
-
Spamdiagnosticoutput:
1:23
-
User-agent:
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1
Hi,
This patch replaces boost::context with a small library called
libcontext (derived from boost::context sources). It drops the
dependency on boost for the cost of one additional header file and cpp
file (taking inspiration from ClipperLib).
I've tested the new context switching code on Linux, OSX (El Capitan) &
Windows (all OS 32-bit and 64-bit Intel). Supported compilers are GCC
and Clang.
Let me know if Kicad builds and works correctly on your platforms...
Cheers,
Tom
>From 8381f20118ea06a6ffdc9f8c93c8f78fbba6d8f1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomasz=20W=C5=82ostowski?= <tomasz.wlostowski@xxxxxxx>
Date: Thu, 21 Jan 2016 14:29:29 +0100
Subject: [PATCH] tools: replace boost::context with libcontext
---
CMakeLists.txt | 2 +-
common/CMakeLists.txt | 2 +
common/system/libcontext.cpp | 536 +++++++++++++++++++++++++++++++++++++++++++
include/system/libcontext.h | 84 +++++++
include/tool/coroutine.h | 27 +--
5 files changed, 631 insertions(+), 20 deletions(-)
create mode 100644 common/system/libcontext.cpp
create mode 100644 include/system/libcontext.h
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f655f37..bea5039 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -460,7 +460,7 @@ find_package( Cairo 1.8.8 REQUIRED )
#
# Note: Prior to Boost 1.59, the Boost context library is not built when compiling on windows
# with GCC. You must patch the Boost sources.
-find_package( Boost 1.54.0 REQUIRED COMPONENTS context system thread )
+find_package( Boost 1.54.0 REQUIRED COMPONENTS system thread )
# Include MinGW resource compiler.
include( MinGWResourceCompiler )
diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index 048ddf0..d45064c 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -271,6 +271,8 @@ endif()
set( COMMON_SRCS
${COMMON_SRCS}
+ system/libcontext.cpp
+
kicad_curl/kicad_curl.cpp
kicad_curl/kicad_curl_easy.cpp
diff --git a/common/system/libcontext.cpp b/common/system/libcontext.cpp
new file mode 100644
index 0000000..5f08bcb
--- /dev/null
+++ b/common/system/libcontext.cpp
@@ -0,0 +1,536 @@
+/*
+
+ auto-generated file, do not modify!
+ libcontext - a slightly more portable version of boost::context
+ Copyright Martin Husemann 2013.
+ Copyright Oliver Kowalke 2009.
+ Copyright Sergue E. Leontiev 2013
+ Copyright Thomas Sailer 2013.
+ Minor modifications by Tomasz Wlostowski 2016.
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+
+*/
+#include <system/libcontext.h>
+
+#if defined(LIBCONTEXT_PLATFORM_windows_i386) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".p2align 4,,15\n"
+".globl _jump_fcontext\n"
+".def _jump_fcontext; .scl 2; .type 32; .endef\n"
+"_jump_fcontext:\n"
+" mov 0x10(%esp),%ecx\n"
+" push %ebp\n"
+" push %ebx\n"
+" push %esi\n"
+" push %edi\n"
+" mov %fs:0x18,%edx\n"
+" mov (%edx),%eax\n"
+" push %eax\n"
+" mov 0x4(%edx),%eax\n"
+" push %eax\n"
+" mov 0x8(%edx),%eax\n"
+" push %eax\n"
+" mov 0xe0c(%edx),%eax\n"
+" push %eax\n"
+" mov 0x10(%edx),%eax\n"
+" push %eax\n"
+" lea -0x8(%esp),%esp\n"
+" test %ecx,%ecx\n"
+" je nxt1\n"
+" stmxcsr (%esp)\n"
+" fnstcw 0x4(%esp)\n"
+"nxt1:\n"
+" mov 0x30(%esp),%eax\n"
+" mov %esp,(%eax)\n"
+" mov 0x34(%esp),%edx\n"
+" mov 0x38(%esp),%eax\n"
+" mov %edx,%esp\n"
+" test %ecx,%ecx\n"
+" je nxt2\n"
+" ldmxcsr (%esp)\n"
+" fldcw 0x4(%esp)\n"
+"nxt2:\n"
+" lea 0x8(%esp),%esp\n"
+" mov %fs:0x18,%edx\n"
+" pop %ecx\n"
+" mov %ecx,0x10(%edx)\n"
+" pop %ecx\n"
+" mov %ecx,0xe0c(%edx)\n"
+" pop %ecx\n"
+" mov %ecx,0x8(%edx)\n"
+" pop %ecx\n"
+" mov %ecx,0x4(%edx)\n"
+" pop %ecx\n"
+" mov %ecx,(%edx)\n"
+" pop %edi\n"
+" pop %esi\n"
+" pop %ebx\n"
+" pop %ebp\n"
+" pop %edx\n"
+" mov %eax,0x4(%esp)\n"
+" jmp *%edx\n"
+);
+
+#endif
+
+#if defined(LIBCONTEXT_PLATFORM_windows_i386) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".p2align 4,,15\n"
+".globl _make_fcontext\n"
+".def _make_fcontext; .scl 2; .type 32; .endef\n"
+"_make_fcontext:\n"
+"mov 0x4(%esp),%eax\n"
+"lea -0x8(%eax),%eax\n"
+"and $0xfffffff0,%eax\n"
+"lea -0x3c(%eax),%eax\n"
+"mov 0x4(%esp),%ecx\n"
+"mov %ecx,0x14(%eax)\n"
+"mov 0x8(%esp),%edx\n"
+"neg %edx\n"
+"lea (%ecx,%edx,1),%ecx\n"
+"mov %ecx,0x10(%eax)\n"
+"mov %ecx,0xc(%eax)\n"
+"mov 0xc(%esp),%ecx\n"
+"mov %ecx,0x2c(%eax)\n"
+"stmxcsr (%eax)\n"
+"fnstcw 0x4(%eax)\n"
+"mov $finish,%ecx\n"
+"mov %ecx,0x30(%eax)\n"
+"mov %fs:0x0,%ecx\n"
+"walk:\n"
+"mov (%ecx),%edx\n"
+"inc %edx\n"
+"je found\n"
+"dec %edx\n"
+"xchg %edx,%ecx\n"
+"jmp walk\n"
+"found:\n"
+"mov 0x4(%ecx),%ecx\n"
+"mov %ecx,0x3c(%eax)\n"
+"mov $0xffffffff,%ecx\n"
+"mov %ecx,0x38(%eax)\n"
+"lea 0x38(%eax),%ecx\n"
+"mov %ecx,0x18(%eax)\n"
+"ret\n"
+"finish:\n"
+"xor %eax,%eax\n"
+"mov %eax,(%esp)\n"
+"call _exit\n"
+"hlt\n"
+".def __exit; .scl 2; .type 32; .endef \n"
+);
+
+#endif
+
+#if defined(LIBCONTEXT_PLATFORM_windows_x86_64) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".p2align 4,,15\n"
+".globl jump_fcontext\n"
+".def jump_fcontext; .scl 2; .type 32; .endef\n"
+".seh_proc jump_fcontext\n"
+"jump_fcontext:\n"
+".seh_endprologue\n"
+" push %rbp\n"
+" push %rbx\n"
+" push %rsi\n"
+" push %rdi\n"
+" push %r15\n"
+" push %r14\n"
+" push %r13\n"
+" push %r12\n"
+" mov %gs:0x30,%r10\n"
+" mov 0x8(%r10),%rax\n"
+" push %rax\n"
+" mov 0x10(%r10),%rax\n"
+" push %rax\n"
+" mov 0x1478(%r10),%rax\n"
+" push %rax\n"
+" mov 0x18(%r10),%rax\n"
+" push %rax\n"
+" lea -0xa8(%rsp),%rsp\n"
+" test %r9,%r9\n"
+" je nxt1\n"
+" stmxcsr 0xa0(%rsp)\n"
+" fnstcw 0xa4(%rsp)\n"
+" movaps %xmm6,(%rsp)\n"
+" movaps %xmm7,0x10(%rsp)\n"
+" movaps %xmm8,0x20(%rsp)\n"
+" movaps %xmm9,0x30(%rsp)\n"
+" movaps %xmm10,0x40(%rsp)\n"
+" movaps %xmm11,0x50(%rsp)\n"
+" movaps %xmm12,0x60(%rsp)\n"
+" movaps %xmm13,0x70(%rsp)\n"
+" movaps %xmm14,0x80(%rsp)\n"
+" movaps %xmm15,0x90(%rsp)\n"
+"nxt1:\n"
+" xor %r10,%r10\n"
+" push %r10\n"
+" mov %rsp,(%rcx)\n"
+" mov %rdx,%rsp\n"
+" pop %r10\n"
+" test %r9,%r9\n"
+" je nxt2\n"
+" ldmxcsr 0xa0(%rsp)\n"
+" fldcw 0xa4(%rsp)\n"
+" movaps (%rsp),%xmm6\n"
+" movaps 0x10(%rsp),%xmm7\n"
+" movaps 0x20(%rsp),%xmm8\n"
+" movaps 0x30(%rsp),%xmm9\n"
+" movaps 0x40(%rsp),%xmm10\n"
+" movaps 0x50(%rsp),%xmm11\n"
+" movaps 0x60(%rsp),%xmm12\n"
+" movaps 0x70(%rsp),%xmm13\n"
+" movaps 0x80(%rsp),%xmm14\n"
+" movaps 0x90(%rsp),%xmm15\n"
+"nxt2:\n"
+" mov $0xa8,%rcx\n"
+" test %r10,%r10\n"
+" je nxt3\n"
+" add $0x8,%rcx\n"
+"nxt3:\n"
+" lea (%rsp,%rcx,1),%rsp\n"
+" mov %gs:0x30,%r10\n"
+" pop %rax\n"
+" mov %rax,0x18(%r10)\n"
+" pop %rax\n"
+" mov %rax,0x1478(%r10)\n"
+" pop %rax\n"
+" mov %rax,0x10(%r10)\n"
+" pop %rax\n"
+" mov %rax,0x8(%r10)\n"
+" pop %r12\n"
+" pop %r13\n"
+" pop %r14\n"
+" pop %r15\n"
+" pop %rdi\n"
+" pop %rsi\n"
+" pop %rbx\n"
+" pop %rbp\n"
+" pop %r10\n"
+" mov %r8,%rax\n"
+" mov %r8,%rcx\n"
+" jmpq *%r10\n"
+".seh_endproc\n"
+);
+
+#endif
+
+#if defined(LIBCONTEXT_PLATFORM_windows_x86_64) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".p2align 4,,15\n"
+".globl make_fcontext\n"
+".def make_fcontext; .scl 2; .type 32; .endef\n"
+".seh_proc make_fcontext\n"
+"make_fcontext:\n"
+".seh_endprologue\n"
+"mov %rcx,%rax\n"
+"sub $0x28,%rax\n"
+"and $0xfffffffffffffff0,%rax\n"
+"sub $0x128,%rax\n"
+"mov %r8,0x118(%rax)\n"
+"mov %rcx,0xd0(%rax)\n"
+"neg %rdx\n"
+"lea (%rcx,%rdx,1),%rcx\n"
+"mov %rcx,0xc8(%rax)\n"
+"mov %rcx,0xc0(%rax)\n"
+"stmxcsr 0xa8(%rax)\n"
+"fnstcw 0xac(%rax)\n"
+"leaq finish(%rip), %rcx\n"
+"mov %rcx,0x120(%rax)\n"
+"mov $0x1,%rcx\n"
+"mov %rcx,(%rax)\n"
+"retq\n"
+"finish:\n"
+"xor %rcx,%rcx\n"
+"callq 0x63\n"
+"hlt\n"
+" .seh_endproc\n"
+".def _exit; .scl 2; .type 32; .endef \n"
+);
+
+#endif
+
+#if defined(LIBCONTEXT_PLATFORM_linux_i386) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".globl jump_fcontext\n"
+".align 2\n"
+".type jump_fcontext,@function\n"
+"jump_fcontext:\n"
+" movl 0x10(%esp), %ecx\n"
+" pushl %ebp \n"
+" pushl %ebx \n"
+" pushl %esi \n"
+" pushl %edi \n"
+" leal -0x8(%esp), %esp\n"
+" test %ecx, %ecx\n"
+" je 1f\n"
+" stmxcsr (%esp)\n"
+" fnstcw 0x4(%esp)\n"
+"1:\n"
+" movl 0x1c(%esp), %eax\n"
+" movl %esp, (%eax)\n"
+" movl 0x20(%esp), %edx\n"
+" movl 0x24(%esp), %eax\n"
+" movl %edx, %esp\n"
+" test %ecx, %ecx\n"
+" je 2f\n"
+" ldmxcsr (%esp)\n"
+" fldcw 0x4(%esp)\n"
+"2:\n"
+" leal 0x8(%esp), %esp\n"
+" popl %edi \n"
+" popl %esi \n"
+" popl %ebx \n"
+" popl %ebp \n"
+" popl %edx\n"
+" movl %eax, 0x4(%esp)\n"
+" jmp *%edx\n"
+".size jump_fcontext,.-jump_fcontext\n"
+".section .note.GNU-stack,\"\",%progbits\n"
+);
+
+#endif
+
+#if defined(LIBCONTEXT_PLATFORM_linux_i386) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".globl make_fcontext\n"
+".align 2\n"
+".type make_fcontext,@function\n"
+"make_fcontext:\n"
+" movl 0x4(%esp), %eax\n"
+" leal -0x8(%eax), %eax\n"
+" andl $-16, %eax\n"
+" leal -0x20(%eax), %eax\n"
+" movl 0xc(%esp), %edx\n"
+" movl %edx, 0x18(%eax)\n"
+" stmxcsr (%eax)\n"
+" fnstcw 0x4(%eax)\n"
+" call 1f\n"
+"1: popl %ecx\n"
+" addl $finish-1b, %ecx\n"
+" movl %ecx, 0x1c(%eax)\n"
+" ret \n"
+"finish:\n"
+" call 2f\n"
+"2: popl %ebx\n"
+" addl $_GLOBAL_OFFSET_TABLE_+[.-2b], %ebx\n"
+" xorl %eax, %eax\n"
+" movl %eax, (%esp)\n"
+" call _exit@PLT\n"
+" hlt\n"
+".size make_fcontext,.-make_fcontext\n"
+".section .note.GNU-stack,\"\",%progbits\n"
+);
+
+#endif
+
+#if defined(LIBCONTEXT_PLATFORM_linux_x86_64) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".globl jump_fcontext\n"
+".type jump_fcontext,@function\n"
+".align 16\n"
+"jump_fcontext:\n"
+" pushq %rbp \n"
+" pushq %rbx \n"
+" pushq %r15 \n"
+" pushq %r14 \n"
+" pushq %r13 \n"
+" pushq %r12 \n"
+" leaq -0x8(%rsp), %rsp\n"
+" cmp $0, %rcx\n"
+" je 1f\n"
+" stmxcsr (%rsp)\n"
+" fnstcw 0x4(%rsp)\n"
+"1:\n"
+" movq %rsp, (%rdi)\n"
+" movq %rsi, %rsp\n"
+" cmp $0, %rcx\n"
+" je 2f\n"
+" ldmxcsr (%rsp)\n"
+" fldcw 0x4(%rsp)\n"
+"2:\n"
+" leaq 0x8(%rsp), %rsp\n"
+" popq %r12 \n"
+" popq %r13 \n"
+" popq %r14 \n"
+" popq %r15 \n"
+" popq %rbx \n"
+" popq %rbp \n"
+" popq %r8\n"
+" movq %rdx, %rax\n"
+" movq %rdx, %rdi\n"
+" jmp *%r8\n"
+".size jump_fcontext,.-jump_fcontext\n"
+".section .note.GNU-stack,\"\",%progbits\n"
+);
+
+#endif
+
+#if defined(LIBCONTEXT_PLATFORM_linux_x86_64) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".globl make_fcontext\n"
+".type make_fcontext,@function\n"
+".align 16\n"
+"make_fcontext:\n"
+" movq %rdi, %rax\n"
+" andq $-16, %rax\n"
+" leaq -0x48(%rax), %rax\n"
+" movq %rdx, 0x38(%rax)\n"
+" stmxcsr (%rax)\n"
+" fnstcw 0x4(%rax)\n"
+" leaq finish(%rip), %rcx\n"
+" movq %rcx, 0x40(%rax)\n"
+" ret \n"
+"finish:\n"
+" xorq %rdi, %rdi\n"
+" call _exit@PLT\n"
+" hlt\n"
+".size make_fcontext,.-make_fcontext\n"
+".section .note.GNU-stack,\"\",%progbits\n"
+);
+
+#endif
+
+#if defined(LIBCONTEXT_PLATFORM_apple_x86_64) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".globl _jump_fcontext\n"
+".align 8\n"
+"_jump_fcontext:\n"
+" pushq %rbp \n"
+" pushq %rbx \n"
+" pushq %r15 \n"
+" pushq %r14 \n"
+" pushq %r13 \n"
+" pushq %r12 \n"
+" leaq -0x8(%rsp), %rsp\n"
+" cmp $0, %rcx\n"
+" je 1f\n"
+" stmxcsr (%rsp)\n"
+" fnstcw 0x4(%rsp)\n"
+"1:\n"
+" movq %rsp, (%rdi)\n"
+" movq %rsi, %rsp\n"
+" cmp $0, %rcx\n"
+" je 2f\n"
+" ldmxcsr (%rsp)\n"
+" fldcw 0x4(%rsp)\n"
+"2:\n"
+" leaq 0x8(%rsp), %rsp\n"
+" popq %r12 \n"
+" popq %r13 \n"
+" popq %r14 \n"
+" popq %r15 \n"
+" popq %rbx \n"
+" popq %rbp \n"
+" popq %r8\n"
+" movq %rdx, %rax\n"
+" movq %rdx, %rdi\n"
+" jmp *%r8\n"
+);
+
+#endif
+
+#if defined(LIBCONTEXT_PLATFORM_apple_x86_64) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".globl _make_fcontext\n"
+".align 8\n"
+"_make_fcontext:\n"
+" movq %rdi, %rax\n"
+" movabs $-16, %r8\n"
+" andq %r8, %rax\n"
+" leaq -0x48(%rax), %rax\n"
+" movq %rdx, 0x38(%rax)\n"
+" stmxcsr (%rax)\n"
+" fnstcw 0x4(%rax)\n"
+" leaq finish(%rip), %rcx\n"
+" movq %rcx, 0x40(%rax)\n"
+" ret \n"
+"finish:\n"
+" xorq %rdi, %rdi\n"
+" call __exit\n"
+" hlt\n"
+);
+
+#endif
+
+#if defined(LIBCONTEXT_PLATFORM_apple_i386) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".globl _jump_fcontext\n"
+".align 2\n"
+"_jump_fcontext:\n"
+" movl 0x10(%esp), %ecx\n"
+" pushl %ebp \n"
+" pushl %ebx \n"
+" pushl %esi \n"
+" pushl %edi \n"
+" leal -0x8(%esp), %esp\n"
+" test %ecx, %ecx\n"
+" je 1f\n"
+" stmxcsr (%esp)\n"
+" fnstcw 0x4(%esp)\n"
+"1:\n"
+" movl 0x1c(%esp), %eax\n"
+" movl %esp, (%eax)\n"
+" movl 0x20(%esp), %edx\n"
+" movl 0x24(%esp), %eax\n"
+" movl %edx, %esp\n"
+" test %ecx, %ecx\n"
+" je 2f\n"
+" ldmxcsr (%esp)\n"
+" fldcw 0x4(%esp)\n"
+"2:\n"
+" leal 0x8(%esp), %esp\n"
+" popl %edi \n"
+" popl %esi \n"
+" popl %ebx \n"
+" popl %ebp \n"
+" popl %edx\n"
+" movl %eax, 0x4(%esp)\n"
+" jmp *%edx\n"
+);
+
+#endif
+
+#if defined(LIBCONTEXT_PLATFORM_apple_i386) && defined(LIBCONTEXT_COMPILER_gcc)
+__asm (
+".text\n"
+".globl _make_fcontext\n"
+".align 2\n"
+"_make_fcontext:\n"
+" movl 0x4(%esp), %eax\n"
+" leal -0x8(%eax), %eax\n"
+" andl $-16, %eax\n"
+" leal -0x20(%eax), %eax\n"
+" movl 0xc(%esp), %edx\n"
+" movl %edx, 0x18(%eax)\n"
+" stmxcsr (%eax)\n"
+" fnstcw 0x4(%eax)\n"
+" call 1f\n"
+"1: popl %ecx\n"
+" addl $finish-1b, %ecx\n"
+" movl %ecx, 0x1c(%eax)\n"
+" ret \n"
+"finish:\n"
+" xorl %eax, %eax\n"
+" movl %eax, (%esp)\n"
+" call __exit\n"
+" hlt\n"
+);
+
+#endif
+
+
diff --git a/include/system/libcontext.h b/include/system/libcontext.h
new file mode 100644
index 0000000..23eb01e
--- /dev/null
+++ b/include/system/libcontext.h
@@ -0,0 +1,84 @@
+/*
+
+ libcontext - a slightly more portable version of boost::context
+
+ Copyright Martin Husemann 2013.
+ Copyright Oliver Kowalke 2009.
+ Copyright Sergue E. Leontiev 2013.
+ Copyright Thomas Sailer 2013.
+ Minor modifications by Tomasz Wlostowski 2016.
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+
+*/
+
+#ifndef __LIBCONTEXT_H
+#define __LIBCONTEXT_H
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stddef.h>
+
+
+#if defined(__GNUC__) || defined(__APPLE__)
+
+
+
+ #define LIBCONTEXT_COMPILER_gcc
+
+ #if defined(__linux__)
+ #ifdef __x86_64__
+ #define LIBCONTEXT_PLATFORM_linux_x86_64
+ #define LIBCONTEXT_CALL_CONVENTION
+
+ #elif __i386__
+ #define LIBCONTEXT_PLATFORM_linux_i386
+ #define LIBCONTEXT_CALL_CONVENTION
+ #endif
+ #elif defined(__MINGW32__) || defined (__MINGW64__)
+ #if defined(__x86_64__)
+ #define LIBCONTEXT_COMPILER_gcc
+ #define LIBCONTEXT_PLATFORM_windows_x86_64
+ #define LIBCONTEXT_CALL_CONVENTION
+ #endif
+
+ #if defined(__i386__)
+ #define LIBCONTEXT_COMPILER_gcc
+ #define LIBCONTEXT_PLATFORM_windows_i386
+ #define LIBCONTEXT_CALL_CONVENTION __cdecl
+ #endif
+ #elif defined(__APPLE__) && defined(__MACH__)
+ #if defined (__i386__)
+ #define LIBCONTEXT_PLATFORM_apple_i386
+ #define LIBCONTEXT_CALL_CONVENTION
+ #elif defined (__x86_64__)
+ #define LIBCONTEXT_PLATFORM_apple_x86_64
+ #define LIBCONTEXT_CALL_CONVENTION
+ #endif
+ #endif
+#endif
+
+
+#if defined(_WIN32_WCE)
+typedef int intptr_t;
+#endif
+
+typedef void* fcontext_t;
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+intptr_t LIBCONTEXT_CALL_CONVENTION jump_fcontext( fcontext_t * ofc, fcontext_t nfc,
+ intptr_t vp, bool preserve_fpu = false);
+fcontext_t LIBCONTEXT_CALL_CONVENTION make_fcontext( void * sp, size_t size, void (* fn)( intptr_t) );
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
+
diff --git a/include/tool/coroutine.h b/include/tool/coroutine.h
index c7eaf5f..afef8b2 100644
--- a/include/tool/coroutine.h
+++ b/include/tool/coroutine.h
@@ -27,8 +27,7 @@
#include <cstdlib>
-#include <boost/context/fcontext.hpp>
-#include <boost/version.hpp>
+#include <system/libcontext.h>
#include "delegate.h"
@@ -92,10 +91,8 @@ public:
if( m_saved )
delete m_saved;
-#if BOOST_VERSION >= 105600
if( m_self )
delete m_self;
-#endif
if( m_stack )
free( m_stack );
@@ -156,13 +153,9 @@ public:
assert( m_saved == NULL );
m_args = &aArgs;
-#if BOOST_VERSION >= 105600
- m_self = new boost::context::fcontext_t();
- *m_self = boost::context::make_fcontext( sp, m_stackSize, callerStub );
-#else
- m_self = boost::context::make_fcontext( sp, m_stackSize, callerStub );
-#endif
- m_saved = new boost::context::fcontext_t();
+ m_self = new fcontext_t();
+ *m_self = make_fcontext( sp, m_stackSize, callerStub );
+ m_saved = new fcontext_t();
m_running = true;
// off we go!
@@ -222,14 +215,10 @@ private:
}
///> Wrapper for jump_fcontext to assure compatibility between different boost versions
- static inline intptr_t jump(boost::context::fcontext_t* aOld, boost::context::fcontext_t* aNew,
+ static inline intptr_t jump(fcontext_t* aOld, fcontext_t* aNew,
intptr_t aP, bool aPreserveFPU = true )
{
-#if BOOST_VERSION >= 105600
- return boost::context::jump_fcontext( aOld, *aNew, aP, aPreserveFPU );
-#else
- return boost::context::jump_fcontext( aOld, aNew, aP, aPreserveFPU );
-#endif
+ return jump_fcontext( aOld, *aNew, aP, aPreserveFPU );
}
template <typename T>
@@ -252,10 +241,10 @@ private:
ReturnType m_retVal;
///< saved caller context
- boost::context::fcontext_t* m_saved;
+ fcontext_t* m_saved;
///< saved coroutine context
- boost::context::fcontext_t* m_self;
+ fcontext_t* m_self;
///< coroutine stack
void* m_stack;
--
1.9.1
Follow ups