#ifndef _SYS_CALLOUT_H_
#define _SYS_CALLOUT_H_
#ifndef _SYS_QUEUE_H_
#include <sys/queue.h>
#endif
#ifndef _SYS_LOCK_H_
#include <sys/lock.h>
#endif
#ifndef _SYS_SPINLOCK_H_
#include <sys/spinlock.h>
#endif
#ifndef _SYS_EXISLOCK_H_
#include <sys/exislock.h>
#endif
struct callout;
struct softclock_pcpu;
struct _callout {
struct spinlock spin;
exislock_t exis;
TAILQ_ENTRY(_callout) entry;
struct callout *verifier;
uint32_t flags;
uint32_t lineno;
struct lock *lk;
const char *ident;
struct softclock_pcpu *rsc;
void *rarg;
void (*rfunc)(void *);
int rtick;
uint32_t unused01;
struct softclock_pcpu *qsc;
void *qarg;
void (*qfunc)(void *);
int qtick;
int waiters;
};
struct callout {
struct _callout *toc;
struct lock *lk;
uint32_t flags;
uint32_t unused01;
};
#define callout_set_arg(cc, _arg) do { \
if ((cc)->toc) \
((cc)->toc->qarg = (cc)->toc->rarg = (_arg)); \
} while(0)
#define callout_arg(cc) ((cc)->toc ? (cc)->toc->rarg : NULL)
#define callout_func(cc) ((cc)->toc ? (cc)->toc->rfunc : NULL)
#ifdef _KERNEL
#define CALLOUT_DEBUG
#ifdef CALLOUT_DEBUG
#define CALLOUT_DEBUG_ARGS , const char *ident, int lineno
#define CALLOUT_DEBUG_PASSTHRU , ident, lineno
#else
#define CALLOUT_DEBUG_ARGS
#define CALLOUT_DEBUG_PASSTHRU
#endif
struct globaldata;
extern int ncallout;
int callout_active(struct callout *ext);
int callout_pending(struct callout *ext);
void callout_deactivate(struct callout *ext);
void hardclock_softtick(struct globaldata *);
void _callout_init (struct callout *cc
CALLOUT_DEBUG_ARGS);
void _callout_init_mp (struct callout *cc
CALLOUT_DEBUG_ARGS);
void _callout_init_lk (struct callout *cc, struct lock *lk
CALLOUT_DEBUG_ARGS);
void _callout_setup_quick(struct callout *cc, struct _callout *c,
int ticks, void (*)(void *), void *);
void _callout_cancel_quick(struct _callout *c);
void callout_reset (struct callout *, int,
void (*)(void *), void *);
void callout_reset_bycpu (struct callout *, int,
void (*)(void *), void *,
int);
int callout_stop (struct callout *cc);
int callout_stop_async (struct callout *cc);
void callout_terminate (struct callout *cc);
int callout_cancel (struct callout *cc);
int callout_drain (struct callout *cc);
#ifdef CALLOUT_DEBUG
#define callout_init(co) _callout_init(co, __FILE__, __LINE__)
#define callout_init_mp(co) _callout_init_mp(co, __FILE__, __LINE__)
#define callout_init_lk(co, lk) _callout_init_lk(co, lk, __FILE__, __LINE__)
#else
#define callout_init(co) _callout_init(co)
#define callout_init_mp(co) _callout_init_mp(co)
#define callout_init_lk(co, lk) _callout_init_lk(co, lk)
#endif
#endif
#endif