struct shm_handle *handle)
{
struct channel *chan = shmp(handle, buf->backend.chan);
- const struct lib_ring_buffer_config *config = &chan->backend.config;
+ //const struct lib_ring_buffer_config *config = &chan->backend.config;
if (!chan->switch_timer_interval || buf->switch_timer_enabled)
return;
static void channel_free(struct channel *chan, struct shm_handle *handle,
int shadow)
{
- int ret;
-
if (!shadow)
channel_backend_free(&chan->backend, handle);
/* chan is freed by shm teardown */
shmobj = shm_object_table_append(handle->table, shmsize);
if (!shmobj)
goto error_append;
+ /* struct channel is at object 0, offset 0 (hardcoded) */
set_shmp(handle->chan, zalloc_shm(shmobj, sizeof(struct channel)));
+ assert(handle->chan._ref.index == 0);
+ assert(handle->chan._ref.offset == 0);
chan = shmp(handle, handle->chan);
if (!chan)
goto error_append;
shm_fd, wait_fd, memory_map_size);
if (!object)
goto error_table_object;
-
+ /* struct channel is at object 0, offset 0 (hardcoded) */
+ handle->chan._ref.index = 0;
+ handle->chan._ref.offset = 0;
return handle;
error_table_object:
memory_map_size);
return shmp(handle, chan->backend.buf[0].shmp);
} else {
+ if (cpu >= num_possible_cpus())
+ return NULL;
ref = &chan->backend.buf[cpu].shmp._ref;
shm_get_object_data(handle, ref, shm_fd, wait_fd,
memory_map_size);
struct shm_handle *handle,
int shadow)
{
- struct channel *chan = shmp(handle, buf->backend.chan);
-
if (shadow) {
if (uatomic_cmpxchg(&buf->active_shadow_readers, 0, 1) != 0)
return -EBUSY;