mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2025-01-02 23:21:54 +00:00
Mutex abstraction layer; used in timeloop update calls
This commit is contained in:
parent
c3d0f91978
commit
cc5d17ecbb
@ -76,6 +76,14 @@ current_time(void)
|
|||||||
return timeloop_current()->last_time;
|
return timeloop_current()->last_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
btime
|
||||||
|
current_fresh_time(void)
|
||||||
|
{
|
||||||
|
struct timeloop *loop = timeloop_current();
|
||||||
|
times_update(loop);
|
||||||
|
return loop->last_time;
|
||||||
|
}
|
||||||
|
|
||||||
btime
|
btime
|
||||||
current_real_time(void)
|
current_real_time(void)
|
||||||
{
|
{
|
||||||
|
10
lib/timer.h
10
lib/timer.h
@ -13,10 +13,9 @@
|
|||||||
#include "nest/bird.h"
|
#include "nest/bird.h"
|
||||||
#include "lib/buffer.h"
|
#include "lib/buffer.h"
|
||||||
#include "lib/resource.h"
|
#include "lib/resource.h"
|
||||||
|
#include CONFIG_INCLUDE_LOCKING_H
|
||||||
|
|
||||||
|
typedef struct timer {
|
||||||
typedef struct timer
|
|
||||||
{
|
|
||||||
resource r;
|
resource r;
|
||||||
void (*hook)(struct timer *);
|
void (*hook)(struct timer *);
|
||||||
void *data;
|
void *data;
|
||||||
@ -28,11 +27,11 @@ typedef struct timer
|
|||||||
int index;
|
int index;
|
||||||
} timer;
|
} timer;
|
||||||
|
|
||||||
struct timeloop
|
struct timeloop {
|
||||||
{
|
|
||||||
BUFFER_(timer *) timers;
|
BUFFER_(timer *) timers;
|
||||||
btime last_time;
|
btime last_time;
|
||||||
btime real_time;
|
btime real_time;
|
||||||
|
mutex update_lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline uint timers_count(struct timeloop *loop)
|
static inline uint timers_count(struct timeloop *loop)
|
||||||
@ -44,6 +43,7 @@ static inline timer *timers_first(struct timeloop *loop)
|
|||||||
extern struct timeloop main_timeloop;
|
extern struct timeloop main_timeloop;
|
||||||
|
|
||||||
btime current_time(void);
|
btime current_time(void);
|
||||||
|
btime current_fresh_time(void);
|
||||||
btime current_real_time(void);
|
btime current_real_time(void);
|
||||||
|
|
||||||
//#define now (current_time() TO_S)
|
//#define now (current_time() TO_S)
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
#define CONFIG_INCLUDE_SYSIO_H "sysdep/bsd/sysio.h"
|
#define CONFIG_INCLUDE_SYSIO_H "sysdep/bsd/sysio.h"
|
||||||
#define CONFIG_INCLUDE_KRTSYS_H "sysdep/bsd/krt-sys.h"
|
#define CONFIG_INCLUDE_KRTSYS_H "sysdep/bsd/krt-sys.h"
|
||||||
|
|
||||||
|
#define CONFIG_INCLUDE_LOCKING_H "sysdep/unix/locking.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Link: sysdep/unix
|
Link: sysdep/unix
|
||||||
Link: sysdep/bsd
|
Link: sysdep/bsd
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#define CONFIG_RESTRICTED_PRIVILEGES
|
#define CONFIG_RESTRICTED_PRIVILEGES
|
||||||
#define CONFIG_INCLUDE_SYSPRIV_H "sysdep/linux/syspriv.h"
|
#define CONFIG_INCLUDE_SYSPRIV_H "sysdep/linux/syspriv.h"
|
||||||
|
|
||||||
|
#define CONFIG_INCLUDE_LOCKING_H "sysdep/unix/locking.h"
|
||||||
|
|
||||||
#ifndef AF_MPLS
|
#ifndef AF_MPLS
|
||||||
#define AF_MPLS 28
|
#define AF_MPLS 28
|
||||||
|
@ -115,6 +115,8 @@ times_init(struct timeloop *loop)
|
|||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
mutex_init(&loop->update_lock);
|
||||||
|
|
||||||
rv = clock_gettime(CLOCK_MONOTONIC, &ts);
|
rv = clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
die("Monotonic clock is missing");
|
die("Monotonic clock is missing");
|
||||||
@ -132,6 +134,8 @@ times_update(struct timeloop *loop)
|
|||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
mutex_lock(&loop->update_lock);
|
||||||
|
|
||||||
rv = clock_gettime(CLOCK_MONOTONIC, &ts);
|
rv = clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
die("clock_gettime: %m");
|
die("clock_gettime: %m");
|
||||||
@ -143,6 +147,8 @@ times_update(struct timeloop *loop)
|
|||||||
|
|
||||||
loop->last_time = new_time;
|
loop->last_time = new_time;
|
||||||
loop->real_time = 0;
|
loop->real_time = 0;
|
||||||
|
|
||||||
|
mutex_unlock(&loop->update_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -151,11 +157,15 @@ times_update_real_time(struct timeloop *loop)
|
|||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
mutex_lock(&loop->update_lock);
|
||||||
|
|
||||||
rv = clock_gettime(CLOCK_REALTIME, &ts);
|
rv = clock_gettime(CLOCK_REALTIME, &ts);
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
die("clock_gettime: %m");
|
die("clock_gettime: %m");
|
||||||
|
|
||||||
loop->real_time = ts.tv_sec S + ts.tv_nsec NS;
|
loop->real_time = ts.tv_sec S + ts.tv_nsec NS;
|
||||||
|
|
||||||
|
mutex_unlock(&loop->update_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
49
sysdep/unix/locking.h
Normal file
49
sysdep/unix/locking.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* BIRD Locking Subsystem
|
||||||
|
*
|
||||||
|
* (c) 2018 Maria Matejka <mq@jmq.cz>
|
||||||
|
*
|
||||||
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BIRD_SYSDEP_MUTEX_H_
|
||||||
|
#define _BIRD_SYSDEP_MUTEX_H_
|
||||||
|
|
||||||
|
#define MUTEX_DEBUG 1
|
||||||
|
|
||||||
|
#if MUTEX_DEBUG
|
||||||
|
#define MUTEX_TYPE PTHREAD_MUTEX_ERRORCHECK
|
||||||
|
#else
|
||||||
|
#define MUTEX_TYPE PTHREAD_MUTEX_NORMAL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
typedef pthread_mutex_t mutex;
|
||||||
|
|
||||||
|
static inline void mutex_init(mutex *m)
|
||||||
|
{
|
||||||
|
pthread_mutexattr_t mat;
|
||||||
|
if (pthread_mutexattr_init(&mat) < 0)
|
||||||
|
bug("pthread_mutexattr_init() failed: %m");
|
||||||
|
if (pthread_mutexattr_settype(&mat, MUTEX_TYPE) < 0)
|
||||||
|
bug("pthread_mutexattr_settype() failed: %m");
|
||||||
|
if (pthread_mutex_init(m, &mat) < 0)
|
||||||
|
bug("pthread_mutex_init() failed: %m");
|
||||||
|
}
|
||||||
|
|
||||||
|
#if MUTEX_DEBUG
|
||||||
|
#define mutex_lock(m) do { \
|
||||||
|
if (pthread_mutex_lock(m)) \
|
||||||
|
bug("pthread_mutex_lock() failed: %m"); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define mutex_unlock(m) do { \
|
||||||
|
if (pthread_mutex_unlock(m)) \
|
||||||
|
bug("pthread_mutex_unlock() failed: %m"); \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
#define mutex_lock(m) pthread_mutex_lock(m)
|
||||||
|
#define mutex_unlock(m) pthread_mutex_unlock(m)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user