]> rtime.felk.cvut.cz Git - frescor/fwp.git/blob - wme_test/common.c
Fixes and additions to more_sta scripts.
[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
7 const int prio_to_ac[8] = {2,3,3,2,1,1,0,0};
8 const unsigned int ac_to_tos[4] = {224,160,96,64};
9 const char *ac_to_text[4] = {[AC_VO] = "AC_VO", [AC_VI] = "AC_VI", [AC_BE] = "AC_BE", [AC_BK] = "AC_BK", };
10
11 void set_rt_prio(int priority)
12 {
13         int maxpri, minpri;
14         static struct sched_param param;
15
16         if ((maxpri = sched_get_priority_max(SCHED_FIFO)) == -1)        {
17                 perror("sched_get_priority_max fails");
18                 exit(8);
19         }
20
21         if ((minpri = sched_get_priority_min(SCHED_FIFO)) == -1)        {
22                 perror("sched_get_priority_min fails");
23                 exit(10);
24         }
25
26         if (priority > maxpri)  {
27                 fprintf(stderr,"maximum priority allowed is %d.\n", maxpri);
28                 exit(9);
29         }
30         if (priority < minpri)  {
31                 fprintf(stderr,"minimum priority allowed is %d.\n", minpri);
32                 exit(11);
33         }
34
35         param.sched_priority = priority;
36
37         if (sched_setscheduler(0, SCHED_FIFO, &param) == -1)    {
38                 perror("sched_setscheduler fails");
39                 exit(13);
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