syslog/ramlog: get ramlog size by ioctl

Signed-off-by: Jiuzhu Dong <dongjiuzhu1@xiaomi.com>
This commit is contained in:
Jiuzhu Dong 2021-04-19 21:53:25 +08:00 committed by Xiang Xiao
parent b30bf4ff06
commit 7fa69e4173

View File

@ -43,6 +43,7 @@
#include <nuttx/kmalloc.h> #include <nuttx/kmalloc.h>
#include <nuttx/semaphore.h> #include <nuttx/semaphore.h>
#include <nuttx/fs/fs.h> #include <nuttx/fs/fs.h>
#include <nuttx/fs/ioctl.h>
#include <nuttx/syslog/ramlog.h> #include <nuttx/syslog/ramlog.h>
#include <nuttx/compiler.h> #include <nuttx/compiler.h>
@ -57,16 +58,16 @@
struct ramlog_dev_s struct ramlog_dev_s
{ {
#ifndef CONFIG_RAMLOG_NONBLOCKING #ifndef CONFIG_RAMLOG_NONBLOCKING
volatile uint8_t rl_nwaiters; /* Number of threads waiting for data */ volatile uint8_t rl_nwaiters; /* Number of threads waiting for data */
#endif #endif
volatile uint16_t rl_head; /* The head index (where data is added) */ volatile size_t rl_head; /* The head index (where data is added) */
volatile uint16_t rl_tail; /* The tail index (where data is removed) */ volatile size_t rl_tail; /* The tail index (where data is removed) */
sem_t rl_exclsem; /* Enforces mutually exclusive access */ sem_t rl_exclsem; /* Enforces mutually exclusive access */
#ifndef CONFIG_RAMLOG_NONBLOCKING #ifndef CONFIG_RAMLOG_NONBLOCKING
sem_t rl_waitsem; /* Used to wait for data */ sem_t rl_waitsem; /* Used to wait for data */
#endif #endif
size_t rl_bufsize; /* Size of the RAM buffer */ size_t rl_bufsize; /* Size of the RAM buffer */
FAR char *rl_buffer; /* Circular RAM buffer */ FAR char *rl_buffer; /* Circular RAM buffer */
/* The following is a list if poll structures of threads waiting for /* The following is a list if poll structures of threads waiting for
* driver events. The 'struct pollfd' reference for each open is also * driver events. The 'struct pollfd' reference for each open is also
@ -95,6 +96,8 @@ static ssize_t ramlog_read(FAR struct file *filep, FAR char *buffer,
size_t buflen); size_t buflen);
static ssize_t ramlog_write(FAR struct file *filep, FAR const char *buffer, static ssize_t ramlog_write(FAR struct file *filep, FAR const char *buffer,
size_t buflen); size_t buflen);
static int ramlog_ioctl(FAR struct file *filep, int cmd,
unsigned long arg);
static int ramlog_poll(FAR struct file *filep, FAR struct pollfd *fds, static int ramlog_poll(FAR struct file *filep, FAR struct pollfd *fds,
bool setup); bool setup);
@ -109,7 +112,7 @@ static const struct file_operations g_ramlogfops =
ramlog_read, /* read */ ramlog_read, /* read */
ramlog_write, /* write */ ramlog_write, /* write */
NULL, /* seek */ NULL, /* seek */
NULL, /* ioctl */ ramlog_ioctl, /* ioctl */
ramlog_poll /* poll */ ramlog_poll /* poll */
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
, NULL /* unlink */ , NULL /* unlink */
@ -534,11 +537,47 @@ static ssize_t ramlog_write(FAR struct file *filep, FAR const char *buffer,
return len; return len;
} }
/****************************************************************************
* Name: ramlog_ioctl
****************************************************************************/
static int ramlog_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
{
FAR struct inode *inode = filep->f_inode;
FAR struct ramlog_dev_s *priv;
int ret;
DEBUGASSERT(inode && inode->i_private);
priv = (FAR struct ramlog_dev_s *)inode->i_private;
ret = nxsem_wait(&priv->rl_exclsem);
if (ret < 0)
{
return ret;
}
switch (cmd)
{
case FIONREAD:
*(FAR int *)((uintptr_t)arg) = (priv->rl_bufsize + priv->rl_head -
priv->rl_tail) % priv->rl_bufsize;
break;
default:
ret = -ENOTTY;
break;
}
nxsem_post(&priv->rl_exclsem);
return ret;
}
/**************************************************************************** /****************************************************************************
* Name: ramlog_poll * Name: ramlog_poll
****************************************************************************/ ****************************************************************************/
int ramlog_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup) static int ramlog_poll(FAR struct file *filep, FAR struct pollfd *fds,
bool setup)
{ {
FAR struct inode *inode = filep->f_inode; FAR struct inode *inode = filep->f_inode;
FAR struct ramlog_dev_s *priv; FAR struct ramlog_dev_s *priv;