dhcp-timer.c

来自「this is sample about DHCP-agent」· C语言 代码 · 共 197 行

C
197
字号
/* $Header: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-timer.c,v 1.11 2003/06/23 06:05:03 actmodern Exp $ *  * Copyright 2002 Thamer Alharbash <tmh@whitefang.com> *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: *  * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * 3. The names of the authors may not be used to endorse or promote * products derived from this software without specific prior * written permission. *  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * Timer keeper object to keep track of an infinite number of timers. * We can add new timers to it, activate it when we want to, * deactivate it, and remove timers. * * All timers have an unsigned 32-bit integer ID assigned to them. * */#define MODULE_NAME "dhcp-timer"#include "dhcp-local.h"#include "dhcp-libutil.h"/* compare triggers by returning smallest id as highest. */static int compare_triggers_shortest(void *trigger1_p, void *trigger2_p){    timer_trigger_t *trigger1, *trigger2;    trigger1 = trigger1_p;    trigger2 = trigger2_p;    if(trigger1->id < trigger2->id)        return 1;    if(trigger1->id > trigger2->id)        return -1;    return 0;}/* create a new trigger. */static timer_trigger_t *create_trigger(uint32_t trigger_time, uint32_t id){    timer_trigger_t *trigger = xmalloc(sizeof(timer_trigger_t));    trigger->seconds = trigger_time;    trigger->id = id;    trigger->time_set = time(NULL);    return trigger;}/* destroy a trigger. */static void destroy_trigger(timer_trigger_t *trigger){    xfree(trigger);}/* destroy a trigger in a list. */static void destroy_trigger_l(void *trigger){    destroy_trigger(trigger);}/* create a new timer keeper. */timer_keeper_t *create_timer(void){    timer_keeper_t *timer;    timer = xmalloc(sizeof(timer_keeper_t));    timer->triggers = list_create();    return timer;}/* destroy a timer keeper. */void destroy_timer(timer_keeper_t *timer){    list_destroy(timer->triggers, destroy_trigger_l);    xfree(timer);    return;}void reinitialize_timer(timer_keeper_t *timer){    list_destroy(timer->triggers, destroy_trigger_l);    timer->triggers = list_create();}/* add a new trigger. */void timer_add_trigger(timer_keeper_t *timer, uint32_t trigger_time, uint32_t id){    timer_trigger_t *trigger = create_trigger(trigger_time, id);    list_add(timer->triggers, trigger);    timer->triggers = list_sort(timer->triggers, compare_triggers_shortest);    return;}/* utility to grab next valid timer: this will delete ones which have passed since. */static timer_trigger_t *get_next_timer(timer_keeper_t *timer){    uint32_t time_left;    timer_trigger_t *trigger;    uint32_t time_now;  begin:    if(list_get_len(timer->triggers) == 0)        return NULL;    trigger = list_first(timer->triggers);    time_now = time(NULL);    time_left = trigger->seconds - (time_now - trigger->time_set);    if(time_left > trigger->seconds) {        /* overflow. get the next timer. */        list_remove_by_datum(timer->triggers, trigger);        destroy_trigger(trigger);        goto begin;    }    trigger->seconds = time_left;    trigger->time_set = time_now;    return trigger;}/* timer setup next trigger. */int timer_set_next(timer_keeper_t *timer){    timer_trigger_t *trigger;    trigger = get_next_timer(timer);    if(trigger == NULL)        return 1;    set_alarm(trigger->seconds);    timer->current_id = trigger->id;    list_remove_by_datum(timer->triggers, trigger);    destroy_trigger(trigger);    return 0;}uint32_t timer_get_current_id(timer_keeper_t *timer){    return timer->current_id;}uint32_t timer_peek_next_timer(timer_keeper_t *timer){    timer_trigger_t *trigger;    trigger = get_next_timer(timer);    if(trigger == NULL)        return INFINITE_TIME;    return trigger->seconds;}/* make a copy of a timer: achtung this doesn't fiddle with any * timers already set. */timer_keeper_t *timer_copy(timer_keeper_t *timer){    timer_keeper_t *timer_copy;    timer_trigger_t *trigger;    timer_copy = create_timer();    /* now copy over individual triggers by recreating them. */    list_rewind(timer->triggers);    while((trigger = list_next(timer->triggers)) != NULL) {       list_add(timer_copy->triggers, create_trigger(trigger->seconds, trigger->id));    }    timer_copy->triggers = list_sort(timer_copy->triggers, compare_triggers_shortest);    return timer_copy;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?