]> rtime.felk.cvut.cz Git - frescor/fwp.git/blob - wme_test/common.c
Merge branch 'master' of rtime.felk.cvut.cz:frescor/fwp
[frescor/fwp.git] / wme_test / common.c
1 #include "common.h"
2 #include <sched.h>
3 #include <signal.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <error.h>
7 #include <errno.h>
8
9 const int prio_to_ac[8] = {2,3,3,2,1,1,0,0};
10 const unsigned int ac_to_tos[4] = {224,160,96,64};
11 const char *ac_to_text[4] = {[AC_VO] = "AC_VO", [AC_VI] = "AC_VI", [AC_BE] = "AC_BE", [AC_BK] = "AC_BK", };
12
13 void set_rt_prio(int priority)
14 {
15         int maxpri, minpri;
16         static struct sched_param param;
17
18         if ((maxpri = sched_get_priority_max(SCHED_FIFO)) == -1)        {
19                 error(8, errno, "sched_get_priority_max fails");
20         }
21
22         if ((minpri = sched_get_priority_min(SCHED_FIFO)) == -1)        {
23                 error(10, errno, "sched_get_priority_min fails");
24         }
25
26         if (priority > maxpri)  {
27                 error(9, 0, "maximum priority allowed is %d.\n", maxpri);
28         }
29         if (priority < minpri)  {
30                 error(11, 0, "minimum priority allowed is %d.\n", minpri);
31         }
32
33         param.sched_priority = priority;
34
35         if (sched_setscheduler(0, SCHED_FIFO, &param) == -1)    {
36                 error(0, errno, "sched_setscheduler fails");
37 #ifndef WITH_FWP
38                 exit(13);
39 #endif
40         }
41 }
42
43 void block_signals(void)
44 {
45         sigset_t sigset;
46         int ret;
47         sigemptyset(&sigset);
48         sigaddset(&sigset, SIGINT);
49         sigaddset(&sigset, SIGTERM);
50         ret = pthread_sigmask(SIG_BLOCK, &sigset, NULL);
51         if (ret != 0) {
52                 perror("pthread_sigmask failed");
53                 exit(1);
54         }
55 }
56
57 static char *num_with_unit(char *buf, unsigned num, const char *units[])
58 {
59         const int div[] = {100,10,1};
60         unsigned order = 0;
61         int d;
62
63         while (num > 999 && units[(order+3)/3] != NULL) {
64                 num /= 10;
65                 order++;
66         }
67
68         d = div[(order+2)%3];
69         if (d == 1)
70                 sprintf(buf, "%4d %s", num, units[(order+2)/3]);
71         else
72                 sprintf(buf, "%d.%.*d %s", num/d, (d==10) ? 1 : 2, num%d, units[(order+2)/3]);
73         return buf;
74 }
75
76 char *bandwidth_to_text(char *buf, unsigned bandwidth_bps)
77 {
78         const char *unit[] = {"bps", "kbps", "Mbps", NULL};
79         return num_with_unit(buf, bandwidth_bps, unit);
80 }
81
82 char *usec_to_text(char *buf, unsigned usec)
83 {
84         const char *unit[] = {"us", "ms", "s", NULL};
85         return num_with_unit(buf, usec, unit);
86 }
87
88
89 static void test_usec_to_text() __attribute__((unused));
90 static void test_usec_to_text()
91 {
92         int num=0;
93         char buf[1000];
94         int i;
95         for (i=1; i<11; i++) {
96                 num = num*10 + i;
97                 printf("%s = %d\n", usec_to_text(buf, num), num);
98         }
99 }
100