/*
 * (C) 2008 by Holger Hans Peter Freyther <zecke@selfish.org>
 * All Rights Reserved
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 */

#include <stdio.h>

#include <openbsc/timer.h>
#include <openbsc/select.h>

static void timer_fired(unsigned long data);

static struct timer_list timer_one = {
    .cb = timer_fired,
    .data = (void*)1,
};

static struct timer_list timer_two = {
    .cb = timer_fired,
    .data = (void*)2,
};

static struct timer_list timer_three = {
    .cb = timer_fired,
    .data = (void*)3,
};

static void timer_fired(unsigned long data)
{
    printf("Fired timer: %lu\n", data);

    if (data == 1) {
        schedule_timer(&timer_one, 3, 0);
        del_timer(&timer_two);
    } else if (data == 2) {
        printf("Should not be fired... bug in del_timer\n");
    } else if (data == 3) {
        printf("Timer fired not registering again\n");
    } else  {
        printf("wtf... wrong data\n");
    }
}

int main(int argc, char** argv)
{
    printf("Starting... timer\n");

    schedule_timer(&timer_one, 3, 0);
    schedule_timer(&timer_two, 5, 0);
    schedule_timer(&timer_three, 4, 0);

    while (1) {
        bsc_select_main();
    }
}
