view contrib/python-zstandard/zstd/common/threading.c @ 35654:59c842a3d1e1

hgweb: remove unused second argument of nextPageVarGet() nextPageVarGet is a function that's used in ajaxScrollInit() to produce URL of the next page. Before f84b01257e06, its second argument previousVal was a number on /graph pages, and the code was simply adding 60 to it and returning the resulting value. Now previousVal can only be a string containing changeset hash, which can't be used the same way (and in fact isn't used in any way).
author Anton Shestakov <av6@dwimlabs.net>
date Mon, 15 Jan 2018 19:44:18 +0800
parents c32454d69b85
children b1fb341d8a61
line wrap: on
line source


/**
 * Copyright (c) 2016 Tino Reichardt
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 *
 * You can contact the author at:
 * - zstdmt source repository: https://github.com/mcmilk/zstdmt
 */

/**
 * This file will hold wrapper for systems, which do not support pthreads
 */

/* ======   Compiler specifics   ====== */
#if defined(_MSC_VER)
#  pragma warning(disable : 4206)        /* disable: C4206: translation unit is empty (when ZSTD_MULTITHREAD is not defined) */
#endif


#if defined(ZSTD_MULTITHREAD) && defined(_WIN32)

/**
 * Windows minimalist Pthread Wrapper, based on :
 * http://www.cse.wustl.edu/~schmidt/win32-cv-1.html
 */


/* ===  Dependencies  === */
#include <process.h>
#include <errno.h>
#include "threading.h"


/* ===  Implementation  === */

static unsigned __stdcall worker(void *arg)
{
    pthread_t* const thread = (pthread_t*) arg;
    thread->arg = thread->start_routine(thread->arg);
    return 0;
}

int pthread_create(pthread_t* thread, const void* unused,
            void* (*start_routine) (void*), void* arg)
{
    (void)unused;
    thread->arg = arg;
    thread->start_routine = start_routine;
    thread->handle = (HANDLE) _beginthreadex(NULL, 0, worker, thread, 0, NULL);

    if (!thread->handle)
        return errno;
    else
        return 0;
}

int _pthread_join(pthread_t * thread, void **value_ptr)
{
    DWORD result;

    if (!thread->handle) return 0;

    result = WaitForSingleObject(thread->handle, INFINITE);
    switch (result) {
    case WAIT_OBJECT_0:
        if (value_ptr) *value_ptr = thread->arg;
        return 0;
    case WAIT_ABANDONED:
        return EINVAL;
    default:
        return GetLastError();
    }
}

#endif   /* ZSTD_MULTITHREAD */