X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libringbuffer%2Ffrontend_types.h;h=b6b34470ce28447b8f6dea168369078ec5a608ff;hb=f64d4ce513a53fb1f1b7b4d094692b167d872532;hp=9c733d170fe7fadfb8fa8fe8a958bc7ef4de6d43;hpb=a3bb4b278286aaa20867ba68bd5b5a5853974126;p=lttng-ust.git diff --git a/libringbuffer/frontend_types.h b/libringbuffer/frontend_types.h index 9c733d17..b6b34470 100644 --- a/libringbuffer/frontend_types.h +++ b/libringbuffer/frontend_types.h @@ -1,19 +1,31 @@ -#ifndef _LINUX_RING_BUFFER_FRONTEND_TYPES_H -#define _LINUX_RING_BUFFER_FRONTEND_TYPES_H +#ifndef _LTTNG_RING_BUFFER_FRONTEND_TYPES_H +#define _LTTNG_RING_BUFFER_FRONTEND_TYPES_H /* - * linux/ringbuffer/frontend_types.h - * - * (C) Copyright 2005-2010 - Mathieu Desnoyers + * libringbuffer/frontend_types.h * * Ring Buffer Library Synchronization Header (types). * + * Copyright (C) 2005-2012 Mathieu Desnoyers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * * Author: * Mathieu Desnoyers * * See ring_buffer_frontend.c for more information on wait-free algorithms. - * - * Dual LGPL v2.1/GPL v2 license. */ #include @@ -21,10 +33,8 @@ #include #include -#include "lttng/core.h" - -#include #include +#include #include "backend_types.h" #include "shm_internal.h" #include "vatomic.h" @@ -50,6 +60,7 @@ struct channel { //wait_queue_head_t read_wait; /* reader wait queue */ int finalized; /* Has channel been finalized */ size_t priv_data_offset; + /* Note: padding field is missing */ /* * Associated backend contains a variable-length array. Needs to * be last member. @@ -58,17 +69,22 @@ struct channel { } __attribute__((aligned(CAA_CACHE_LINE_SIZE))); /* Per-subbuffer commit counters used on the hot path */ +#define RB_COMMIT_COUNT_HOT_PADDING 16 struct commit_counters_hot { union v_atomic cc; /* Commit counter */ union v_atomic seq; /* Consecutive commits */ + char padding[RB_COMMIT_COUNT_HOT_PADDING]; } __attribute__((aligned(CAA_CACHE_LINE_SIZE))); /* Per-subbuffer commit counters used only on cold paths */ +#define RB_COMMIT_COUNT_COLD_PADDING 24 struct commit_counters_cold { union v_atomic cc_sb; /* Incremented _once_ at sb switch */ + char padding[RB_COMMIT_COUNT_COLD_PADDING]; } __attribute__((aligned(CAA_CACHE_LINE_SIZE))); /* ring buffer state */ +#define RB_RING_BUFFER_PADDING 64 struct lttng_ust_lib_ring_buffer { /* First 32 bytes cache-hot cacheline */ union v_atomic offset; /* Current offset in the buffer */ @@ -106,11 +122,12 @@ struct lttng_ust_lib_ring_buffer { unsigned long get_subbuf_consumed; /* Read-side consumed */ unsigned long prod_snapshot; /* Producer count snapshot */ unsigned long cons_snapshot; /* Consumer count snapshot */ - int get_subbuf:1; /* Sub-buffer being held by reader */ - int switch_timer_enabled:1; /* Protected by ring_buffer_nohz_lock */ - int read_timer_enabled:1; /* Protected by ring_buffer_nohz_lock */ + unsigned int get_subbuf:1, /* Sub-buffer being held by reader */ + switch_timer_enabled:1, /* Protected by ring_buffer_nohz_lock */ + read_timer_enabled:1; /* Protected by ring_buffer_nohz_lock */ /* shmp pointer to self */ DECLARE_SHMP(struct lttng_ust_lib_ring_buffer, self); + char padding[RB_RING_BUFFER_PADDING]; } __attribute__((aligned(CAA_CACHE_LINE_SIZE))); static inline @@ -119,6 +136,10 @@ void *channel_get_private(struct channel *chan) return ((char *) chan) + chan->priv_data_offset; } +#ifndef __rb_same_type +#define __rb_same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) +#endif + /* * Issue warnings and disable channels upon internal error. * Can receive struct lttng_ust_lib_ring_buffer or struct lttng_ust_lib_ring_buffer_backend @@ -129,11 +150,11 @@ void *channel_get_private(struct channel *chan) struct channel *__chan; \ int _____ret = caa_unlikely(cond); \ if (_____ret) { \ - if (__same_type(*(c), struct channel_backend)) \ + if (__rb_same_type(*(c), struct channel_backend)) \ __chan = caa_container_of((void *) (c), \ struct channel, \ backend); \ - else if (__same_type(*(c), struct channel)) \ + else if (__rb_same_type(*(c), struct channel)) \ __chan = (void *) (c); \ else \ BUG_ON(1); \ @@ -143,4 +164,4 @@ void *channel_get_private(struct channel *chan) _____ret; \ }) -#endif /* _LINUX_RING_BUFFER_FRONTEND_TYPES_H */ +#endif /* _LTTNG_RING_BUFFER_FRONTEND_TYPES_H */