From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> To: ffmpeg-devel@ffmpeg.org Subject: Re: [FFmpeg-devel] [PATCH 01/21] avformat/avio: Don't use incompatible function pointer type for call Date: Sun, 10 Sep 2023 20:23:16 +0200 Message-ID: <AS8P250MB07441016F9EBBB2EF29FD1BB8FF3A@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM> (raw) In-Reply-To: <eee01749-c4e5-3210-e11f-dbba2ec62b3@passwd.hu> Marton Balint: > > > On Sun, 10 Sep 2023, Andreas Rheinhardt wrote: > >> Marton Balint: >>> >>> >>> On Sat, 9 Sep 2023, Tomas Härdin wrote: >>> >>>> fre 2023-09-08 klockan 22:38 +0200 skrev Marton Balint: >>>>> >>>>> >>>>> On Thu, 7 Sep 2023, Andreas Rheinhardt wrote: >>>>> >>>>> > It is undefined behaviour even in cases where it works >>>>> > (it works because it is only a const uint8_t* vs. uint8_t* >>>>> > difference). >>>>> > > Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> >>>>> > --- >>>>> > libavformat/avio.c | 25 ++++++++++++++++--------- >>>>> > 1 file changed, 16 insertions(+), 9 deletions(-) >>>>> > > diff --git a/libavformat/avio.c b/libavformat/avio.c >>>>> > index ab1c19a58d..d53da5cb0c 100644 >>>>> > --- a/libavformat/avio.c >>>>> > +++ b/libavformat/avio.c >>>>> > @@ -354,10 +354,15 @@ fail: >>>>> > } >>>>> > > static inline int retry_transfer_wrapper(URLContext *h, uint8_t >>>>> > *buf, >>>>> > + const uint8_t *cbuf, >>>>> > int size, int size_min, >>>>> > - int >>>>> > (*transfer_func)(URLContext *h, >>>>> > - >>>>> > uint8_t *buf, >>>>> > - int >>>>> > size)) >>>>> > + int >>>>> > (*read_func)(URLContext *h, >>>>> > + uint8_t >>>>> > *buf, >>>>> > + int >>>>> > size), >>>>> > + int >>>>> > (*write_func)(URLContext *h, >>>>> > + const >>>>> > uint8_t *buf, >>>>> > + int >>>>> > size), >>>>> > + int read) >>>>> >>>>> These extra parameters are very ugly, can't we think of another way >>>>> to properly support this? >>>>> >>>>> One idea is putting retry_transfer_wrapper in a template file and >>>>> include it twice with proper defines-s for the read and write >>>>> flavours. >>>> >>>> Seems like a lot of work for a function that's internal to avio.c >>> >>> If future extensibility is not important here then function pointers >>> should not be passed to retry_tranfer_wrapper because >>> h->prot->url_read/write can be used directly. And usage of buf/cbuf is >>> readundant with the read paramter, because by checking if buf or cbuf is >>> null you can decide the operation (read of write). >>> >> >> The compiler does not know whether buf given to >> ffurl_(read|write|read_complete) is NULL or not in the first place (it >> also does not know whether the url_read and url_write function pointers >> are NULL or not); therefore if one use e.g. cbuf != NULL as meaning read >> == 0, then the write function would actually check for whether cbuf is >> NULL which is worse than it is now. >> (My initial version (not sent to this list) checked for whether the read >> function was NULL in order to determine whether we are reading or >> writing; the assumption was that the compiler would optimize the check >> away when reading, because if the read function were NULL, then a NULL >> function pointer would be used for a call, which is undefined behaviour. >> But it didn't. Instead it added ffurl_read.cold and >> ffurl_read_complete.cold functions (which presumably abort or so) for >> this case.) > > Maybe this could work to make the compiler optimize away the undeeded one: > > if (buf && !cbuf) > write(); > if (!buf && cbuf) > read(); > I don't get how this would help (apart from the fact that you switched write and read): The compiler knows that cbuf is NULL for reading, which means it can optimize away the second if, but it doesn't know whether buf is NULL and therefore will add an explicit (and unnecessary) check in the first if. So this is worse code. And apart from that, such a version would also rely on passing buf and cbuf and (potentially) the callbacks; I consider this worse and more obscure than a simple read parameter. > But v2 is also fine, use whichever you prefer. > Will do as soon as Tomas ok's this version. - Andreas _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2023-09-10 18:22 UTC|newest] Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-09-07 0:23 Andreas Rheinhardt 2023-09-07 0:32 ` [FFmpeg-devel] [PATCH 02/21] avformat/internal: Avoid casting const away Andreas Rheinhardt 2023-09-09 6:38 ` Tomas Härdin 2023-09-07 0:32 ` [FFmpeg-devel] [PATCH 03/21] avformat/aviobuf: Don't use incompatible function pointer type for call Andreas Rheinhardt 2023-09-09 6:46 ` Tomas Härdin 2023-09-09 9:25 ` Andreas Rheinhardt 2023-09-08 20:38 ` [FFmpeg-devel] [PATCH 01/21] avformat/avio: " Marton Balint 2023-09-09 6:37 ` Tomas Härdin 2023-09-10 8:47 ` Marton Balint 2023-09-10 9:02 ` Andreas Rheinhardt 2023-09-10 18:07 ` Marton Balint 2023-09-10 18:23 ` Andreas Rheinhardt [this message] 2023-09-11 17:27 ` [FFmpeg-devel] [PATCH v3] " Andreas Rheinhardt 2023-09-11 18:43 ` Marton Balint 2023-09-12 14:59 ` Andreas Rheinhardt 2023-09-10 10:07 ` [FFmpeg-devel] [PATCH v2] " Andreas Rheinhardt 2023-09-11 16:53 ` Tomas Härdin 2023-09-09 6:36 ` [FFmpeg-devel] [PATCH 01/21] " Tomas Härdin 2023-09-10 10:18 ` Andreas Rheinhardt
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=AS8P250MB07441016F9EBBB2EF29FD1BB8FF3A@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM \ --to=andreas.rheinhardt@outlook.com \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git