mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
ringbuffer: use gcc atomic operations
Remove barrier, use GCC atomic operations for ringbuffer
This commit is contained in:
parent
02d4dc0efd
commit
baada0a330
7 changed files with 32 additions and 92 deletions
|
|
@ -1,51 +0,0 @@
|
|||
/* Simple Plugin API
|
||||
* Copyright (C) 2016 Wim Taymans <wim.taymans@gmail.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef __SPA_BARRIER_H__
|
||||
#define __SPA_BARRIER_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <spa/defs.h>
|
||||
|
||||
#if defined(__GNUC__)
|
||||
# if defined( __i386__ ) || defined( __i486__ ) || defined( __i586__ ) || defined( __i686__ ) || defined( __x86_64__ )
|
||||
# define spa_barrier_full() asm volatile("mfence":::"memory")
|
||||
# define spa_barrier_read() asm volatile("lfence":::"memory")
|
||||
# define spa_barrier_write() asm volatile("sfence":::"memory")
|
||||
# elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
|
||||
# define spa_barrier_full() __sync_synchronize()
|
||||
# define spa_barrier_read() __sync_synchronize()
|
||||
# define spa_barrier_write() __sync_synchronize()
|
||||
# endif
|
||||
#else
|
||||
# warning no memory barriers support found
|
||||
# define spa_barrier_full()
|
||||
# define spa_barrier_read()
|
||||
# define spa_barrier_write()
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __SPA_BARRIER_H__ */
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
spa_headers = [
|
||||
'alloc-param.h',
|
||||
'barrier.h',
|
||||
'buffer.h',
|
||||
'clock.h',
|
||||
'command.h',
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@ typedef struct _SpaRingbuffer SpaRingbuffer;
|
|||
#include <string.h>
|
||||
|
||||
#include <spa/defs.h>
|
||||
#include <spa/barrier.h>
|
||||
|
||||
/**
|
||||
* SpaRingbuffer:
|
||||
|
|
@ -103,9 +102,8 @@ spa_ringbuffer_get_read_index (SpaRingbuffer *rbuf,
|
|||
{
|
||||
int32_t avail;
|
||||
|
||||
*index = rbuf->readindex;
|
||||
avail = (int32_t) (rbuf->writeindex - *index);
|
||||
spa_barrier_read();
|
||||
*index = __atomic_load_n (&rbuf->readindex, __ATOMIC_RELAXED);
|
||||
avail = (int32_t) (__atomic_load_n (&rbuf->writeindex, __ATOMIC_ACQUIRE) - *index);
|
||||
|
||||
return avail;
|
||||
}
|
||||
|
|
@ -138,18 +136,17 @@ spa_ringbuffer_read_data (SpaRingbuffer *rbuf,
|
|||
}
|
||||
|
||||
/**
|
||||
* spa_ringbuffer_read_advance:
|
||||
* spa_ringbuffer_read_update:
|
||||
* @rbuf: a #SpaRingbuffer
|
||||
* @len: number of bytes to advance
|
||||
* @index: new index
|
||||
*
|
||||
* Advance the read pointer by @len
|
||||
* Update the read pointer to @index
|
||||
*/
|
||||
static inline void
|
||||
spa_ringbuffer_read_advance (SpaRingbuffer *rbuf,
|
||||
int32_t len)
|
||||
spa_ringbuffer_read_update (SpaRingbuffer *rbuf,
|
||||
int32_t index)
|
||||
{
|
||||
spa_barrier_full();
|
||||
rbuf->readindex += len;
|
||||
__atomic_store_n (&rbuf->readindex, index, __ATOMIC_RELEASE);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -169,9 +166,8 @@ spa_ringbuffer_get_write_index (SpaRingbuffer *rbuf,
|
|||
{
|
||||
int32_t filled;
|
||||
|
||||
*index = rbuf->writeindex;
|
||||
filled = (int32_t) (*index - rbuf->readindex);
|
||||
spa_barrier_full();
|
||||
*index = __atomic_load_n (&rbuf->writeindex, __ATOMIC_RELAXED);
|
||||
filled = (int32_t) (*index - __atomic_load_n (&rbuf->readindex, __ATOMIC_ACQUIRE));
|
||||
|
||||
return filled;
|
||||
}
|
||||
|
|
@ -193,19 +189,18 @@ spa_ringbuffer_write_data (SpaRingbuffer *rbuf,
|
|||
}
|
||||
|
||||
/**
|
||||
* spa_ringbuffer_write_advance:
|
||||
* spa_ringbuffer_write_update:
|
||||
* @rbuf: a #SpaRingbuffer
|
||||
* @len: number of bytes to advance
|
||||
* @index: new index
|
||||
*
|
||||
* Advance the write pointer by @len
|
||||
* Update the write pointer to @index
|
||||
*
|
||||
*/
|
||||
static inline void
|
||||
spa_ringbuffer_write_advance (SpaRingbuffer *rbuf,
|
||||
int32_t len)
|
||||
spa_ringbuffer_write_update (SpaRingbuffer *rbuf,
|
||||
int32_t index)
|
||||
{
|
||||
spa_barrier_write();
|
||||
rbuf->writeindex += len;
|
||||
__atomic_store_n (&rbuf->writeindex, index, __ATOMIC_RELEASE);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -372,7 +372,7 @@ pull_frames (SpaALSAState *state,
|
|||
dst,
|
||||
n_bytes);
|
||||
|
||||
spa_ringbuffer_read_advance (ringbuffer, n_bytes);
|
||||
spa_ringbuffer_read_update (ringbuffer, index + n_bytes);
|
||||
reuse = avail == n_bytes;
|
||||
} else {
|
||||
offs = SPA_MIN (d[0].chunk->offset + state->ready_offset, d[0].maxsize);
|
||||
|
|
|
|||
|
|
@ -324,7 +324,7 @@ audiotestsrc_make_buffer (SpaAudioTestSrc *this)
|
|||
} else {
|
||||
this->render_func (this, SPA_MEMBER (b->outbuf->datas[0].data, offset, void), n_samples);
|
||||
}
|
||||
spa_ringbuffer_write_advance (&b->rb->ringbuffer, n_bytes);
|
||||
spa_ringbuffer_write_update (&b->rb->ringbuffer, index + n_bytes);
|
||||
} else {
|
||||
n_samples = n_bytes / this->bpf;
|
||||
this->render_func (this, b->outbuf->datas[0].data, n_samples);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue