[email protected] (12020-05-11): > From: Limin Wang <[email protected]> > > These are similar to the existing FF_ALLOC_ARRAY_OR_GOTO & > FF_ALLOCZ_ARRAY_OR_GOTO, > but the elsize is calcuated by sizeof(*p) > > Signed-off-by: Limin Wang <[email protected]> > --- > libavutil/internal.h | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/libavutil/internal.h b/libavutil/internal.h > index 4acbcf5..1be9001 100644 > --- a/libavutil/internal.h > +++ b/libavutil/internal.h > @@ -173,6 +173,24 @@ > }\ > } > > +#define FF_ALLOC_TYPED_ARRAY_OR_GOTO(ctx, p, nelem, label)\ > +{\ > + p = av_malloc_array(nelem, sizeof(*p));\ > + if (!p) {\ > + av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ > + goto label;\ > + }\ > +} > + > +#define FF_ALLOCZ_TYPED_ARRAY_OR_GOTO(ctx, p, nelem, label)\ > +{\ > + p = av_mallocz_array(nelem, sizeof(*p));\ > + if (!p) {\ > + av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ > + goto label;\ > + }\ > +} > + > #include "libm.h" > > /**
Please NO!
These functions have a terrible design, let us fix them before extending
them.
First design mistake: no error code. A helper function for testing
memory allocation failure where AVERROR(ENOMEM) does not appear is
absurd.
Second design mistake: printing a message. Return the error code, let
the caller print the error message.
Third design mistake: hard-coded use of goto.
Best design:
#define FF_ALLOC_ARRAY_OR_GOTO(p, nelem, elsize, ret, error)\
{\
p = av_malloc_array(nelem, elsize);\
if (!p) {\
ret = AVERROR(ENOMEM); \
error;
}\
}
Regards,
--
Nicolas George
signature.asc
Description: PGP signature
_______________________________________________ ffmpeg-devel mailing list [email protected] https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email [email protected] with subject "unsubscribe".
