Files
HyperDRM/native/retry.h
T

25 lines
1.1 KiB
C

#ifndef HYPERDRM_RETRY_H
#define HYPERDRM_RETRY_H
#include <stdbool.h>
#include <stdint.h>
#include <limits.h>
#define RETRY_DELAY_MS 5000
/* Continuous autostart retries and bounded manual source recovery. */
typedef struct {uint64_t due;unsigned attempts;bool automatic,paused,blocked;} RetryState;
static void retry_reset(RetryState *state){*state=(RetryState){0};}
static void retry_pause(RetryState *state){retry_reset(state);state->paused=true;}
static void retry_update(RetryState *state,bool enabled,bool running,uint64_t now){
bool previous=state->automatic;
state->automatic=enabled && !state->paused && !state->blocked;
if(previous && !state->automatic){state->due=0;state->attempts=0;}
if(state->automatic && !running && !state->due)state->due=now+RETRY_DELAY_MS;
}
static bool retry_take(RetryState *state,uint64_t now){
if(!state->due || now<state->due || state->paused || state->blocked)return false;
state->due=0;if(state->attempts<UINT_MAX)state->attempts++;return true;
}
static void retry_failure(RetryState *state,uint64_t now){
if(!state->paused && !state->blocked && (state->automatic || state->attempts<6))state->due=now+RETRY_DELAY_MS;
}
#endif