From 6db395dc74f329e04dbe539495c1c34a9d2fdb89 Mon Sep 17 00:00:00 2001 From: Frediano Ziglio Date: Wed, 22 May 2019 13:42:21 +0100 Subject: [PATCH] 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 --- server/red-worker.h | 10 ++++++++++ server/stat.h | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/server/red-worker.h b/server/red-worker.h index 525359d1..7d3c8e05 100644 --- a/server/red-worker.h +++ b/server/red-worker.h @@ -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 { diff --git a/server/stat.h b/server/stat.h index 26b31460..477c1a4d 100644 --- a/server/stat.h +++ b/server/stat.h @@ -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,