3 |
#include <signal.h> |
#include <signal.h> |
4 |
#include "demux.h" |
#include "demux.h" |
5 |
|
|
6 |
|
typedef struct { |
7 |
|
unsigned long int seconds; |
8 |
|
int pos; |
9 |
|
} timer_data; |
10 |
|
|
11 |
|
timer_id timer[1024]; |
12 |
|
int ntim = 0, gi; |
13 |
|
#define ADD_TIMER(id) if (ntim < 1024) timer[ntim++] = (id) |
14 |
|
#define DEL_TIMER(id) for (gi = 0; gi < ntim; gi++) \ |
15 |
|
if (timer[gi] == id) timer[gi] = NULL; |
16 |
|
|
17 |
void sighandler (int sig) |
void sighandler (int sig) |
18 |
{ |
{ |
19 |
printf ("Signal: %d\n", sig); |
printf ("Signal: %d\n", sig); |
21 |
|
|
22 |
static void cb_timer (void *data) |
static void cb_timer (void *data) |
23 |
{ |
{ |
24 |
printf ("Timer: %lu\n", *(unsigned long int *)data); |
timer_data *datum = (timer_data *)data; |
25 |
free (data); |
printf ("Timer: %lu\n", datum->seconds); |
26 |
|
timer[datum->pos] = NULL; |
27 |
|
free (datum); |
28 |
dmx_remove_signal (SIGUSR2); |
dmx_remove_signal (SIGUSR2); |
29 |
} |
} |
30 |
|
|
31 |
static void cb_periodic (void *data) |
static void cb_periodic (void *data) |
32 |
{ |
{ |
33 |
printf ("Alarm: %lu\n", *(unsigned long int *)data); |
printf ("Alarm: %lu\n", ((timer_data *)data)->seconds); |
34 |
} |
} |
35 |
|
|
36 |
static void cb_input (int fd, void *data) |
static void cb_input (int fd, void *data) |
37 |
{ |
{ |
38 |
unsigned long int seconds; |
unsigned long int seconds; |
39 |
unsigned long int shift; |
unsigned long int shift; |
40 |
unsigned long int *datum; |
timer_data *datum; |
41 |
timer_id id; |
timer_id id; |
42 |
int c, i; |
int c, i; |
43 |
|
|
|
static timer_id timer[1024]; |
|
|
static int ntim = 0; |
|
|
# define ADD_TIMER(id) if (ntim < 1024) timer[ntim++] = (id) |
|
|
|
|
44 |
switch (c = getchar()) { |
switch (c = getchar()) { |
45 |
case 't': |
case 't': |
46 |
scanf ("%lu", &seconds); |
scanf ("%lu", &seconds); |
47 |
datum = malloc (sizeof(unsigned long int)); |
datum = malloc (sizeof(*datum)); |
48 |
*datum = seconds; |
datum->seconds = seconds; |
49 |
|
datum->pos = ntim; |
50 |
id = dmx_add_timer (seconds, cb_timer, datum); |
id = dmx_add_timer (seconds, cb_timer, datum); |
51 |
ADD_TIMER (id); |
ADD_TIMER (id); |
52 |
printf ("Timer added: %08x\n", id); |
printf ("Timer added: %08x\n", id); |
53 |
break; |
break; |
54 |
case 'p': |
case 'p': |
55 |
scanf ("%lu %lu", &seconds, &shift); |
scanf ("%lu %lu", &seconds, &shift); |
56 |
datum = malloc (sizeof(unsigned long int)); |
datum = malloc (sizeof(*datum)); |
57 |
*datum = seconds; |
datum->seconds = seconds; |
58 |
|
datum->pos = ntim; |
59 |
id = dmx_add_periodic_alarm (seconds, shift, |
id = dmx_add_periodic_alarm (seconds, shift, |
60 |
cb_periodic, datum); |
cb_periodic, datum); |
61 |
ADD_TIMER (id); |
ADD_TIMER (id); |
67 |
printf ("Timer/alarm removed: %08x\n", id); |
printf ("Timer/alarm removed: %08x\n", id); |
68 |
if (datum) |
if (datum) |
69 |
free (datum); |
free (datum); |
70 |
for (i = 0; i < ntim; i++) |
DEL_TIMER (id); |
|
if (timer[i] == id) timer[i] = NULL; |
|
71 |
break; |
break; |
72 |
case 'l': |
case 'l': |
73 |
printf ("--\n"); |
printf ("--\n"); |