/*
 * avrt definitions
 *
 * Copyright 2009 Maarten Lankhorst
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 *
 */

#ifndef _AVRT_
#define _AVRT_

#ifdef __cplusplus
extern "C" {
#endif

typedef enum _AVRT_PRIORITY
{
    AVRT_PRIORITY_LOW = -1,
    AVRT_PRIORITY_NORMAL,
    AVRT_PRIORITY_HIGH,
    AVRT_PRIORITY_CRITICAL
} AVRT_PRIORITY, *PAVRT_PRIORITY;

/* Windows compiler is more lax */
#define THREAD_ORDER_GROUP_INFINITE_TIMEOUT ((void*)((LONG_PTR)-1))

HANDLE WINAPI AvSetMmThreadCharacteristicsA(LPCSTR TaskName, LPDWORD TaskIndex);
HANDLE WINAPI AvSetMmThreadCharacteristicsW(LPCWSTR TaskName, LPDWORD TaskIndex);
#define AvSetMmThreadCharacteristics WINELIB_NAME_AW(AvSetMmThreadCharacteristics)

HANDLE WINAPI AvSetMmMaxThreadCharacteristicsA(LPCSTR FirstTask, LPCSTR SecondTask, LPDWORD TaskIndex);
HANDLE WINAPI AvSetMmMaxThreadCharacteristicsW(LPCSTR FirstTask, LPCSTR SecondTask, LPDWORD TaskIndex);
#define AvSetMmMaxThreadCharacteristics WINELIB_NAME_AW(AvSetMmMaxThreadCharacteristics)

BOOL WINAPI AvRevertMmThreadCharacteristics(HANDLE AvrtHandle);
BOOL WINAPI AvSetMmThreadPriority(HANDLE AvrtHandle, AVRT_PRIORITY Priority);
BOOL WINAPI AvRtCreateThreadOrderingGroup(
    PHANDLE Context, PLARGE_INTEGER Period,
    GUID *ThreadOrderingGuid, PLARGE_INTEGER Timeout);

BOOL WINAPI AvRtCreateThreadOrderingGroupExA(
    PHANDLE Context, PLARGE_INTEGER Period,
    GUID *ThreadOrderingGuid, PLARGE_INTEGER Timeout,
    LPCSTR TaskName);
BOOL WINAPI AvRtCreateThreadOrderingGroupExW(
    PHANDLE Context, PLARGE_INTEGER Period,
    GUID *ThreadOrderingGuid, PLARGE_INTEGER Timeout,
    LPCSTR TaskName);
#define AvRtCreateThreadOrderingGroupEx WINELIB_NAME_AW(AvRtCreateThreadOrderingGroupEx)

BOOL WINAPI AvRtJoinThreadOrderingGroup(PHANDLE Context, GUID *ThreadOrderingGuid, BOOL Before);
BOOL WINAPI AvRtWaitOnThreadOrderingGroup(HANDLE Context);
BOOL WINAPI AvRtLeaveThreadOrderingGroup(HANDLE Context);
BOOL WINAPI AvRtDeleteThreadOrderingGroup(HANDLE Context);
BOOL WINAPI AvQuerySystemResponsiveness(HANDLE AvrtHandle, PULONG SystemResponsivenessValue);

#ifdef __cplusplus
}
#endif

#endif /*_AVRT_*/
