Dynamic Load Balance 3.6.1+32-59d1
queues.h
Go to the documentation of this file.
1/*********************************************************************************/
2/* Copyright 2009-2023 Barcelona Supercomputing Center */
3/* */
4/* This file is part of the DLB library. */
5/* */
6/* DLB is free software: you can redistribute it and/or modify */
7/* it under the terms of the GNU Lesser General Public License as published by */
8/* the Free Software Foundation, either version 3 of the License, or */
9/* (at your option) any later version. */
10/* */
11/* DLB is distributed in the hope that it will be useful, */
12/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
13/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
14/* GNU Lesser General Public License for more details. */
15/* */
16/* You should have received a copy of the GNU Lesser General Public License */
17/* along with DLB. If not, see <https://www.gnu.org/licenses/>. */
18/*********************************************************************************/
19
20#ifndef QUEUES_H
21#define QUEUES_H
22
23#include <sched.h>
24#include <unistd.h>
25#include <stdbool.h>
26
27
28/*** queue_lewi_reqs_t ***********************************************************/
29/* queue_lewi_reqs_t is a packed set of pairs (<pid>,howmany), where <pid> is
30 * unique key; 'head' points to the next empty position and is always strictly
31 * less than QUEUE_LEWI_REQS_SIZE */
32
33enum { QUEUE_LEWI_REQS_SIZE = 256 };
34
35typedef struct {
36 pid_t pid;
37 unsigned int howmany;
39
40typedef struct {
42 unsigned int head;
44
46unsigned int queue_lewi_reqs_size(const queue_lewi_reqs_t *queue);
47unsigned int queue_lewi_reqs_remove(queue_lewi_reqs_t *queue, pid_t pid);
48int queue_lewi_reqs_push(queue_lewi_reqs_t *queue, pid_t pid,
49 unsigned int howmany);
50unsigned int queue_lewi_reqs_pop_ncpus(queue_lewi_reqs_t *queue, unsigned int ncpus,
51 lewi_request_t *requests, unsigned int *nreqs, unsigned int maxreqs);
52unsigned int queue_lewi_reqs_get(queue_lewi_reqs_t *queue, pid_t pid);
53
54
55/*** queue_proc_reqs_t ***********************************************************/
56enum { QUEUE_PROC_REQS_SIZE = 4096 };
57
58typedef struct {
59 pid_t pid;
60 unsigned int howmany;
61 cpu_set_t allowed;
63
64typedef struct {
66 unsigned int head;
67 unsigned int tail;
69
71unsigned int queue_proc_reqs_size(const queue_proc_reqs_t *queue);
74void queue_proc_reqs_remove(queue_proc_reqs_t *queue, pid_t pid);
75int queue_proc_reqs_push(queue_proc_reqs_t *queue, pid_t pid,
76 unsigned int howmany, const cpu_set_t *allowed);
78void queue_proc_reqs_get(queue_proc_reqs_t *queue, pid_t *pid, int cpuid);
79
80
81/*** queue_pids_t ****************************************************************/
82enum { QUEUE_PIDS_SIZE = 8 };
83
84typedef struct {
85 pid_t queue[QUEUE_PIDS_SIZE];
86 unsigned int head;
87 unsigned int tail;
89
90void queue_pids_init(queue_pids_t *queue);
91unsigned int queue_pids_size(const queue_pids_t *queue);
92void queue_pids_remove(queue_pids_t *queue, pid_t pid);
93int queue_pids_push(queue_pids_t *queue, pid_t pid);
94void queue_pids_pop(queue_pids_t *queue, pid_t *pid);
95
96/*** queue_t *********************************************************************/
97
98typedef enum queue_allocator_e {
103
104typedef struct queue_t queue_t;
105
120queue_t* queue__init(size_t element_size, unsigned int capacity, void *ptr, queue_allocator_t allocator);
121
128
134unsigned int queue__get_size(const queue_t *queue);
135
141unsigned int queue__get_capacity(const queue_t *queue);
142
146bool queue__is_empty(const queue_t *queue);
147
158
167int queue__take_head(queue_t *queue, void *value);
168
177int queue__take_tail(queue_t *queue, void *value);
178
187int queue__peek_head(queue_t *queue, void **value_ptr);
188
197int queue__peek_tail(queue_t *queue, void **value_ptr);
198
208void * queue__push_head(queue_t *queue, const void * new);
209
219void * queue__push_tail(queue_t *queue, const void * new);
220
221/*** queue_t iterators ***********************************************************/
222
232void queue_iter__foreach(void *iter, void (*fn)(void*, void*), void* args);
233
242void* queue_iter__get_nth(void *iter, unsigned int n);
243
245 void* (*next)(void*);
247 bool done;
248 unsigned int curr;
249 unsigned int tail;
251
258
259#endif /* QUEUES_H */
void queue_proc_reqs_remove(queue_proc_reqs_t *queue, pid_t pid)
Definition: queues.c:208
queue_allocator_t
Definition: queues.h:98
@ QUEUE_ALLOC_OVERWRITE
Definition: queues.h:100
@ QUEUE_ALLOC_REALLOC
Definition: queues.h:101
@ QUEUE_ALLOC_FIXED
Definition: queues.h:99
unsigned int queue_pids_size(const queue_pids_t *queue)
Definition: queues.c:318
void * queue__push_tail(queue_t *queue, const void *new)
Definition: queues.c:570
void queue_lewi_reqs_init(queue_lewi_reqs_t *queue)
Definition: queues.c:35
@ QUEUE_PROC_REQS_SIZE
Definition: queues.h:56
void queue_proc_reqs_pop(queue_proc_reqs_t *queue, process_request_t *request)
Definition: queues.c:259
void queue_iter__foreach(void *iter, void(*fn)(void *, void *), void *args)
Definition: queues.c:594
void queue_pids_pop(queue_pids_t *queue, pid_t *pid)
Definition: queues.c:348
@ QUEUE_LEWI_REQS_SIZE
Definition: queues.h:33
unsigned int queue_lewi_reqs_pop_ncpus(queue_lewi_reqs_t *queue, unsigned int ncpus, lewi_request_t *requests, unsigned int *nreqs, unsigned int maxreqs)
Definition: queues.c:126
int queue__take_tail(queue_t *queue, void *value)
Definition: queues.c:448
process_request_t * queue_proc_reqs_front(queue_proc_reqs_t *queue)
Definition: queues.c:199
unsigned int queue_lewi_reqs_size(const queue_lewi_reqs_t *queue)
Definition: queues.c:39
unsigned int queue_proc_reqs_size(const queue_proc_reqs_t *queue)
Definition: queues.c:193
@ QUEUE_PIDS_SIZE
Definition: queues.h:82
unsigned int queue__get_capacity(const queue_t *queue)
Definition: queues.c:412
void queue_proc_reqs_get(queue_proc_reqs_t *queue, pid_t *pid, int cpuid)
Definition: queues.c:278
void queue__destroy(queue_t *queue)
Definition: queues.c:401
unsigned int queue_lewi_reqs_get(queue_lewi_reqs_t *queue, pid_t pid)
Definition: queues.c:173
void queue_pids_init(queue_pids_t *queue)
Definition: queues.c:314
int queue_lewi_reqs_push(queue_lewi_reqs_t *queue, pid_t pid, unsigned int howmany)
Definition: queues.c:71
int queue__peek_tail(queue_t *queue, void **value_ptr)
Definition: queues.c:484
unsigned int queue_lewi_reqs_remove(queue_lewi_reqs_t *queue, pid_t pid)
Definition: queues.c:44
void * queue_iter__get_nth(void *iter, unsigned int n)
Definition: queues.c:602
int queue_proc_reqs_push(queue_proc_reqs_t *queue, pid_t pid, unsigned int howmany, const cpu_set_t *allowed)
Definition: queues.c:225
int queue__take_head(queue_t *queue, void *value)
Definition: queues.c:428
void queue_pids_remove(queue_pids_t *queue, pid_t pid)
Definition: queues.c:324
int queue_pids_push(queue_pids_t *queue, pid_t pid)
Definition: queues.c:338
queue_iter_head2tail_t queue__into_head2tail_iter(queue_t *queue)
Definition: queues.c:639
void * queue__push_head(queue_t *queue, const void *new)
Definition: queues.c:550
unsigned int queue__get_size(const queue_t *queue)
Definition: queues.c:408
queue_t * queue__init(size_t element_size, unsigned int capacity, void *ptr, queue_allocator_t allocator)
Definition: queues.c:375
process_request_t * queue_proc_reqs_back(queue_proc_reqs_t *queue)
Definition: queues.c:203
void queue_proc_reqs_init(queue_proc_reqs_t *queue)
Definition: queues.c:189
int queue__peek_head(queue_t *queue, void **value_ptr)
Definition: queues.c:468
bool queue__is_at_capacity(const queue_t *queue)
Definition: queues.c:420
bool queue__is_empty(const queue_t *queue)
Definition: queues.c:416
Definition: queues.h:35
unsigned int howmany
Definition: queues.h:37
pid_t pid
Definition: queues.h:36
Definition: queues.h:58
cpu_set_t allowed
Definition: queues.h:61
unsigned int howmany
Definition: queues.h:60
pid_t pid
Definition: queues.h:59
Definition: queues.h:244
bool done
Definition: queues.h:247
unsigned int curr
Definition: queues.h:248
queue_t * queue
Definition: queues.h:246
unsigned int tail
Definition: queues.h:249
Definition: queues.h:40
unsigned int head
Definition: queues.h:42
Definition: queues.h:84
unsigned int head
Definition: queues.h:86
unsigned int tail
Definition: queues.h:87
Definition: queues.h:64
unsigned int head
Definition: queues.h:66
unsigned int tail
Definition: queues.h:67
Definition: queues.c:360
unsigned int capacity
Definition: queues.c:369
size_t element_size
Definition: queues.c:366
void * queue
Definition: queues.c:361
queue_allocator_t allocator
Definition: queues.c:364