[vlc-devel] RFC: type-punning between (future) vlc_frame_t and vlc_data_t

Rémi Denis-Courmont remi at remlab.net
Fri Apr 26 12:37:37 CEST 2019


The problem exists for all pointers - start, buf and next.

Le 26 avril 2019 12:10:13 GMT+03:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>
>
>On Fri, Apr 26, 2019, at 10:57, Rémi Denis-Courmont wrote:
>> Hi,
>> 
>> The respective structure layouts will in practice match in any
>real-life ABI, so accessing the scalar members will work.
>> 
>> Whether it works for the pointer values though... In my
>understanding, that is an open area of academic research on programming
>language. In other words, people do not know and we cannot rely on
>compilers to get this right until (maybe) a future version of ISO C
>clarifies it.
>
>So, for p_next, it is safer to always use a data pointer and use
>container_of to get the frame pointer, right ?
>
>> If you are bored, search for articles on C pointer provenance.
>
>
>> 
>> Le 26 avril 2019 10:47:37 GMT+03:00, Thomas Guillem <thomas at gllm.fr>
>a écrit :
>>> Question following my remark on the "[PATCH 00/17] RFC Split block_t
>into 2 different data containers" thread:
>>> 
>>>  "- Code duplication between data.c and frame.c and also between
>data_helper.h and frame_helper.h: This code is far from trivial and
>should not be duplicated. We don't want to fix 2 files each time we
>need to fix a bug. The only way I see to solve this issue is to include
>vlc_data_t from vlc_frame_t and have generic vlc_data_t functions
>working with vlc_frame_t."
>>> 
>>> I wonder if it is possible to include vlc_data_t from vlc_frame_t
>without renaming all variables (in order to avoid a
>s/frame->p_buffer/frame->data.p_buffer/ change). Actually, it is
>possible in C by using anonymous unions and structs but is it allowed ?
>>> 
>>> cf.
>https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Type-punning
>>> 
>>> PS:  ISO C++ prohibits anonymous structs so we will have to rename
>all C++ code that touch vlc_frame_t
>>> 
>>> Here is a sample to show what I would to do in VLC:
>>> 
>>> #include <stdlib.h>
>>> #include <stdio.h>
>>> #include <assert.h>
>>> #include <stdint.h>
>>> #include <inttypes.h>
>>> 
>>> #define DATA_MEMBERS \
>>>     uint8_t *buf; \
>>>     size_t size; \
>>>     size_t maxsize; \
>>>     void *start; \
>>> 
>>> struct data {
>>>     DATA_MEMBERS
>>>     struct data *next;
>>> };
>>> 
>>> struct frame
>>> {
>>>     union
>>>     {
>>>         struct data d;
>>> #ifndef __cplusplus
>>>         /* ISO C++ prohibits anonymous structs*/
>>>         struct {
>>>             DATA_MEMBERS
>>>             struct frame *next;
>>>         };
>>> #endif
>>>     };
>>> 
>>>     int64_t pts;
>>>     int64_t dts;
>>> };
>>> 
>>> 
>>> static void data_do_something(struct data *data)
>>> {
>>>     data->buf += 10;
>>>     data->size -= 10;
>>> }
>>> 
>>> static inline void frame_do_something(struct frame *frame)
>>> {
>>>     data_do_something(&frame->d);
>>> }
>>> 
>>> static void frame_do_specific_thing(struct frame *frame)
>>> {
>>>     frame->buf -= 10;
>>>     frame->size += 10;
>>> }
>>> 
>>> static void frame_print(struct frame *frame)
>>> {
>>>     fprintf(stderr, "frame: data: %p %zu/%zu vs "
>>>             "%p %zu/%zu, pts: %" PRId64 "\n",
>>>             frame->d.buf, frame->d.size, frame->d.maxsize,
>>>             frame->buf, frame->size, frame->maxsize, frame->pts);
>>> }
>>> 
>>> 
>>> int main(void)
>>> {
>>>     struct frame frame;
>>>     frame.d.size = frame.d.maxsize = 42;
>>>     frame.d.start = malloc(frame.d.size);
>>>     frame.d.buf = (uint8_t *) frame.d.start;
>>>     frame.d.next = NULL;
>>>     assert(frame.d.buf);
>>>     frame.pts = frame.dts = 72;
>>> 
>>>     frame_print(&frame);
>>>     frame_do_something(&frame);
>>>     frame_print(&frame);
>>>     frame_do_specific_thing(&frame);
>>>     frame_print(&frame);
>>> 
>>>     frame.next = &frame;
>>>     frame.d.next = &frame.d;
>>> 
>>>     free(frame.d.start);
>>>     return 0;
>>> }vlc-devel mailing list
>>> To unsubscribe or modify your subscription options:
>>> https://mailman.videolan.org/listinfo/vlc-devel
>> 
>> -- 
>> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez
>excuser ma brièveté. 
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel

-- 
Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20190426/19091570/attachment.html>


More information about the vlc-devel mailing list