Make sure empty structure are ABI compatible

Empty structure are not really portable however adding
an zero size array seems to be the way to have a zero
size structure portably.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
This commit is contained in:
Frediano Ziglio 2019-05-22 13:42:21 +01:00 committed by Frediano Ziglio
parent 2f7474427b
commit 6db395dc74
2 changed files with 14 additions and 0 deletions

View File

@ -133,6 +133,7 @@ typedef struct RedWorkerMessageDelMemslot {
} RedWorkerMessageDelMemslot;
typedef struct RedWorkerMessageDestroySurfaces {
uint8_t dummy_empty_field[0]; // C/C++ compatibility
} RedWorkerMessageDestroySurfaces;
typedef struct RedWorkerMessageDestroySurfacesAsync {
@ -161,18 +162,23 @@ typedef struct RedWorkerMessageCreatePrimarySurface {
} RedWorkerMessageCreatePrimarySurface;
typedef struct RedWorkerMessageResetImageCache {
uint8_t dummy_empty_field[0]; // C/C++ compatibility
} RedWorkerMessageResetImageCache;
typedef struct RedWorkerMessageResetCursor {
uint8_t dummy_empty_field[0]; // C/C++ compatibility
} RedWorkerMessageResetCursor;
typedef struct RedWorkerMessageWakeup {
uint8_t dummy_empty_field[0]; // C/C++ compatibility
} RedWorkerMessageWakeup;
typedef struct RedWorkerMessageOom {
uint8_t dummy_empty_field[0]; // C/C++ compatibility
} RedWorkerMessageOom;
typedef struct RedWorkerMessageStart {
uint8_t dummy_empty_field[0]; // C/C++ compatibility
} RedWorkerMessageStart;
typedef struct RedWorkerMessageFlushSurfacesAsync {
@ -180,6 +186,7 @@ typedef struct RedWorkerMessageFlushSurfacesAsync {
} RedWorkerMessageFlushSurfacesAsync;
typedef struct RedWorkerMessageStop {
uint8_t dummy_empty_field[0]; // C/C++ compatibility
} RedWorkerMessageStop;
/* this command is sync, so it's ok to pass a pointer */
@ -224,12 +231,15 @@ typedef struct RedWorkerMessageMonitorsConfigAsync {
} RedWorkerMessageMonitorsConfigAsync;
typedef struct RedWorkerMessageDriverUnload {
uint8_t dummy_empty_field[0]; // C/C++ compatibility
} RedWorkerMessageDriverUnload;
typedef struct RedWorkerMessageGlScanout {
uint8_t dummy_empty_field[0]; // C/C++ compatibility
} RedWorkerMessageGlScanout;
typedef struct RedWorkerMessageClose {
uint8_t dummy_empty_field[0]; // C/C++ compatibility
} RedWorkerMessageClose;
typedef struct RedWorkerMessageGlDraw {

View File

@ -30,12 +30,14 @@ typedef struct {
#ifdef RED_STATISTICS
uint64_t *counter;
#endif
uint8_t dummy_empty_field[0]; /* C/C++ compatibility */
} RedStatCounter;
typedef struct {
#ifdef RED_STATISTICS
uint32_t ref;
#endif
uint8_t dummy_empty_field[0]; /* C/C++ compatibility */
} RedStatNode;
#ifdef RED_STATISTICS
@ -95,6 +97,7 @@ typedef struct {
#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT)
stat_time_t time;
#endif
uint8_t dummy_empty_field[0]; /* C/C++ compatibility */
} stat_start_time_t;
#if defined(RED_WORKER_STAT) || defined(COMPRESS_STAT)
@ -117,6 +120,7 @@ typedef struct {
uint64_t comp_size;
#endif
#endif
uint8_t dummy_empty_field[0]; /* C/C++ compatibility */
} stat_info_t;
static inline void stat_start_time_init(G_GNUC_UNUSED stat_start_time_t *tm,