This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: reent.h


Artem B. Bityuckiy wrote:
Hello Newlib people!

Please, see newlib/libc/include/sys/reent.h.

The following is fragment from this file:
---------------------------------------------------------------------------------------


#else /* !_REENT_SMALL */

struct _reent
{
  int _errno;                   /* local copy of errno */

/* FILE is a big struct and may change over time. To try to achieve binary
compatibility with future versions, put stdin,stdout,stderr here.
These are pointers into member __sf defined below. */
__FILE *_stdin, *_stdout, *_stderr;


  int  _inc;                    /* used by tmpnam */
  char _emergency[_REENT_EMERGENCY_SIZE];

  int _current_category;        /* used by setlocale */
  _CONST char *_current_locale;

int __sdidinit; /* 1 means stdio has been init'd */

void _EXFUN((*__cleanup),(struct _reent *));

  /* used by mprec routines */
  struct _Bigint *_result;
  int _result_k;
  struct _Bigint *_p5s;
  struct _Bigint **_freelist;

  /* used by some fp conversion routines */
  int _cvtlen;                  /* should be size_t */
  char *_cvtbuf;

  union
    {
      struct
        {
          unsigned int _unused_rand;
          char * _strtok_last;
          char _asctime_buf[_REENT_ASCTIME_SIZE];
          struct __tm _localtime_buf;
          int _gamma_signgam;
          __extension__ unsigned long long _rand_next;
          struct _rand48 _r48;
          _mbstate_t _mblen_state;
          _mbstate_t _mbtowc_state;
          _mbstate_t _wctomb_state;
          char _l64a_buf[8];
          char _signal_buf[_REENT_SIGNAL_SIZE];
          int _getdate_err;
          _mbstate_t _mbrlen_state;
          _mbstate_t _mbrtowc_state;
          _mbstate_t _mbsrtowcs_state;
          _mbstate_t _wcrtomb_state;
          _mbstate_t _wcsrtombs_state;
        } _reent;
  /* Two next two fields were once used by malloc.  They are no longer
     used. They are used to preserve the space used before so as to
     allow addition of new reent fields and keep binary compatibility.   */
      struct
        {
#define _N_LISTS 30
          unsigned char * _nextf[_N_LISTS];
          unsigned int _nmalloc[_N_LISTS];
        } _unused;
    } _new;

/* atexit stuff */
struct _atexit *_atexit; /* points to head of LIFO stack */
struct _atexit _atexit0; /* one guaranteed table, required by ANSI */


  /* signal info */
  void (**(_sig_func))(int);

--------------------------------------------------------------------------------------------


I'm interesting in "Two next two fields were once used by malloc. They are no ..." comment.


1. Does Newlib really take care about binary compatibility?

In this particular case, care was taken to see that the entire library didn't require recompiling everytime a new reentrancy field was added. Newlib hasn't got proper dependency statements in its make files so moving all the reentrancy fields around requires almost a complete rebuild; the makefiles do not catch this. At the time, the old malloc area was still in place but not being used so the first change started to reclaim the area with the union.


2. I want to add new fields to struct _reent. Do I need to add these fields to _reent field of _new union to support binary compatibility? May I not to care about binary compatibility and have no problems during future contributions to Newlib?

Add them there in the non-reent-small case for the reason explained above.


3. In case of REENT_SMALL defined there is no reserved space in struct _reent. Should I use struct misc_reent * ?


Yes, unless the new variables naturally belong with some of the other groupings. Remember to change the initialization code too.


-- Jeff J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]