
#ifndef __SYNC_H_
#define __SYNC_H_

/**
 * @file: sync.h
 *
 * Hlavickovy soubor k souboru syn.c, ktery implementuje rutiny pro
 * blokovani vsech procesoru a dovoluje vykonat urcity kod bud na zadanem,
 * nebo na vsech procesorech. K temto ucelum vyuzival odlozeneho volani
 * procedur (DPC).
 */

// Tato struktura uchovava informace o zablokovanych procesorech. Zaznamenava
// se do ni i prubeh zablokovani a odblokovani, aby se tyto deje daly synchronizovat.
typedef struct _BLOCK_CONTEXT
{
  // Pocet zablokovanych procesoru
  ULONG CPUBlocked;
  // Hodnota 1 znamena, ze vsechny procesory (krom aktualnih) jsou zablokovany.
  ULONG Blocked;
  // IRQL aktualniho procesoru pred zablokovanim. Po zablokovani je bud DISPATCH_LEVEL,
  // (pokud puvodni IRQL bylo nizsi jak DISPATCH_LEVEL) nebo ponechane na stejne vysi.
  KIRQL OldIrql;
  // Dokud je tento clen nataven na 1, procesory (krom aktualniho) jsou blokovany
  ULONG Block;
  // Adresa pole objektu DPC pouzitych na zablokovani procesoru.
  PKDPC Dpc;
} BLOCK_CONTEXT, *PBLOCK_CONTEXT;


// Popis jednotlivych rutin najdete v souboru sync.c v komentarich u
// jejich implementace.

NTSTATUS BlockContextInit(PBLOCK_CONTEXT Context);
VOID BlockContextDestroy(PBLOCK_CONTEXT Context);

VOID BlockProcessors(PBLOCK_CONTEXT Context);
VOID UnblockProcessors(PBLOCK_CONTEXT Context);

VOID ExecuteAtProcessor(IN ULONG Processor, IN PKDEFERRED_ROUTINE Routine, IN PVOID Context, IN PVOID Arg1, IN PVOID Arg2, IN PKDPC Dpc);
NTSTATUS ExecuteAtEveryProcessor(IN PKDEFERRED_ROUTINE Routine, IN PVOID Context, IN PVOID Arg1, IN PVOID Arg2, OUT PVOID *Dpc);

NTSTATUS SyncInit(VOID);
VOID SyncFinit(VOID);


#endif
