Skip to content
Snippets Groups Projects
Commit 68222fc9 authored by ruslan.laishev's avatar ruslan.laishev 💬
Browse files

Moved Nano API for Simple linked list

from modules/global-db/dap_chain_global_db_driver.c
to dap-sdk/core/include/dap_list.h
parent e5c8ed07
No related branches found
No related tags found
1 merge request!512bugfix-5760
Pipeline #12296 passed with stage
in 5 seconds
/*
* Doubly-Linked Lists — linked lists that can be iterated over in both directions
*
* Nano API for Simple linked list - by BadAss SysMan
* Attention!!! No internaly locking is performed !
*/
#ifndef __DAP_LIST_H__
#define __DAP_LIST_H__
#include <errno.h> /* <errno> codes */
#include "dap_common.h" /* DAP_ALLOC, DAP_FREE */
#ifdef __cplusplus
extern "C" {
#endif
typedef struct __dap_slist_elm__ {
struct __dap_slist_elm__ *flink; /* Forward link */
void *data; /* Pointer to carried data area */
size_t datasz; /* A data portion size */
} dap_slist_elm_t;
typedef struct __dap_slist__ {
dap_slist_elm_t *head, /* An address of first element */
*tail; /* An address of last element */
int nr; /* A number of elements in list */
} dap_slist_t;
static inline int s_dap_insqtail ( dap_slist_t *q, void *data, int datasz)
{
dap_slist_elm_t *elm;
if ( !(elm = DAP_MALLOC(sizeof(dap_slist_elm_t))) ) /* Allocate memory for new element */
return -ENOMEM;
elm->flink = NULL; /* This element is terminal */
elm->data = data; /* Store pointer to carried data */
elm->datasz= datasz; /* A size of daa metric */
if ( q->tail ) /* Queue is not empty ? */
(q->tail)->flink = elm; /* Correct forward link of "previous last" element
to point to new element */
q->tail = elm; /* Point list's tail to new element also */
if ( !q->head ) /* This is a first element in the list ? */
q->head = elm; /* point head to the new element */
q->nr++; /* Adjust entries counter */
//log_it(L_DEBUG, "Put data: %p, size: %d (qlen: %d)", data, datasz, q->nr);
return 0;
}
static inline int s_dap_remqhead ( dap_slist_t *q, void **data, size_t *datasz)
{
dap_slist_elm_t *elm;
if ( !(elm = q->head) ) /* Queue is empty - just return error code */
return -ENOENT;
if ( !(q->head = elm->flink) ) /* Last element in the queue ? */
q->tail = NULL; /* Reset tail to NULL */
*data = elm->data;
*datasz = elm->datasz;
DAP_FREE(elm); /* Release memory has been allocated for the queue's element */
q->nr--; /* Adjust entries counter */
//log_it(L_DEBUG, "Get data: %p, size: %d (qlen: %d)", *data, *datasz, q->nr);
return 0;
}
typedef void (*dap_callback_destroyed_t)(void* data);
typedef void (*dap_callback_t)(void* data, void* user_data);
typedef void* (*dap_callback_copy_t)(const void * src, void* data);
......@@ -65,6 +132,9 @@ void* dap_list_nth_data(dap_list_t *list, unsigned int n);
#define dap_list_previous(list) ((list) ? (((dap_list_t *)(list))->prev) : NULL)
#define dap_list_next(list) ((list) ? (((dap_list_t *)(list))->next) : NULL)
#endif /* __DAP_LIST_H__ */
......
......@@ -41,6 +41,7 @@
#include "dap_worker.h"
#include "dap_proc_queue.h"
#include "dap_events.h"
#include "dap_list.h"
#include "dap_chain_global_db_driver_sqlite.h"
#include "dap_chain_global_db_driver_cdb.h"
......@@ -60,73 +61,8 @@ static dap_db_driver_callbacks_t s_drv_callback; /* A
static int s_db_drvmode_async = 0; /* Set a kind of processing requests to DB:
<> 0 - Async mode should be used */
/*
* Nano API for Simple linked list - by BadAss SysMan
* Attention!!! No internaly locking is performed !
*/
typedef struct __dap_slist_elm__ {
struct __dap_slist_elm__ *flink; /* Forward link */
void *data; /* Pointer to carried data area */
size_t datasz; /* A data portion size */
} DAP_SLIST_ELM;
typedef struct __dap_slist__ {
DAP_SLIST_ELM *head, /* An address of first element */
*tail; /* An address of last element */
int nr; /* A number of elements in list */
} DAP_SLIST;
static pthread_mutex_t s_db_reqs_list_lock = PTHREAD_MUTEX_INITIALIZER; /* Lock to coordinate access to the <s_db_reqs_queue> */
static DAP_SLIST s_db_reqs_list = {0}; /* A queue of request to DB - maintained in
the Async mode only */
static inline int s_dap_insqtail ( DAP_SLIST *q, dap_store_obj_t *data, int datasz)
{
DAP_SLIST_ELM *elm;
if ( !(elm = DAP_MALLOC(sizeof(DAP_SLIST_ELM))) ) /* Allocate memory for new element */
return -ENOMEM;
elm->flink = NULL; /* This element is terminal */
elm->data = data; /* Store pointer to carried data */
elm->datasz= datasz; /* A size of daa metric */
if ( q->tail ) /* Queue is not empty ? */
(q->tail)->flink = elm; /* Correct forward link of "previous last" element
to point to new element */
q->tail = elm; /* Pointe list's tail to new element also */
if ( !q->head ) /* This is a first element in the list ? */
q->head = elm; /* point head to the new element */
q->nr++; /* Adjust entries counter */
log_it(L_DEBUG, "Put data: %p, size: %d (qlen: %d)", data, datasz, q->nr);
return 0;
}
static inline int s_dap_remqhead ( DAP_SLIST *q, dap_store_obj_t **data, size_t *datasz)
{
DAP_SLIST_ELM *elm;
if ( !(elm = q->head) ) /* Queue is empty - just return error code */
return -ENOENT;
if ( !(q->head = elm->flink) ) /* Last element in the queue ? */
q->tail = NULL; /* Reset tail to NULL */
*data = elm->data;
*datasz = elm->datasz;
DAP_FREE(elm); /* Release memory has been allocated for the queue's element */
q->nr--; /* Adjust entries counter */
log_it(L_DEBUG, "Get data: %p, size: %d (qlen: %d)", *data, *datasz, q->nr);
return 0;
}
static dap_slist_t s_db_reqs_list = {0}; /* A queue of request to DB - maintained in
/**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment