[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: An optimization for another day (and developer)

At 07:05 AM 2001-12-28, Pierangelo Masarati wrote:
>> BTW, one optimization I intended to implement but haven't
>> the time is to allow:
>>       struct berval bv = { 0, NULL }
>>       struct berval *bvp = &bv;
>>       rc = dnPretty( NULL, &dn, &bvp );
>>       rc = dnNormalize( NULL, &dn, &bvp );
>> That is, allow call to provide, optionally, a
>> pre-allocated struct berval instead of relying
>> on the caller to malloc on up.  Of course, in
>> some cases, the existing behavior is preferred.
>I note that relying on developers (I speak mostly of myself :)
>to supply a NULL pointer if alloc is required or non-NULL pointer
>if it can be safely used is dangerous: no more than five minutes
>ago I fixed this bug in back-monitor.  I'd rather use a alloc/use
>flag in an ancillary function, or radically change the API
>to accept only pre-allocated structs, which wouldn't be a big issue 
>since the big allocation takes place for the bv_val, not for the 
>struct berval.

Yes, that's a consideration.  One approach is to have two
prototypes, one expecting a struct berval *, the other a
struct berval **... with the latter being a wrapper which
did the allocation before calling the former...

>Of course, by using appropriate safety checks and tools your
>suggestion would provide an interesting optimization.

I would (if done the way I originally intended) replace the
assert( *bvp == NULL ) in the current code with:
  if (*bvp) assert( (*bvp)->bv_len == 0 && (*bvp)->bv_val == NULL );

This will catch (at run time) many abuses.