lib/events.c

ソースコードを見る。

データ構造

struct  timed_event
struct  fd_event
struct  event_context

関数

static int timed_event_destructor (struct timed_event *te)
static void add_event_by_time (struct timed_event *te)
timed_eventevent_add_timed (struct event_context *event_ctx, TALLOC_CTX *mem_ctx, struct timeval when, const char *event_name, void(*handler)(struct event_context *event_ctx, struct timed_event *te, const struct timeval *now, void *private_data), void *private_data)
static int fd_event_destructor (struct fd_event *fde)
fd_eventevent_add_fd (struct event_context *event_ctx, TALLOC_CTX *mem_ctx, int fd, uint16_t flags, void(*handler)(struct event_context *event_ctx, struct fd_event *event, uint16 flags, void *private_data), void *private_data)
void event_fd_set_writeable (struct fd_event *fde)
void event_fd_set_not_writeable (struct fd_event *fde)
void event_fd_set_readable (struct fd_event *fde)
void event_fd_set_not_readable (struct fd_event *fde)
void event_add_to_select_args (struct event_context *event_ctx, const struct timeval *now, fd_set *read_fds, fd_set *write_fds, struct timeval *timeout, int *maxfd)
BOOL run_events (struct event_context *event_ctx, int selrtn, fd_set *read_fds, fd_set *write_fds)
timeval * get_timed_events_timeout (struct event_context *event_ctx, struct timeval *to_ret)
event_contextevent_context_init (TALLOC_CTX *mem_ctx)
int set_event_dispatch_time (struct event_context *event_ctx, const char *event_name, struct timeval when)
int cancel_named_event (struct event_context *event_ctx, const char *event_name)


関数

static int timed_event_destructor ( struct timed_event te  )  [static]

events.c63 行で定義されています。

参照先 timed_event::event_name.

参照元 event_add_timed().

00064 {
00065         DEBUG(10, ("Destroying timed event %lx \"%s\"\n", (unsigned long)te,
00066                 te->event_name));
00067         DLIST_REMOVE(te->event_ctx->timed_events, te);
00068         return 0;
00069 }

static void add_event_by_time ( struct timed_event te  )  [static]

events.c75 行で定義されています。

参照先 ctxtimed_event::event_ctxtimed_event::nexttimeval_compare()timeval_is_zero()timed_event::when.

参照元 event_add_timed()set_event_dispatch_time().

00076 {
00077         struct event_context *ctx = te->event_ctx;
00078         struct timed_event *last_te, *cur_te;
00079 
00080         /* Keep the list ordered by time. We must preserve this. */
00081         last_te = NULL;
00082         for (cur_te = ctx->timed_events; cur_te; cur_te = cur_te->next) {
00083                 /* if the new event comes before the current one break */
00084                 if (!timeval_is_zero(&cur_te->when) &&
00085                                 timeval_compare(&te->when, &cur_te->when) < 0) {
00086                         break;
00087                 }
00088                 last_te = cur_te;
00089         }
00090 
00091         DLIST_ADD_AFTER(ctx->timed_events, te, last_te);
00092 }

struct timed_event* event_add_timed ( struct event_context event_ctx,
TALLOC_CTX mem_ctx,
struct timeval  when,
const char *  event_name,
void(*)(struct event_context *event_ctx, struct timed_event *te, const struct timeval *now, void *private_data)  handler,
void *  private_data 
)

events.c100 行で定義されています。

参照先 add_event_by_time()timed_event::event_ctxtimed_event::event_nametimed_event::handlertimed_event::private_datatimed_event_destructor()timed_event::when.

参照元 account_lockout_policy_handler()add_ccache_to_list()add_idle_event()add_oplock_timeout_handler()async_request_sent()idle_event_handler()krb5_ticket_gain_handler()krb5_ticket_refresh_handler()set_domain_offline()set_domain_online_request().

00109 {
00110         struct timed_event *te;
00111 
00112         te = TALLOC_P(mem_ctx, struct timed_event);
00113         if (te == NULL) {
00114                 DEBUG(0, ("talloc failed\n"));
00115                 return NULL;
00116         }
00117 
00118         te->event_ctx = event_ctx;
00119         te->when = when;
00120         te->event_name = event_name;
00121         te->handler = handler;
00122         te->private_data = private_data;
00123 
00124         add_event_by_time(te);
00125 
00126         talloc_set_destructor(te, timed_event_destructor);
00127 
00128         DEBUG(10, ("Added timed event \"%s\": %lx\n", event_name,
00129                         (unsigned long)te));
00130         return te;
00131 }

static int fd_event_destructor ( struct fd_event fde  )  [static]

events.c133 行で定義されています。

参照先 fd_event::event_ctxevent_context::fd_events.

参照元 event_add_fd().

00134 {
00135         struct event_context *event_ctx = fde->event_ctx;
00136 
00137         DLIST_REMOVE(event_ctx->fd_events, fde);
00138         return 0;
00139 }

struct fd_event* event_add_fd ( struct event_context event_ctx,
TALLOC_CTX mem_ctx,
int  fd,
uint16_t  flags,
void(*)(struct event_context *event_ctx, struct fd_event *event, uint16 flags, void *private_data)  handler,
void *  private_data 
)

events.c141 行で定義されています。

参照先 fd_event::event_ctxfd_event::fdfd_event_destructor()fd_event::flagsfd_event::handlerfd_event::private_data.

参照元 fam_open_connection()inotify_setup().

00149 {
00150         struct fd_event *fde;
00151 
00152         if (!(fde = TALLOC_P(mem_ctx, struct fd_event))) {
00153                 return NULL;
00154         }
00155 
00156         fde->event_ctx = event_ctx;
00157         fde->fd = fd;
00158         fde->flags = flags;
00159         fde->handler = handler;
00160         fde->private_data = private_data;
00161 
00162         DLIST_ADD(event_ctx->fd_events, fde);
00163 
00164         talloc_set_destructor(fde, fd_event_destructor);
00165         return fde;
00166 }

void event_fd_set_writeable ( struct fd_event fde  ) 

events.c168 行で定義されています。

参照先 fd_event::flags.

00169 {
00170         fde->flags |= EVENT_FD_WRITE;
00171 }

void event_fd_set_not_writeable ( struct fd_event fde  ) 

events.c173 行で定義されています。

参照先 fd_event::flags.

00174 {
00175         fde->flags &= ~EVENT_FD_WRITE;
00176 }

void event_fd_set_readable ( struct fd_event fde  ) 

events.c178 行で定義されています。

参照先 fd_event::flags.

00179 {
00180         fde->flags |= EVENT_FD_READ;
00181 }

void event_fd_set_not_readable ( struct fd_event fde  ) 

events.c183 行で定義されています。

参照先 fd_event::flags.

00184 {
00185         fde->flags &= ~EVENT_FD_READ;
00186 }

void event_add_to_select_args ( struct event_context event_ctx,
const struct timeval *  now,
fd_set *  read_fds,
fd_set *  write_fds,
struct timeval *  timeout,
int *  maxfd 
)

events.c188 行で定義されています。

参照先 fd_event::fdevent_context::fd_eventsfd_event::flagsfd_event::nextevent_context::timed_eventstimeval_min()timeval_until()timed_event::when.

参照元 receive_message_or_smb().

00192 {
00193         struct fd_event *fde;
00194         struct timeval diff;
00195 
00196         for (fde = event_ctx->fd_events; fde; fde = fde->next) {
00197                 if (fde->flags & EVENT_FD_READ) {
00198                         FD_SET(fde->fd, read_fds);
00199                 }
00200                 if (fde->flags & EVENT_FD_WRITE) {
00201                         FD_SET(fde->fd, write_fds);
00202                 }
00203 
00204                 if ((fde->flags & (EVENT_FD_READ|EVENT_FD_WRITE))
00205                     && (fde->fd > *maxfd)) {
00206                         *maxfd = fde->fd;
00207                 }
00208         }
00209 
00210         if (event_ctx->timed_events == NULL) {
00211                 return;
00212         }
00213 
00214         diff = timeval_until(now, &event_ctx->timed_events->when);
00215         *timeout = timeval_min(timeout, &diff);
00216 }

BOOL run_events ( struct event_context event_ctx,
int  selrtn,
fd_set *  read_fds,
fd_set *  write_fds 
)

events.c218 行で定義されています。

参照先 fd_event::event_ctxtimed_event::event_namefd_event::fdevent_context::fd_eventsGetTimeOfDay()fd_event::handlertimed_event::handlerfd_event::nextfd_event::private_datatimed_event::private_dataevent_context::timed_eventstimeval_compare()timed_event::when.

参照元 process_loop()receive_message_or_smb()smbd_process().

00220 {
00221         BOOL fired = False;
00222         struct fd_event *fde, *next;
00223 
00224         /* Run all events that are pending, not just one (as we
00225            did previously. */
00226 
00227         while (event_ctx->timed_events) {
00228                 struct timeval now;
00229                 GetTimeOfDay(&now);
00230 
00231                 if (timeval_compare(
00232                             &now, &event_ctx->timed_events->when) < 0) {
00233                         /* Nothing to do yet */
00234                         DEBUG(11, ("run_events: Nothing to do\n"));
00235                         break;
00236                 }
00237 
00238                 DEBUG(10, ("Running event \"%s\" %lx\n",
00239                            event_ctx->timed_events->event_name,
00240                            (unsigned long)event_ctx->timed_events));
00241 
00242                 event_ctx->timed_events->handler(
00243                         event_ctx,
00244                         event_ctx->timed_events, &now,
00245                         event_ctx->timed_events->private_data);
00246 
00247                 fired = True;
00248         }
00249 
00250         if (fired) {
00251                 /*
00252                  * We might have changed the socket status during the timed
00253                  * events, return to run select again.
00254                  */
00255                 return True;
00256         }
00257 
00258         if (selrtn == 0) {
00259                 /*
00260                  * No fd ready
00261                  */
00262                 return fired;
00263         }
00264 
00265         for (fde = event_ctx->fd_events; fde; fde = next) {
00266                 uint16 flags = 0;
00267 
00268                 next = fde->next;
00269                 if (FD_ISSET(fde->fd, read_fds)) flags |= EVENT_FD_READ;
00270                 if (FD_ISSET(fde->fd, write_fds)) flags |= EVENT_FD_WRITE;
00271 
00272                 if (flags) {
00273                         fde->handler(event_ctx, fde, flags, fde->private_data);
00274                         fired = True;
00275                 }
00276         }
00277 
00278         return fired;
00279 }

struct timeval* get_timed_events_timeout ( struct event_context event_ctx,
struct timeval *  to_ret 
)

events.c282 行で定義されています。

参照先 event_context::timed_eventstimeval_current()timeval_until()timed_event::when.

参照元 process_loop().

00284 {
00285         struct timeval now;
00286 
00287         if (event_ctx->timed_events == NULL) {
00288                 return NULL;
00289         }
00290 
00291         now = timeval_current();
00292         *to_ret = timeval_until(&now, &event_ctx->timed_events->when);
00293 
00294         DEBUG(10, ("timed_events_timeout: %d/%d\n", (int)to_ret->tv_sec,
00295                 (int)to_ret->tv_usec));
00296 
00297         return to_ret;
00298 }

struct event_context* event_context_init ( TALLOC_CTX mem_ctx  ) 

events.c300 行で定義されています。

参照元 smbd_event_context()winbind_event_context().

00301 {
00302         return TALLOC_ZERO_P(NULL, struct event_context);
00303 }

int set_event_dispatch_time ( struct event_context event_ctx,
const char *  event_name,
struct timeval  when 
)

events.c305 行で定義されています。

参照先 add_event_by_time()timed_event::event_ctxtimed_event::event_nametimed_event::nextevent_context::timed_eventstimed_event::when.

参照元 set_domain_online()set_domain_online_request().

00307 {
00308         struct timed_event *te;
00309 
00310         for (te = event_ctx->timed_events; te; te = te->next) {
00311                 if (strcmp(event_name, te->event_name) == 0) {
00312                         DLIST_REMOVE(event_ctx->timed_events, te);
00313                         te->when = when;
00314                         add_event_by_time(te);
00315                         return 1;
00316                 }
00317         }
00318         return 0;
00319 }

int cancel_named_event ( struct event_context event_ctx,
const char *  event_name 
)

events.c323 行で定義されています。

参照先 timed_event::event_ctxtimed_event::event_nametimed_event::nextevent_context::timed_events.

00325 {
00326         struct timed_event *te;
00327 
00328         for (te = event_ctx->timed_events; te; te = te->next) {
00329                 if (strcmp(event_name, te->event_name) == 0) {
00330                         TALLOC_FREE(te);
00331                         return 1;
00332                 }
00333         }
00334         return 0;
00335 }


Sambaに対してSat Aug 29 21:23:36 2009に生成されました。  doxygen 1.4.7