Skip to content

Commit

Permalink
iiod-client: Pass client data as pointer to struct iiod_client_pdata
Browse files Browse the repository at this point in the history
Instead of having the iiod-client API use a void* pointer to represent
the client platform data, use a pointer to a 'struct iiod_client_pdata',
that can be defined differently in each client.

This makes the code more robust as the compiler will properly enforce
type safety.

Signed-off-by: Paul Cercueil <[email protected]>
  • Loading branch information
pcercuei committed Apr 26, 2021
1 parent b74bc25 commit 251c17e
Show file tree
Hide file tree
Showing 8 changed files with 179 additions and 107 deletions.
95 changes: 62 additions & 33 deletions iiod-client.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ void iiod_client_mutex_unlock(struct iiod_client *client)
}

static ssize_t iiod_client_read_integer(struct iiod_client *client,
void *desc, int *val)
struct iiod_client_pdata *desc,
int *val)
{
unsigned int i;
char buf[1024], *ptr = NULL, *end;
Expand Down Expand Up @@ -74,7 +75,8 @@ static ssize_t iiod_client_read_integer(struct iiod_client *client,
}

static int iiod_client_exec_command(struct iiod_client *client,
void *desc, const char *cmd)
struct iiod_client_pdata *desc,
const char *cmd)
{
int resp;
ssize_t ret;
Expand All @@ -88,7 +90,8 @@ static int iiod_client_exec_command(struct iiod_client *client,
}

static ssize_t iiod_client_write_all(struct iiod_client *client,
void *desc, const void *src, size_t len)
struct iiod_client_pdata *desc,
const void *src, size_t len)
{
struct iio_context_pdata *pdata = client->pdata;
const struct iiod_client_ops *ops = client->ops;
Expand All @@ -115,7 +118,8 @@ static ssize_t iiod_client_write_all(struct iiod_client *client,
}

static ssize_t iiod_client_read_all(struct iiod_client *client,
void *desc, void *dst, size_t len)
struct iiod_client_pdata *desc,
void *dst, size_t len)
{
struct iio_context_pdata *pdata = client->pdata;
const struct iiod_client_ops *ops = client->ops;
Expand Down Expand Up @@ -173,8 +177,10 @@ void iiod_client_destroy(struct iiod_client *client)
free(client);
}

int iiod_client_get_version(struct iiod_client *client, void *desc,
unsigned int *major, unsigned int *minor, char *git_tag)
int iiod_client_get_version(struct iiod_client *client,
struct iiod_client_pdata *desc,
unsigned int *major, unsigned int *minor,
char *git_tag)
{
struct iio_context_pdata *pdata = client->pdata;
const struct iiod_client_ops *ops = client->ops;
Expand Down Expand Up @@ -223,8 +229,10 @@ int iiod_client_get_version(struct iiod_client *client, void *desc,
return 0;
}

int iiod_client_get_trigger(struct iiod_client *client, void *desc,
const struct iio_device *dev, const struct iio_device **trigger)
int iiod_client_get_trigger(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
const struct iio_device **trigger)
{
const struct iio_context *ctx = iio_device_get_context(dev);
unsigned int i, nb_devices = iio_context_get_devices_count(ctx);
Expand Down Expand Up @@ -278,8 +286,10 @@ int iiod_client_get_trigger(struct iiod_client *client, void *desc,
return ret;
}

int iiod_client_set_trigger(struct iiod_client *client, void *desc,
const struct iio_device *dev, const struct iio_device *trigger)
int iiod_client_set_trigger(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
const struct iio_device *trigger)
{
char buf[1024];
int ret;
Expand All @@ -299,8 +309,10 @@ int iiod_client_set_trigger(struct iiod_client *client, void *desc,
return ret;
}

int iiod_client_set_kernel_buffers_count(struct iiod_client *client, void *desc,
const struct iio_device *dev, unsigned int nb_blocks)
int iiod_client_set_kernel_buffers_count(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
unsigned int nb_blocks)
{
int ret;
char buf[1024];
Expand All @@ -315,7 +327,8 @@ int iiod_client_set_kernel_buffers_count(struct iiod_client *client, void *desc,
}

int iiod_client_set_timeout(struct iiod_client *client,
void *desc, unsigned int timeout)
struct iiod_client_pdata *desc,
unsigned int timeout)
{
int ret;
char buf[1024];
Expand All @@ -328,8 +341,9 @@ int iiod_client_set_timeout(struct iiod_client *client,
return ret;
}

static int iiod_client_discard(struct iiod_client *client, void *desc,
char *buf, size_t buf_len, size_t to_discard)
static int iiod_client_discard(struct iiod_client *client,
struct iiod_client_pdata *desc,
char *buf, size_t buf_len, size_t to_discard)
{
do {
size_t read_len;
Expand All @@ -350,9 +364,12 @@ static int iiod_client_discard(struct iiod_client *client, void *desc,
return 0;
}

ssize_t iiod_client_read_attr(struct iiod_client *client, void *desc,
const struct iio_device *dev, const struct iio_channel *chn,
const char *attr, char *dest, size_t len, enum iio_attr_type type)
ssize_t iiod_client_read_attr(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
const struct iio_channel *chn,
const char *attr, char *dest,
size_t len, enum iio_attr_type type)
{
const char *id = iio_device_get_id(dev);
char buf[1024];
Expand Down Expand Up @@ -431,9 +448,12 @@ ssize_t iiod_client_read_attr(struct iiod_client *client, void *desc,
return ret;
}

ssize_t iiod_client_write_attr(struct iiod_client *client, void *desc,
const struct iio_device *dev, const struct iio_channel *chn,
const char *attr, const char *src, size_t len, enum iio_attr_type type)
ssize_t iiod_client_write_attr(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
const struct iio_channel *chn,
const char *attr, const char *src,
size_t len, enum iio_attr_type type)
{
struct iio_context_pdata *pdata = client->pdata;
const struct iiod_client_ops *ops = client->ops;
Expand Down Expand Up @@ -510,7 +530,7 @@ ssize_t iiod_client_write_attr(struct iiod_client *client, void *desc,

static struct iio_context *
iiod_client_create_context_private(struct iiod_client *client,
void *desc, bool zstd)
struct iiod_client_pdata *desc, bool zstd)
{
const char *cmd = zstd ? "ZPRINT\r\n" : "PRINT\r\n";
struct iio_context *ctx = NULL;
Expand Down Expand Up @@ -592,13 +612,16 @@ iiod_client_create_context_private(struct iiod_client *client,
return ctx;
}

struct iio_context * iiod_client_create_context(struct iiod_client *client, void *desc)
struct iio_context * iiod_client_create_context(struct iiod_client *client,
struct iiod_client_pdata *desc)
{
return iiod_client_create_context_private(client, desc, WITH_ZSTD);
}

int iiod_client_open_unlocked(struct iiod_client *client, void *desc,
const struct iio_device *dev, size_t samples_count, bool cyclic)
int iiod_client_open_unlocked(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
size_t samples_count, bool cyclic)
{
char buf[1024], *ptr;
size_t i;
Expand All @@ -624,8 +647,9 @@ int iiod_client_open_unlocked(struct iiod_client *client, void *desc,
return iiod_client_exec_command(client, desc, buf);
}

int iiod_client_close_unlocked(struct iiod_client *client, void *desc,
const struct iio_device *dev)
int iiod_client_close_unlocked(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev)
{
char buf[1024];

Expand All @@ -634,7 +658,8 @@ int iiod_client_close_unlocked(struct iiod_client *client, void *desc,
}

static int iiod_client_read_mask(struct iiod_client *client,
void *desc, uint32_t *mask, size_t words)
struct iiod_client_pdata *desc,
uint32_t *mask, size_t words)
{
size_t i;
ssize_t ret;
Expand Down Expand Up @@ -668,9 +693,11 @@ static int iiod_client_read_mask(struct iiod_client *client,
return (int) ret;
}

ssize_t iiod_client_read_unlocked(struct iiod_client *client, void *desc,
const struct iio_device *dev, void *dst, size_t len,
uint32_t *mask, size_t words)
ssize_t iiod_client_read_unlocked(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
void *dst, size_t len,
uint32_t *mask, size_t words)
{
unsigned int nb_channels = iio_device_get_channels_count(dev);
uintptr_t ptr = (uintptr_t) dst;
Expand Down Expand Up @@ -724,8 +751,10 @@ ssize_t iiod_client_read_unlocked(struct iiod_client *client, void *desc,
return read;
}

ssize_t iiod_client_write_unlocked(struct iiod_client *client, void *desc,
const struct iio_device *dev, const void *src, size_t len)
ssize_t iiod_client_write_unlocked(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
const void *src, size_t len)
{
ssize_t ret;
char buf[1024];
Expand Down
95 changes: 65 additions & 30 deletions iiod-client.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,19 @@

struct iio_mutex;
struct iiod_client;
struct iiod_client_pdata;
struct iio_context_pdata;

struct iiod_client_ops {
ssize_t (*write)(struct iio_context_pdata *pdata,
void *desc, const char *src, size_t len);
struct iiod_client_pdata *desc,
const char *src, size_t len);
ssize_t (*read)(struct iio_context_pdata *pdata,
void *desc, char *dst, size_t len);
struct iiod_client_pdata *desc,
char *dst, size_t len);
ssize_t (*read_line)(struct iio_context_pdata *pdata,
void *desc, char *dst, size_t len);
struct iiod_client_pdata *desc,
char *dst, size_t len);
};

void iiod_client_mutex_lock(struct iiod_client *client);
Expand All @@ -31,34 +35,65 @@ struct iiod_client * iiod_client_new(struct iio_context_pdata *pdata,
const struct iiod_client_ops *ops);
void iiod_client_destroy(struct iiod_client *client);

int iiod_client_get_version(struct iiod_client *client, void *desc,
unsigned int *major, unsigned int *minor, char *git_tag);
int iiod_client_get_trigger(struct iiod_client *client, void *desc,
const struct iio_device *dev,
const struct iio_device **trigger);
int iiod_client_set_trigger(struct iiod_client *client, void *desc,
const struct iio_device *dev, const struct iio_device *trigger);
int iiod_client_get_version(struct iiod_client *client,
struct iiod_client_pdata *desc,
unsigned int *major, unsigned int *minor,
char *git_tag);

int iiod_client_get_trigger(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
const struct iio_device **trigger);

int iiod_client_set_trigger(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
const struct iio_device *trigger);

int iiod_client_set_kernel_buffers_count(struct iiod_client *client,
void *desc, const struct iio_device *dev, unsigned int nb_blocks);
struct iiod_client_pdata *desc,
const struct iio_device *dev,
unsigned int nb_blocks);

int iiod_client_set_timeout(struct iiod_client *client,
void *desc, unsigned int timeout);
ssize_t iiod_client_read_attr(struct iiod_client *client, void *desc,
const struct iio_device *dev, const struct iio_channel *chn,
const char *attr, char *dest, size_t len, enum iio_attr_type type);
ssize_t iiod_client_write_attr(struct iiod_client *client, void *desc,
const struct iio_device *dev, const struct iio_channel *chn,
const char *attr, const char *src, size_t len, enum iio_attr_type type);
int iiod_client_open_unlocked(struct iiod_client *client, void *desc,
const struct iio_device *dev, size_t samples_count,
bool cyclic);
int iiod_client_close_unlocked(struct iiod_client *client, void *desc,
const struct iio_device *dev);
ssize_t iiod_client_read_unlocked(struct iiod_client *client, void *desc,
const struct iio_device *dev, void *dst, size_t len,
uint32_t *mask, size_t words);
ssize_t iiod_client_write_unlocked(struct iiod_client *client, void *desc,
const struct iio_device *dev, const void *src, size_t len);
struct iio_context * iiod_client_create_context(
struct iiod_client *client, void *desc);
struct iiod_client_pdata *desc,
unsigned int timeout);

ssize_t iiod_client_read_attr(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
const struct iio_channel *chn,
const char *attr, char *dest, size_t len,
enum iio_attr_type type);

ssize_t iiod_client_write_attr(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
const struct iio_channel *chn,
const char *attr, const char *src,
size_t len, enum iio_attr_type type);

int iiod_client_open_unlocked(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
size_t samples_count, bool cyclic);

int iiod_client_close_unlocked(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev);

ssize_t iiod_client_read_unlocked(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
void *dst, size_t len,
uint32_t *mask, size_t words);

ssize_t iiod_client_write_unlocked(struct iiod_client *client,
struct iiod_client_pdata *desc,
const struct iio_device *dev,
const void *src, size_t len);

struct iio_context * iiod_client_create_context(struct iiod_client *client,
struct iiod_client_pdata *desc);

#endif /* _IIOD_CLIENT_H */
12 changes: 6 additions & 6 deletions network-unix.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ int set_blocking_mode(int fd, bool blocking)
#if WITH_NETWORK_EVENTFD
#include <sys/eventfd.h>

int create_cancel_fd(struct iio_network_io_context *io_ctx)
int create_cancel_fd(struct iiod_client_pdata *io_ctx)
{
io_ctx->cancel_fd[0] = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK);
if (io_ctx->cancel_fd[0] < 0)
Expand All @@ -47,7 +47,7 @@ int create_cancel_fd(struct iio_network_io_context *io_ctx)

#else /* WITH_NETWORK_EVENTFD */

int create_cancel_fd(struct iio_network_io_context *io_ctx)
int create_cancel_fd(struct iiod_client_pdata *io_ctx)
{
int ret;

Expand All @@ -74,14 +74,14 @@ int create_cancel_fd(struct iio_network_io_context *io_ctx)
}
#endif /* WITH_NETWORK_EVENTFD */

void cleanup_cancel(struct iio_network_io_context *io_ctx)
void cleanup_cancel(struct iiod_client_pdata *io_ctx)
{
close(io_ctx->cancel_fd[0]);
if (!WITH_NETWORK_EVENTFD)
close(io_ctx->cancel_fd[1]);
}

int setup_cancel(struct iio_network_io_context *io_ctx)
int setup_cancel(struct iiod_client_pdata *io_ctx)
{
int ret;

Expand All @@ -94,7 +94,7 @@ int setup_cancel(struct iio_network_io_context *io_ctx)

#define CANCEL_WR_FD (!WITH_NETWORK_EVENTFD)

void do_cancel(struct iio_network_io_context *io_ctx)
void do_cancel(struct iiod_client_pdata *io_ctx)
{
uint64_t event = 1;
int ret;
Expand All @@ -108,7 +108,7 @@ void do_cancel(struct iio_network_io_context *io_ctx)
}
}

int wait_cancellable(struct iio_network_io_context *io_ctx, bool read)
int wait_cancellable(struct iiod_client_pdata *io_ctx, bool read)
{
struct pollfd pfd[2];
int ret;
Expand Down
Loading

0 comments on commit 251c17e

Please sign in to comment.