Blame src/util/wrappers/mpiu_process_wrappers.h

Packit 0848f5
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit 0848f5
/*
Packit 0848f5
 *  (C) 2006 by Argonne National Laboratory.
Packit 0848f5
 *      See COPYRIGHT in top-level directory.
Packit 0848f5
 */
Packit 0848f5
#ifndef MPIU_PROCESS_WRAPPERS_H_INCLUDED
Packit 0848f5
#define MPIU_PROCESS_WRAPPERS_H_INCLUDED
Packit 0848f5
/* MPIU_PW --> MPI Util Process Wrapper */
Packit 0848f5
#include "mpichconf.h"
Packit 0848f5
Packit 0848f5
/* MPIU_PW_SCHED_YIELD() - Yield the processor to OS scheduler */
Packit 0848f5
/* On a typical Linux system (verified with kernels 3.2 and 3.5),
Packit 0848f5
 * usleep has a resolution of more than 1000 cycles. This makes
Packit 0848f5
 * it impractical if the desired sleeping period is shorter. On
Packit 0848f5
 * the other hand, sleep(0) returns immediately without going to
Packit 0848f5
 * the kernel. This means that there is no actual yielding, which
Packit 0848f5
 * is equivalent to doing nothing. Thus, usleep and sleep are not
Packit 0848f5
 * recommended as ways to yield the CPU, and sched_yield would be
Packit 0848f5
 * preferred if available.
Packit 0848f5
 * Note that nanosleep has the same shortcomings as usleep.*/
Packit 0848f5
Packit 0848f5
#if defined(USE_SWITCHTOTHREAD_FOR_YIELD)
Packit 0848f5
    #include <winsock2.h>
Packit 0848f5
    #include <windows.h>
Packit 0848f5
    #define MPIU_PW_Sched_yield() SwitchToThread()
Packit 0848f5
#elif defined(USE_WIN32_SLEEP_FOR_YIELD)
Packit 0848f5
    #include <winsock2.h>
Packit 0848f5
    #include <windows.h>
Packit 0848f5
    #define MPIU_PW_Sched_yield() Sleep(0)
Packit 0848f5
#elif defined(USE_SCHED_YIELD_FOR_YIELD)
Packit 0848f5
    #ifdef HAVE_SCHED_H
Packit 0848f5
        #include <sched.h>
Packit 0848f5
    #endif
Packit 0848f5
    #define MPIU_PW_Sched_yield() sched_yield()
Packit 0848f5
#elif defined(USE_YIELD_FOR_YIELD)
Packit 0848f5
    #ifdef HAVE_SCHED_H
Packit 0848f5
        #include <sched.h>
Packit 0848f5
    #endif
Packit 0848f5
    #define MPIU_PW_Sched_yield() yield()
Packit 0848f5
#elif defined (USE_SELECT_FOR_YIELD)
Packit 0848f5
    #ifdef HAVE_SYS_SELECT_H
Packit 0848f5
        #include <sys/select.h>
Packit 0848f5
    #endif
Packit 0848f5
    #define MPIU_PW_Sched_yield() do { struct timeval t; t.tv_sec = 0; t.tv_usec = 0; select(0,0,0,0,&t); } while (0)
Packit 0848f5
#elif defined (USE_USLEEP_FOR_YIELD)
Packit 0848f5
    #ifdef HAVE_UNISTD_H
Packit 0848f5
        #include <unistd.h>
Packit 0848f5
        #if defined (NEEDS_USLEEP_DECL)
Packit 0848f5
        int usleep(useconds_t usec);
Packit 0848f5
        #endif
Packit 0848f5
    #endif
Packit 0848f5
    #define MPIU_PW_Sched_yield() usleep(0)
Packit 0848f5
#elif defined (USE_SLEEP_FOR_YIELD)
Packit 0848f5
    #ifdef HAVE_UNISTD_H
Packit 0848f5
        #include <unistd.h>
Packit 0848f5
    #endif
Packit 0848f5
    #define MPIU_PW_Sched_yield() sleep(0)
Packit 0848f5
#elif defined (USE_NOTHING_FOR_YIELD)
Packit 0848f5
    #define MPIU_PW_Sched_yield() do {} while (0)
Packit 0848f5
#else
Packit 0848f5
    #error "No mechanism available to yield"
Packit 0848f5
#endif
Packit 0848f5
Packit 0848f5
#endif /* MPIU_PROCESS_WRAPPERS_H_INCLUDED */