mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-05-13 18:10:19 +08:00
EPOCH(9): Avoid inline functions
FreeBSD changed the epoch_enter() and epoch_exit() inline functions into proper functions after a performance analysis to avoid code bloat.
This commit is contained in:
parent
660a8835eb
commit
ed1a63384b
@ -36,7 +36,6 @@
|
||||
#include <sys/lock.h>
|
||||
#include <sys/pcpu.h>
|
||||
#include <rtems/score/percpudata.h>
|
||||
#include <rtems/score/threaddispatch.h>
|
||||
#endif
|
||||
#include <rtems/thread.h>
|
||||
#include <ck_epoch.h>
|
||||
@ -100,7 +99,10 @@ SYSINIT(epoch_##name, SI_SUB_TUNABLES, SI_ORDER_THIRD, \
|
||||
void _bsd_epoch_init(epoch_t epoch, uintptr_t pcpu_record_offset,
|
||||
int flags);
|
||||
|
||||
void epoch_enter(epoch_t epoch);
|
||||
void epoch_enter_preempt(epoch_t epoch, epoch_tracker_t et);
|
||||
|
||||
void epoch_exit(epoch_t epoch);
|
||||
void epoch_exit_preempt(epoch_t epoch, epoch_tracker_t et);
|
||||
|
||||
void epoch_wait(epoch_t epoch);
|
||||
@ -113,30 +115,5 @@ int _bsd_in_epoch(epoch_t epoch);
|
||||
#define in_epoch(epoch) _bsd_in_epoch(epoch)
|
||||
#define in_epoch_verbose(epoch, dump_onfail) _bsd_in_epoch(epoch)
|
||||
|
||||
#define EPOCH_GET_RECORD(cpu_self, epoch) PER_CPU_DATA_GET_BY_OFFSET( \
|
||||
cpu_self, struct epoch_record, epoch->e_pcpu_record_offset)
|
||||
|
||||
static __inline void
|
||||
epoch_enter(epoch_t epoch)
|
||||
{
|
||||
Per_CPU_Control *cpu_self;
|
||||
struct epoch_record *er;
|
||||
|
||||
cpu_self = _Thread_Dispatch_disable();
|
||||
er = EPOCH_GET_RECORD(cpu_self, epoch);
|
||||
ck_epoch_begin(&er->er_record, NULL);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
epoch_exit(epoch_t epoch)
|
||||
{
|
||||
Per_CPU_Control *cpu_self;
|
||||
struct epoch_record *er;
|
||||
|
||||
cpu_self = _Per_CPU_Get();
|
||||
er = EPOCH_GET_RECORD(cpu_self, epoch);
|
||||
ck_epoch_end(&er->er_record, NULL);
|
||||
_Thread_Dispatch_enable(cpu_self);
|
||||
}
|
||||
#endif /* _KERNEL */
|
||||
#endif /* _SYS_EPOCH_H_ */
|
||||
|
@ -42,9 +42,13 @@
|
||||
#include <rtems.h>
|
||||
#include <rtems/irq-extension.h>
|
||||
#include <rtems/score/smpimpl.h>
|
||||
#include <rtems/score/threaddispatch.h>
|
||||
#include <rtems/score/threadimpl.h>
|
||||
#include <rtems/score/watchdogimpl.h>
|
||||
|
||||
#define EPOCH_GET_RECORD(cpu_self, epoch) PER_CPU_DATA_GET_BY_OFFSET( \
|
||||
cpu_self, struct epoch_record, epoch->e_pcpu_record_offset)
|
||||
|
||||
EPOCH_DEFINE(_bsd_global_epoch_preempt, EPOCH_PREEMPT);
|
||||
|
||||
EPOCH_DEFINE(_bsd_global_epoch, 0);
|
||||
@ -175,6 +179,29 @@ epoch_sysinit(void)
|
||||
}
|
||||
SYSINIT(epoch, SI_SUB_TUNABLES, SI_ORDER_SECOND, epoch_sysinit, NULL);
|
||||
|
||||
void
|
||||
epoch_enter(epoch_t epoch)
|
||||
{
|
||||
Per_CPU_Control *cpu_self;
|
||||
struct epoch_record *er;
|
||||
|
||||
cpu_self = _Thread_Dispatch_disable();
|
||||
er = EPOCH_GET_RECORD(cpu_self, epoch);
|
||||
ck_epoch_begin(&er->er_record, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
epoch_exit(epoch_t epoch)
|
||||
{
|
||||
Per_CPU_Control *cpu_self;
|
||||
struct epoch_record *er;
|
||||
|
||||
cpu_self = _Per_CPU_Get();
|
||||
er = EPOCH_GET_RECORD(cpu_self, epoch);
|
||||
ck_epoch_end(&er->er_record, NULL);
|
||||
_Thread_Dispatch_enable(cpu_self);
|
||||
}
|
||||
|
||||
void
|
||||
epoch_enter_preempt(epoch_t epoch, epoch_tracker_t et)
|
||||
{
|
||||
@ -266,12 +293,16 @@ epoch_block_handler_preempt(struct ck_epoch *g __unused,
|
||||
{
|
||||
struct epoch_record *er;
|
||||
Per_CPU_Control *cpu_self;
|
||||
uint32_t cpu_self_index;
|
||||
struct epoch_tracker_mutex etm;
|
||||
#ifdef RTEMS_SMP
|
||||
uint32_t cpu_self_index;
|
||||
#endif
|
||||
|
||||
er = __containerof(cr, struct epoch_record, er_record);
|
||||
cpu_self = _Per_CPU_Get();
|
||||
#ifdef RTEMS_SMP
|
||||
cpu_self_index = _Per_CPU_Get_index(cpu_self);
|
||||
#endif
|
||||
|
||||
rtems_mutex_init(&etm.etm_mtx, "epoch");
|
||||
etm.etm_record = er;
|
||||
|
Loading…
x
Reference in New Issue
Block a user