Motr  M0
chan.h
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2012-2020 Seagate Technology LLC and/or its Affiliates
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * For any questions about this software or licensing,
18  * please email opensource@seagate.com or cortx-questions@seagate.com.
19  *
20  */
21 
22 
23 #pragma once
24 
25 #ifndef __MOTR_LIB_CHAN_H__
26 #define __MOTR_LIB_CHAN_H__
27 
28 #include "lib/tlist.h"
29 #include "lib/mutex.h"
30 #include "lib/time.h"
31 #include "lib/semaphore.h"
32 #include "addb2/histogram.h"
33 
166 struct m0_chan;
167 struct m0_clink;
168 struct m0_chan_addb2;
169 
176 typedef bool (*m0_chan_cb_t)(struct m0_clink *link);
177 
229 struct m0_chan {
233  struct m0_tl ch_links;
236  uint32_t ch_waiters;
238 };
239 
274 struct m0_clink {
276  struct m0_chan *cl_chan;
285  uint64_t cl_magic;
286 };
287 
288 M0_INTERNAL void m0_chan_init(struct m0_chan *chan, struct m0_mutex *ch_guard);
289 M0_INTERNAL void m0_chan_fini(struct m0_chan *chan);
290 M0_INTERNAL void m0_chan_fini_lock(struct m0_chan *chan);
291 
299 M0_INTERNAL void m0_chan_signal(struct m0_chan *chan);
300 
304 M0_INTERNAL void m0_chan_signal_lock(struct m0_chan *chan);
305 
320 M0_INTERNAL void m0_chan_broadcast(struct m0_chan *chan);
321 
325 M0_INTERNAL void m0_chan_broadcast_lock(struct m0_chan *chan);
326 
338 M0_INTERNAL void m0_clink_signal(struct m0_clink *clink);
339 
347 M0_INTERNAL bool m0_chan_has_waiters(struct m0_chan *chan);
348 
349 M0_INTERNAL void m0_clink_init(struct m0_clink *link, m0_chan_cb_t cb);
350 M0_INTERNAL void m0_clink_fini(struct m0_clink *link);
351 
355 M0_INTERNAL void m0_clink_attach(struct m0_clink *link,
356  struct m0_clink *group, m0_chan_cb_t cb);
357 
365 M0_INTERNAL void m0_clink_add(struct m0_chan *chan, struct m0_clink *link);
366 
374 M0_INTERNAL void m0_clink_del(struct m0_clink *link);
375 
379 M0_INTERNAL void m0_clink_add_lock(struct m0_chan *chan, struct m0_clink *link);
380 
384 M0_INTERNAL void m0_clink_del_lock(struct m0_clink *link);
385 
389 M0_INTERNAL bool m0_clink_is_armed(const struct m0_clink *link);
390 
396 M0_INTERNAL void m0_clink_cleanup(struct m0_clink *link);
397 
403 M0_INTERNAL void m0_clink_cleanup_locked(struct m0_clink *link);
404 
415 M0_INTERNAL void m0_chan_wait(struct m0_clink *link);
416 
421 M0_INTERNAL bool m0_chan_trywait(struct m0_clink *link);
422 
431 M0_INTERNAL bool m0_chan_timedwait(struct m0_clink *link,
432  const m0_time_t abs_timeout);
433 
437 M0_INTERNAL void m0_chan_lock(struct m0_chan *ch);
438 
442 M0_INTERNAL void m0_chan_unlock(struct m0_chan *ch);
443 
447 M0_INTERNAL bool m0_chan_is_locked(const struct m0_chan *ch);
448 
450  uint64_t ca_wait;
451  uint64_t ca_cb;
455 };
456 
458 #endif /* __MOTR_LIB_CHAN_H__ */
459 
460 /*
461  * Local variables:
462  * c-indentation-style: "K&R"
463  * c-basic-offset: 8
464  * tab-width: 8
465  * fill-column: 80
466  * scroll-step: 1
467  * End:
468  */
uint64_t ca_wait
Definition: chan.h:450
M0_INTERNAL void m0_chan_wait(struct m0_clink *link)
Definition: chan.c:336
M0_INTERNAL void m0_chan_broadcast_lock(struct m0_chan *chan)
Definition: chan.c:178
M0_INTERNAL bool m0_chan_is_locked(const struct m0_chan *ch)
Definition: chan.c:78
M0_INTERNAL void m0_clink_init(struct m0_clink *link, m0_chan_cb_t cb)
Definition: chan.c:201
M0_INTERNAL void m0_clink_del(struct m0_clink *link)
Definition: chan.c:267
M0_INTERNAL void m0_clink_del_lock(struct m0_clink *link)
Definition: chan.c:293
struct m0_addb2_hist ca_queue_hist
Definition: chan.h:454
M0_INTERNAL bool m0_chan_has_waiters(struct m0_chan *chan)
Definition: chan.c:185
uint64_t m0_time_t
Definition: time.h:37
M0_INTERNAL bool m0_clink_is_armed(const struct m0_clink *link)
Definition: chan.c:303
M0_INTERNAL void m0_chan_lock(struct m0_chan *ch)
Definition: chan.c:68
struct m0_tl ch_links
Definition: chan.h:233
M0_INTERNAL void m0_chan_signal(struct m0_chan *chan)
Definition: chan.c:159
struct m0_chan_addb2 * ch_addb2
Definition: chan.h:237
M0_INTERNAL void m0_clink_attach(struct m0_clink *link, struct m0_clink *group, m0_chan_cb_t cb)
Definition: chan.c:215
M0_INTERNAL void m0_chan_init(struct m0_chan *chan, struct m0_mutex *ch_guard)
Definition: chan.c:96
Definition: tlist.h:251
M0_INTERNAL void m0_clink_cleanup_locked(struct m0_clink *link)
Definition: chan.c:319
M0_INTERNAL bool m0_chan_trywait(struct m0_clink *link)
Definition: chan.c:331
M0_INTERNAL void m0_clink_signal(struct m0_clink *clink)
Definition: chan.c:326
M0_INTERNAL void m0_clink_cleanup(struct m0_clink *link)
Definition: chan.c:310
Definition: chan.h:229
static void group(void)
Definition: sm.c:386
static struct m0_clink clink[RDWR_REQUEST_MAX]
M0_INTERNAL void m0_chan_unlock(struct m0_chan *ch)
Definition: chan.c:73
M0_INTERNAL void m0_chan_signal_lock(struct m0_chan *chan)
Definition: chan.c:165
bool(* m0_chan_cb_t)(struct m0_clink *link)
Definition: chan.h:176
void m0_clink_add_lock(struct m0_chan *chan, struct m0_clink *link)
Definition: chan.c:255
uint32_t ch_waiters
Definition: chan.h:236
static struct m0_chan chan[RDWR_REQUEST_MAX]
M0_INTERNAL void m0_clink_add(struct m0_chan *chan, struct m0_clink *link)
Definition: chan.c:228
M0_INTERNAL bool m0_chan_timedwait(struct m0_clink *link, const m0_time_t abs_timeout)
Definition: chan.c:349
uint64_t ca_cb
Definition: chan.h:451
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
Definition: chan.c:208
struct m0_addb2_hist ca_wait_hist
Definition: chan.h:452
M0_INTERNAL void m0_chan_fini(struct m0_chan *chan)
Definition: chan.c:104
struct m0_addb2_hist ca_cb_hist
Definition: chan.h:453
M0_INTERNAL void m0_chan_fini_lock(struct m0_chan *chan)
Definition: chan.c:112
Definition: mutex.h:47
M0_INTERNAL void m0_chan_broadcast(struct m0_chan *chan)
Definition: chan.c:172
struct m0_mutex * ch_guard
Definition: chan.h:231