1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 #pragma once
3 
4 #include <sched.h>
5 
6 #include "macro.h"
7 #include "missing_syscall.h"
8 
9 /* This wraps the libc interface with a variable to keep the allocated size. */
10 typedef struct CPUSet {
11         cpu_set_t *set;
12         size_t allocated; /* in bytes */
13 } CPUSet;
14 
cpu_set_reset(CPUSet * a)15 static inline void cpu_set_reset(CPUSet *a) {
16         assert((a->allocated > 0) == !!a->set);
17         if (a->set)
18                 CPU_FREE(a->set);
19         *a = (CPUSet) {};
20 }
21 
22 int cpu_set_add_all(CPUSet *a, const CPUSet *b);
23 int cpu_set_add(CPUSet *a, unsigned cpu);
24 
25 char* cpu_set_to_string(const CPUSet *a);
26 char *cpu_set_to_range_string(const CPUSet *a);
27 int cpu_set_realloc(CPUSet *cpu_set, unsigned ncpus);
28 
29 int parse_cpu_set_full(
30                 const char *rvalue,
31                 CPUSet *cpu_set,
32                 bool warn,
33                 const char *unit,
34                 const char *filename, unsigned line,
35                 const char *lvalue);
36 int parse_cpu_set_extend(
37                 const char *rvalue,
38                 CPUSet *old,
39                 bool warn,
40                 const char *unit,
41                 const char *filename,
42                 unsigned line,
43                 const char *lvalue);
44 
parse_cpu_set(const char * rvalue,CPUSet * cpu_set)45 static inline int parse_cpu_set(const char *rvalue, CPUSet *cpu_set){
46         return parse_cpu_set_full(rvalue, cpu_set, false, NULL, NULL, 0, NULL);
47 }
48 
49 int cpu_set_to_dbus(const CPUSet *set, uint8_t **ret, size_t *allocated);
50 int cpu_set_from_dbus(const uint8_t *bits, size_t size, CPUSet *set);
51 
52 int cpus_in_affinity_mask(void);
53