← Back to team overview

kicad-developers team mailing list archive

[RFC PATCH] No more boost::context

 

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