blob: 48cb16a73e49bf3a0bc721495ab856d12b551919 [file] [log] [blame]
/*
*
* Embedded Linux library
*
* Copyright (C) 2011-2014 Intel Corporation. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <ell/ell.h>
#include <unistd.h>
#include <assert.h>
#include <limits.h>
static void signal_handler(struct l_signal *signal, uint32_t signo,
void *user_data)
{
switch (signo) {
case SIGINT:
case SIGTERM:
l_info("Terminate");
l_main_quit();
break;
}
}
static void timeout_quit_handler(struct l_timeout *timeout, void *user_data)
{
l_main_quit();
}
static void idle_handler(struct l_idle *idle, void *user_data)
{
static int count = 0;
if ((count % 1000000) == 0)
l_info("Idling...");
count += 1;
}
static void oneshot_handler(void *user_data)
{
l_info("One-shot");
}
static void race_delay_handler(struct l_timeout *timeout, void *user_data)
{
l_info("Delay");
usleep(250 * 1000);
}
static void race_handler(struct l_timeout *timeout, void *user_data)
{
struct l_timeout **other_racer = user_data;
l_info("Remove pending event");
l_timeout_remove(*other_racer);
*other_racer = NULL;
}
static void remove_handler(struct l_timeout *timeout, void *user_data)
{
l_timeout_remove(timeout);
l_info("Timer removed itself");
}
int main(int argc, char *argv[])
{
struct l_timeout *timeout_quit;
struct l_timeout *race_delay;
struct l_timeout *race1;
struct l_timeout *race2;
struct l_timeout *remove_self;
struct l_signal *signal;
struct l_idle *idle;
sigset_t mask;
if (!l_main_init())
return -1;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGTERM);
signal = l_signal_create(&mask, signal_handler, NULL, NULL);
timeout_quit = l_timeout_create(3, timeout_quit_handler, NULL, NULL);
race_delay = l_timeout_create(1, race_delay_handler, NULL, NULL);
race1 = l_timeout_create_ms(1100, race_handler, &race2, NULL);
race2 = l_timeout_create_ms(1100, race_handler, &race1, NULL);
remove_self = l_timeout_create(2, remove_handler, &remove_self, NULL);
idle = l_idle_create(idle_handler, NULL, NULL);
l_log_set_stderr();
l_debug_enable("*");
l_debug("hello");
#if (ULONG_MAX > UINT_MAX)
l_debug("Checking timeout time limit");
assert(!l_timeout_create_ms((UINT_MAX + 1UL) * 1000,
timeout_quit_handler, NULL, NULL));
#endif
l_idle_oneshot(oneshot_handler, NULL, NULL);
l_main_run();
l_timeout_remove(race_delay);
l_timeout_remove(race1);
l_timeout_remove(race2);
l_timeout_remove(timeout_quit);
l_signal_remove(signal);
l_idle_remove(idle);
l_main_exit();
return 0;
}