/*++

Copyright (c) 1990  Microsoft Corporation

Module Name:

    idlrpc.idl

Abstract:

    Contains the RPC interface specification for the idle task / idle detection APIs.
    Also contains the RPC specific data structures for these API.

Author:

    Cenk Ergan (cenke)  07-August-2000

Environment:

    User Mode - Win32 - MIDL

Revision History:

--*/

//
// Interface Attributes
//

[
    uuid(0a74ef1c-41a4-4e06-83ae-dc74fb1cdd53),
    version(1.0)
]

//
// Interface Keyword
//

interface idletask

//
// Interface Body
//

{
import "wtypes.idl";

//
// IT_IDLE_TASK_ID declaration.
//

#define MIDL_PASS
#include <idletask.h>

//
// The prefered protocol sequence for connecting the server and the
// client is LPC because of its low overhead. We'd like to bind to
// dynamic endpoint, because a well known endpoint may require another
// listener thread on the server side. Note that depending on the
// other RPC servers in the process we end up in, other bindings may
// also be used.
//

const WCHAR * IT_RPC_PROTSEQ          = L"ncalrpc";

//
// This is the custom binding handle type. Specifying this allows us
// to bind to the server when the interface functions are called via
// the IT_RPC_bind and _unbind functions that are part of the client.
// It is not used for any other purpose, although it has to be a
// parameter to the interface functions.
//

typedef [handle] WCHAR * ITRPC_HANDLE;

//
// This is a custom context handle. This allows the server to get
// notified when a client dies.
//

typedef [context_handle] VOID *IT_HANDLE;

//
// Status of an idle task.
//

typedef enum _IT_IDLE_TASK_STATUS {
    ItIdleTaskInitializing,
    ItIdleTaskQueued,
    ItIdleTaskRunning,
    ItIdleTaskMaxStatus
} IT_IDLE_TASK_STATUS, *PIT_IDLE_TASK_STATUS;

//
// This structure describes the idle task the client wants to register.
//

typedef struct _IT_IDLE_TASK_PROPERTIES {

    //
    // Size of the structure.
    //

    ULONG Size;
    
    //
    // Idle task identifier and which process it is in. These two
    // uniquely identify the idle task.
    //

    IT_IDLE_TASK_ID IdleTaskId;
    DWORD ProcessId;

    //
    // Local handle for the event to be notified when the task should
    // start running.
    //
    
    ULONG_PTR StartEventHandle;
    
    //
    // Local handle for the event to be notified when the task should
    // stop running.
    //
    
    ULONG_PTR StopEventHandle;

} IT_IDLE_TASK_PROPERTIES, *PIT_IDLE_TASK_PROPERTIES;

//
// This structure contains parameters that control the behaviour of
// idle detection.
//

typedef struct _IT_IDLE_DETECTION_PARAMETERS {

    //
    // This is how long in ms we will wait until each time we check
    // for system idleness.
    //

    ULONG IdleDetectionPeriod;

    //
    // After we detect that system was idle over a long period, we
    // will verify the system is still idle by checking idleness over
    // a smaller period. This way we won't miss recent activity that
    // seemed insignificant over a long IdleDetectionPeriod.
    //

    ULONG IdleVerificationPeriod;
    ULONG NumVerifications;

    //
    // We will be polling for user input when running idle tasks every
    // this many ms. We want to catch user input and notify the idle task
    // to stop running as soon as possible. Even though the system is
    // idle, we don't want to create too much overhead which may mislead
    // ourself.
    //

    ULONG IdleInputCheckPeriod;

    //
    // We check to see if the idle task we asked to run is really running
    // (i.e. it is using the disk and CPU) every this many ms. This is our
    // mechanism for cleaning up after unregistered/orphaned tasks. This
    // should be greater than IdleInputCheckPeriod.
    //

    ULONG IdleTaskRunningCheckPeriod;

    //
    // If the CPU is not idle more than this percent over a time interval,
    // the system is not considered idle.
    //

    ULONG MinCpuIdlePercentage;

    //
    // If a disk is not idle more than this percent over a time interval,
    // the system is not considered idle.
    //
    
    ULONG MinDiskIdlePercentage;

    //
    // This is the maximum number of registered idle tasks at one time.
    //

    ULONG MaxNumRegisteredTasks;

} IT_IDLE_DETECTION_PARAMETERS, *PIT_IDLE_DETECTION_PARAMETERS;

//
// Idle task server registration/unregistration API. These are not
// called from the user directly. They are called by the client side
// implementation of the RegisterIdleTask/UnregisterIdleTask API.
//

DWORD
ItSrvRegisterIdleTask (
    [in,string,unique] ITRPC_HANDLE Reserved,
    [out,ref] IT_HANDLE *ItHandle,
    [in,ref] PIT_IDLE_TASK_PROPERTIES IdleTaskProperties
    );

void
ItSrvUnregisterIdleTask (
    [in,string,unique] ITRPC_HANDLE Reserved,
    [in,out,ref] IT_HANDLE *ItHandle
    );

//
// This function is called to process all registered tasks without
// waiting for system to become idle.
//

DWORD
ItSrvProcessIdleTasks (
    [in,string,unique] ITRPC_HANDLE Reserved
    );

//
// This function is implemented only in the debug builds so test
// applications can set stress parameters. It returns
// ERROR_NOT_IMPLEMENTED on free builds.
//

DWORD
ItSrvSetDetectionParameters (
    [in,string,unique] ITRPC_HANDLE Reserved,
    [in,ref] PIT_IDLE_DETECTION_PARAMETERS Parameters
    );

}
