Commit 50108304 authored by Matt Caswell's avatar Matt Caswell
Browse files

Async port to windows



Reviewed-by: default avatarRich Salz <rsalz@openssl.org>
parent 38148a23
Loading
Loading
Loading
Loading
+19 −4
Original line number Diff line number Diff line
@@ -17,13 +17,13 @@ TEST=
APPS=

LIB=$(TOP)/libcrypto.a
LIBSRC=async.c
LIBOBJ=async.o
LIBSRC=async.c arch/async_posix.c arch/async_win.c
LIBOBJ=async.o arch/async_posix.o arch/async_win.o

SRC= $(LIBSRC)

EXHEADER= async.h
HEADER=	$(EXHEADER)
HEADER=	$(EXHEADER) async_locl.h arch/async_posix.h arch/async_win.h

ALL=    $(GENERAL) $(SRC) $(HEADER)

@@ -73,11 +73,26 @@ dclean:

clean:
	rm -f *.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
	rm -f arch/*.o arch/*.obj arch/lib arch/tags arch/core arch/.pure arch/.nfs* arch/*.old arch/*.bak arch/fluff

# DO NOT DELETE THIS LINE -- make depend depends on it.

arch/async_posix.o: ../../include/openssl/async.h
arch/async_posix.o: ../../include/openssl/crypto.h
arch/async_posix.o: ../../include/openssl/e_os2.h
arch/async_posix.o: ../../include/openssl/opensslconf.h
arch/async_posix.o: ../../include/openssl/opensslv.h
arch/async_posix.o: ../../include/openssl/ossl_typ.h
arch/async_posix.o: ../../include/openssl/safestack.h
arch/async_posix.o: ../../include/openssl/stack.h
arch/async_posix.o: ../../include/openssl/symhacks.h arch/../arch/async_posix.h
arch/async_posix.o: arch/../arch/async_win.h arch/../async_locl.h
arch/async_posix.o: arch/async_posix.c
arch/async_win.o: ../../include/openssl/async.h arch/async_win.c
arch/async_win.o: arch/async_win.h
async.o: ../../include/openssl/async.h ../../include/openssl/crypto.h
async.o: ../../include/openssl/e_os2.h ../../include/openssl/opensslconf.h
async.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
async.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
async.o: ../../include/openssl/symhacks.h async.c
async.o: ../../include/openssl/symhacks.h arch/async_posix.h arch/async_win.h
async.o: async.c async_locl.h
+85 −0
Original line number Diff line number Diff line
/* crypto/async/arch/async_posix.c */
/*
 * Written by Matt Caswell (matt@openssl.org) for the OpenSSL project.
 */
/* ====================================================================
 * Copyright (c) 2015 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 */

#include "../async_locl.h"
#include <openssl/async.h>

#ifdef ASYNC_SYSV
# include <stddef.h>
# include <ucontext.h>
# include <openssl/crypto.h>
# include <openssl/async.h>

__thread ASYNC_CTX *sysvctx;

int ASYNC_FIBRE_init(ASYNC_FIBRE *fibre)
{
    void *stack = NULL;

    if (!(stack = OPENSSL_malloc(SIGSTKSZ))) {
        return 0;
    }

    fibre->fibre.uc_stack.ss_sp = stack;
    fibre->fibre.uc_stack.ss_size = SIGSTKSZ;
    fibre->fibre.uc_link = NULL;

    return 1;
}

void ASYNC_FIBRE_free(ASYNC_FIBRE *fibre)
{
    if (fibre->fibre.uc_stack.ss_sp)
        OPENSSL_free(fibre->fibre.uc_stack.ss_sp);
}
#endif
+89 −0
Original line number Diff line number Diff line
/* crypto/async/arch/async_posix.h */
/*
 * Written by Matt Caswell (matt@openssl.org) for the OpenSSL project.
 */
/* ====================================================================
 * Copyright (c) 2015 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 */
#include <openssl/e_os2.h>

#ifdef OPENSSL_SYS_UNIX

# include <unistd.h>

# if _POSIX_VERSION >= 200112L

#  define ASYNC_SYSV
#  define ASYNC_ARCH

#  include <ucontext.h>

extern __thread ASYNC_CTX *sysvctx;

typedef struct async_fibre_st {
    ucontext_t fibre;
} ASYNC_FIBRE;

#  define ASYNC_set_ctx(nctx)             (sysvctx = (nctx))
#  define ASYNC_get_ctx()                 (sysvctx)
#  define ASYNC_FIBRE_swapcontext(o,n,r) \
            ((r)? \
                !swapcontext(&(o)->fibre, &(n)->fibre) \
            : \
                !setcontext(&(n)->fibre))
#  define ASYNC_FIBRE_makecontext(c) \
            (ASYNC_FIBRE_init(c) \
            && !getcontext(&(c)->fibre) \
            && (makecontext(&(c)->fibre, ASYNC_start_func, 0), 1))
#  define ASYNC_FIBRE_init_dispatcher(d)

int ASYNC_FIBRE_init(ASYNC_FIBRE *fibre);
void ASYNC_FIBRE_free(ASYNC_FIBRE *fibre);

# endif
#endif
+84 −0
Original line number Diff line number Diff line
/* crypto/async/arch/async_win.c */
/*
 * Written by Matt Caswell (matt@openssl.org) for the OpenSSL project.
 */
/* ====================================================================
 * Copyright (c) 2015 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 */

#include "async_win.h"

#ifdef ASYNC_WIN

# include <windows.h>
# include "cryptlib.h"

void ASYNC_start_func(void);

int ASYNC_FIBRE_init_dispatcher(ASYNC_FIBRE *fibre)
{
    LPVOID dispatcher;

    dispatcher =
        (LPVOID) CRYPTO_get_thread_local(CRYPTO_THREAD_LOCAL_ASYNC_DISPATCH);
    if (!dispatcher) {
        fibre->fibre = ConvertThreadToFiber(NULL);
        CRYPTO_set_thread_local(CRYPTO_THREAD_LOCAL_ASYNC_DISPATCH,
                                (void *)fibre->fibre);
    } else {
        fibre->fibre = dispatcher;
    }
    return 1;
}

VOID CALLBACK ASYNC_start_func_win(PVOID unused)
{
    ASYNC_start_func();
}

#endif
+84 −0
Original line number Diff line number Diff line
/* crypto/async/arch/async_win.h */
/*
 * Written by Matt Caswell (matt@openssl.org) for the OpenSSL project.
 */
/* ====================================================================
 * Copyright (c) 2015 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 */

#include <openssl/async.h>

/*
 * This is the same detection used in cryptlib to set up the thread local
 * storage that we depend on, so just copy that
 */
#if defined(_WIN32) || defined(__CYGWIN__)
# define ASYNC_WIN
# define ASYNC_ARCH

# include <windows.h>
# include "cryptlib.h"

typedef struct async_fibre_st {
    LPVOID fibre;
} ASYNC_FIBRE;

# define ASYNC_set_ctx(nctx) \
        (CRYPTO_set_thread_local(CRYPTO_THREAD_LOCAL_ASYNC_CTX, (void *)(nctx)))
# define ASYNC_get_ctx() \
        ((ASYNC_CTX *)CRYPTO_get_thread_local(CRYPTO_THREAD_LOCAL_ASYNC_CTX))
# define ASYNC_FIBRE_swapcontext(o,n,r) \
        (SwitchToFiber((n)->fibre), 1)
# define ASYNC_FIBRE_makecontext(c) \
        ((c)->fibre = CreateFiber(0, ASYNC_start_func_win, 0))
# define ASYNC_FIBRE_free(f)             (DeleteFiber((f)->fibre))

int ASYNC_FIBRE_init_dispatcher(ASYNC_FIBRE *fibre);
VOID CALLBACK ASYNC_start_func_win(PVOID unused);

#endif
Loading