netatalk: idle_worker.c File Reference

netatalk 4.5.0
Free and Open Source Apple Filing Protocol (AFP) Server
Loading...
Searching...
No Matches
idle_worker.c File Reference
`#include <errno.h>`
`#include <pthread.h>`
`#include <signal.h>`
`#include <stdatomic.h>`
`#include <string.h>`
`#include <time.h>`
`#include <atalk/logger.h>`
`#include <atalk/queue.h>`
`#include "dircache.h"`
`#include "directory.h"`
`#include "idle_worker.h"`

## Macros
#define | IDLE_WORKER_WAKE_MS 10

## Functions
static int | idle_worker_has_work (void)
| Check if any idle work is pending (work-availability predicate).
static void * | idle_worker_main (void *arg)
| Worker thread main loop.
int | idle_worker_init (void)
void | idle_worker_start (void)
void | idle_worker_stop (void)
void | idle_worker_stop_signal_safe (void)
void | idle_worker_shutdown (void)
int | idle_worker_is_active (void)
void | idle_worker_log_stats (void)

## Variables
static atomic_int | is_idle = 0
static atomic_int | bg_running = 0
static atomic_int | shutdown_flag = 0
static pthread_t | worker_tid
static int | worker_started = 0
struct { |
unsigned int cycles_started |
unsigned int cycles_completed |
unsigned int cycles_interrupted |
} | worker_stat

## Macro Definition Documentation

## ◆ IDLE_WORKER_WAKE_MS

#define IDLE_WORKER_WAKE_MS 10

## Function Documentation

## ◆ idle_worker_has_work()

int idle_worker_has_work | ( | void |  | ) |
| static

Check if any idle work is pending (work-availability predicate).

This function serves two purposes:

1. Idle guard: the is_idle check ensures the worker does not start work when the main thread is NOT in poll(). Also prevents work during the window between idle_worker_stop() and the next idle_worker_start().
2. Work-availability predicate: returns true only if there is actual work to perform. If new work types are added to the idle worker (e.g., FCE event dispatch), their pending-work check MUST be added here — otherwise the worker will sleep through available work.

## ◆ idle_worker_init()

int idle_worker_init | ( | void |  | ) |

## ◆ idle_worker_is_active()

int idle_worker_is_active | ( | void |  | ) |

## ◆ idle_worker_log_stats()

void idle_worker_log_stats | ( | void |  | ) |

## ◆ idle_worker_main()

void * idle_worker_main | ( | void * | arg | ) |
| static

Worker thread main loop.

Uses nanosleep() for 10ms polling which is a direct SYS_nanosleep syscall

## ◆ idle_worker_shutdown()

void idle_worker_shutdown | ( | void |  | ) |

## ◆ idle_worker_start()

void idle_worker_start | ( | void |  | ) |

## ◆ idle_worker_stop()

void idle_worker_stop | ( | void |  | ) |

## ◆ idle_worker_stop_signal_safe()

void idle_worker_stop_signal_safe | ( | void |  | ) |

## Variable Documentation

## ◆ bg_running

atomic_int bg_running = 0
| static

## ◆ cycles_completed

unsigned int cycles_completed

## ◆ cycles_interrupted

unsigned int cycles_interrupted

## ◆ cycles_started

unsigned int cycles_started

## ◆ is_idle

atomic_int is_idle = 0
| static

## ◆ shutdown_flag

atomic_int shutdown_flag = 0
| static

## ◆ worker_started

int worker_started = 0
| static

## ◆ [struct]

struct { ... } worker_stat

## ◆ worker_tid

pthread_t worker_tid
| static