|
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 */
|