/*
 * (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 <osmocore/timer.h>
#include <osmocore/select.h>

#include "../../config.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) {
        bsc_schedule_timer(&timer_one, 3, 0);
        bsc_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");

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

#ifdef HAVE_SYS_SELECT_H
    while (1) {
        bsc_select_main(0);
    }
#else
    printf("Select not supported on this platform!\n");
#endif
}
