Use weak functions in the RTEMS core?

Sebastian Huber sebastian.huber at embedded-brains.de
Wed Apr 8 08:16:46 UTC 2020


Hello,

weak functions are already used in several places in RTEMS, but not in 
RTEMS core components. In <rtems/score/basedefs.h> we have currently 
only a RTEMS_WEAK_ALIAS() macro:

testsuites/sptests/spmisc01/init.c:int weak_alias_func(void) 
RTEMS_WEAK_ALIAS(noinline_func);
cpukit/libfs/src/defaults/default_mmap.c:) RTEMS_WEAK_ALIAS( 
rtems_filesystem_default_mmap );
cpukit/libfs/src/defaults/default_poll.c:) RTEMS_WEAK_ALIAS( 
rtems_filesystem_default_poll );
cpukit/libfs/src/defaults/default_kqfilter.c:) RTEMS_WEAK_ALIAS( 
rtems_filesystem_default_kqfilter );
cpukit/include/rtems/score/basedefs.h:  #define RTEMS_WEAK_ALIAS( 
_target ) __attribute__((__weak__, __alias__(#_target)))
cpukit/include/rtems/score/basedefs.h:  #define RTEMS_WEAK_ALIAS( _target )

It was introduced to allow libbsd to override implementations.

I would like to use weak functions in two places. Firstly, the thread 
creation which has a dependency on thread deletion. Secondly, the C 
Program Heap allocation which has a dependency on deallocation (free). 
These dependencies could be satisfied by weak default implementations 
which do nothing. In case the application actually deletes threads or 
deallocates memory, then the dependencies can be satisfy by a strong 
implementation which actually performs the necessary work.

An alternative to weak functions would be to use a global function 
pointer which is initialized to the default implementation (or NULL). In 
case the application actually deletes threads or deallocates memory, 
then a system initialization handler could set the function pointer to 
the proper implementations.

What do you think about adding this to basedefs.h?


/**
  * @brief Instructs the compiler to define a weak function.
  *
  * Use this attribute for function definitions.  Do not use it for function
  * declarations.
  */
#if defined(__GNUC__)
   #define RTEMS_WEAK __attribute__((__weak__))
#else
   #define RTEMS_WEAK
#endif




More information about the devel mailing list