diff --git a/include/common/config.h b/include/common/config.h index 3ab879fc5..f46764193 100644 --- a/include/common/config.h +++ b/include/common/config.h @@ -47,5 +47,18 @@ */ //#undef CONFIG_HAP_INLINE_FD_SET +/* CONFIG_HAP_DISABLE_REGPARM + * This disables the use of register parameters for some functions which + * use it by default to increase performance. + */ +#ifdef CONFIG_HAP_DISABLE_REGPARM +#define REGPRM1 +#define REGPRM2 +#define REGPRM3 +#else +#define REGPRM1 __attribute__((regparm(1))) +#define REGPRM2 __attribute__((regparm(2))) +#define REGPRM3 __attribute__((regparm(3))) +#endif #endif /* _COMMON_CONFIG_H */ diff --git a/include/common/time.h b/include/common/time.h index 7a68a1549..1546921e9 100644 --- a/include/common/time.h +++ b/include/common/time.h @@ -39,35 +39,35 @@ extern struct timeval start_date; /* the process's start date */ /* * adds ms to , set the result to and returns a pointer */ -struct timeval *tv_delayfrom(struct timeval *tv, const struct timeval *from, int ms); +REGPRM3 struct timeval *tv_delayfrom(struct timeval *tv, const struct timeval *from, int ms); /* * compares and modulo 1ms: returns 0 if equal, -1 if tv1 < tv2, 1 if tv1 > tv2 * Must not be used when either argument is eternity. Use tv_cmp2_ms() for that. */ -int tv_cmp_ms(const struct timeval *tv1, const struct timeval *tv2); +REGPRM2 int tv_cmp_ms(const struct timeval *tv1, const struct timeval *tv2); /* * compares and : returns 0 if equal, -1 if tv1 < tv2, 1 if tv1 > tv2, * considering that 0 is the eternity. */ -int tv_cmp2(const struct timeval *tv1, const struct timeval *tv2); +REGPRM2 int tv_cmp2(const struct timeval *tv1, const struct timeval *tv2); /* * compares and modulo 1 ms: returns 0 if equal, -1 if tv1 < tv2, 1 if tv1 > tv2, * considering that 0 is the eternity. */ -int tv_cmp2_ms(const struct timeval *tv1, const struct timeval *tv2); +REGPRM2 int tv_cmp2_ms(const struct timeval *tv1, const struct timeval *tv2); /* * returns the remaining time between tv1=now and event=tv2 * if tv2 is passed, 0 is returned. * Returns TIME_ETERNITY if tv2 is eternity. */ -unsigned long tv_remain2(const struct timeval *tv1, const struct timeval *tv2); +REGPRM2 unsigned long tv_remain2(const struct timeval *tv1, const struct timeval *tv2); /* sets to the current time */ -static inline struct timeval *tv_now(struct timeval *tv) +REGPRM1 static inline struct timeval *tv_now(struct timeval *tv) { if (tv) gettimeofday(tv, NULL); @@ -78,7 +78,7 @@ static inline struct timeval *tv_now(struct timeval *tv) * compares and : returns 0 if equal, -1 if tv1 < tv2, 1 if tv1 > tv2 * Must not be used when either argument is eternity. Use tv_cmp2() for that. */ -static inline int tv_cmp(const struct timeval *tv1, const struct timeval *tv2) +REGPRM2 static inline int tv_cmp(const struct timeval *tv1, const struct timeval *tv2) { if (tv1->tv_sec < tv2->tv_sec) return -1; @@ -96,7 +96,7 @@ static inline int tv_cmp(const struct timeval *tv1, const struct timeval *tv2) * returns the difference, in ms, between tv1 and tv2 * Must not be used when either argument is eternity. */ -static inline unsigned long tv_diff(const struct timeval *tv1, const struct timeval *tv2) +REGPRM2 static inline unsigned long tv_diff(const struct timeval *tv1, const struct timeval *tv2) { unsigned long ret; @@ -113,7 +113,7 @@ static inline unsigned long tv_diff(const struct timeval *tv1, const struct time * if tv2 is passed, 0 is returned. * Must not be used when either argument is eternity. */ -static inline unsigned long tv_remain(const struct timeval *tv1, const struct timeval *tv2) +REGPRM2 static inline unsigned long tv_remain(const struct timeval *tv1, const struct timeval *tv2) { unsigned long ret; @@ -133,7 +133,7 @@ static inline unsigned long tv_remain(const struct timeval *tv1, const struct ti * zeroes a struct timeval */ -static inline struct timeval *tv_eternity(struct timeval *tv) +REGPRM1 static inline struct timeval *tv_eternity(struct timeval *tv) { tv->tv_sec = tv->tv_usec = 0; return tv; @@ -142,7 +142,7 @@ static inline struct timeval *tv_eternity(struct timeval *tv) /* * returns 1 if tv is null, else 0 */ -static inline int tv_iseternity(const struct timeval *tv) +REGPRM1 static inline int tv_iseternity(const struct timeval *tv) { if (tv->tv_sec == 0 && tv->tv_usec == 0) return 1; @@ -154,7 +154,7 @@ static inline int tv_iseternity(const struct timeval *tv) * returns the first event between tv1 and tv2 into tvmin. * a zero tv is ignored. tvmin is returned. */ -static inline const struct timeval *tv_min(struct timeval *tvmin, +REGPRM3 static inline const struct timeval *tv_min(struct timeval *tvmin, const struct timeval *tv1, const struct timeval *tv2) { diff --git a/src/log.c b/src/log.c index 6af34644e..0711c030f 100644 --- a/src/log.c +++ b/src/log.c @@ -22,6 +22,7 @@ #include #include +#include #include #include diff --git a/src/time.c b/src/time.c index 025c87bb8..75f385ef8 100644 --- a/src/time.c +++ b/src/time.c @@ -21,7 +21,7 @@ struct timeval start_date; /* the process's start date */ /* * adds ms to , set the result to and returns a pointer */ -struct timeval *tv_delayfrom(struct timeval *tv, const struct timeval *from, int ms) +REGPRM3 struct timeval *tv_delayfrom(struct timeval *tv, const struct timeval *from, int ms) { if (!tv || !from) return NULL; @@ -38,7 +38,7 @@ struct timeval *tv_delayfrom(struct timeval *tv, const struct timeval *from, int * compares and modulo 1ms: returns 0 if equal, -1 if tv1 < tv2, 1 if tv1 > tv2 * Must not be used when either argument is eternity. Use tv_cmp2_ms() for that. */ -int tv_cmp_ms(const struct timeval *tv1, const struct timeval *tv2) +REGPRM2 int tv_cmp_ms(const struct timeval *tv1, const struct timeval *tv2) { if (tv1->tv_sec == tv2->tv_sec) { if (tv2->tv_usec >= tv1->tv_usec + 1000) @@ -62,7 +62,7 @@ int tv_cmp_ms(const struct timeval *tv1, const struct timeval *tv2) * compares and : returns 0 if equal, -1 if tv1 < tv2, 1 if tv1 > tv2, * considering that 0 is the eternity. */ -int tv_cmp2(const struct timeval *tv1, const struct timeval *tv2) +REGPRM2 int tv_cmp2(const struct timeval *tv1, const struct timeval *tv2) { if (tv_iseternity(tv1)) if (tv_iseternity(tv2)) @@ -88,7 +88,7 @@ int tv_cmp2(const struct timeval *tv1, const struct timeval *tv2) * compares and modulo 1 ms: returns 0 if equal, -1 if tv1 < tv2, 1 if tv1 > tv2, * considering that 0 is the eternity. */ -int tv_cmp2_ms(const struct timeval *tv1, const struct timeval *tv2) +REGPRM2 int tv_cmp2_ms(const struct timeval *tv1, const struct timeval *tv2) { if (tv_iseternity(tv1)) if (tv_iseternity(tv2)) @@ -121,7 +121,7 @@ int tv_cmp2_ms(const struct timeval *tv1, const struct timeval *tv2) * if tv2 is passed, 0 is returned. * Returns TIME_ETERNITY if tv2 is eternity. */ -unsigned long tv_remain2(const struct timeval *tv1, const struct timeval *tv2) +REGPRM2 unsigned long tv_remain2(const struct timeval *tv1, const struct timeval *tv2) { unsigned long ret; @@ -144,7 +144,7 @@ unsigned long tv_remain2(const struct timeval *tv1, const struct timeval *tv2) * returns the absolute difference, in ms, between tv1 and tv2 * Must not be used when either argument is eternity. */ -unsigned long tv_delta(const struct timeval *tv1, const struct timeval *tv2) +REGPRM2 unsigned long tv_delta(const struct timeval *tv1, const struct timeval *tv2) { int cmp; unsigned long ret;