diff mbox series

[FFmpeg-devel,5/5] avutil/tx_template: Move function pointers to const memory

Message ID AS8P250MB0744DF70DF80AEA5896DF0598F2C9@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM
State Accepted
Headers show
Series [FFmpeg-devel,1/5] avformat/argo_cvg: Mark overrides as const | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Andreas Rheinhardt Oct. 22, 2022, 1:59 p.m. UTC
This can be achieved by moving the AVOnce out of the structure
containing the function pointers; the latter can then be made
const.
This also has the advantage of eliminating padding in the structure
(sizeof(AVOnce) is four here) and allowing the AVOnces to be put
into .bss (dependening upon the implementation).

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavutil/tx_template.c | 47 +++++++++++++++++++++++------------------
 1 file changed, 26 insertions(+), 21 deletions(-)
diff mbox series

Patch

diff --git a/libavutil/tx_template.c b/libavutil/tx_template.c
index c15dc2ea27..56e9a6aa98 100644
--- a/libavutil/tx_template.c
+++ b/libavutil/tx_template.c
@@ -55,16 +55,10 @@  TABLE_DEF(53, 12);
 TABLE_DEF( 7,  6);
 TABLE_DEF( 9,  8);
 
-typedef struct FFSRTabsInitOnce {
+typedef struct FFSRTabsInitData {
     void (*func)(void);
-    AVOnce control;
-} FFSRTabsInitOnce;
-
-typedef struct FFSRTabsInitOnceExt {
-    void (*func)(void);
-    AVOnce control;
     int factors[TX_MAX_SUB]; /* Must be sorted high -> low */
-} FFSRTabsInitOnceExt;
+} FFSRTabsInitData;
 
 #define SR_TABLE(len)                                              \
 static av_cold void TX_TAB(ff_tx_init_tab_ ##len)(void)            \
@@ -80,9 +74,14 @@  static av_cold void TX_TAB(ff_tx_init_tab_ ##len)(void)            \
 SR_POW2_TABLES
 #undef SR_TABLE
 
-static FFSRTabsInitOnce sr_tabs_init_once[] = {
-#define SR_TABLE(len) \
-    { TX_TAB(ff_tx_init_tab_ ## len), AV_ONCE_INIT },
+static void (*const sr_tabs_init_funcs[])(void) = {
+#define SR_TABLE(len) TX_TAB(ff_tx_init_tab_ ##len),
+    SR_POW2_TABLES
+#undef SR_TABLE
+};
+
+static AVOnce sr_tabs_init_once[] = {
+#define SR_TABLE(len) AV_ONCE_INIT,
     SR_POW2_TABLES
 #undef SR_TABLE
 };
@@ -128,10 +127,16 @@  static av_cold void TX_TAB(ff_tx_init_tab_9)(void)
     TX_TAB(ff_tx_tab_9)[7] = TX_TAB(ff_tx_tab_9)[3] - TX_TAB(ff_tx_tab_9)[4];
 }
 
-static FFSRTabsInitOnceExt nptwo_tabs_init_once[] = {
-    { TX_TAB(ff_tx_init_tab_53),      AV_ONCE_INIT, { 15, 5, 3 } },
-    { TX_TAB(ff_tx_init_tab_9),       AV_ONCE_INIT, {  9 }       },
-    { TX_TAB(ff_tx_init_tab_7),       AV_ONCE_INIT, {  7 }       },
+static const FFSRTabsInitData nptwo_tabs_init_data[] = {
+    { TX_TAB(ff_tx_init_tab_53),      { 15, 5, 3 } },
+    { TX_TAB(ff_tx_init_tab_9),       {  9 }       },
+    { TX_TAB(ff_tx_init_tab_7),       {  7 }       },
+};
+
+static AVOnce nptwo_tabs_init_once[] = {
+    AV_ONCE_INIT,
+    AV_ONCE_INIT,
+    AV_ONCE_INIT,
 };
 
 av_cold void TX_TAB(ff_tx_init_tabs)(int len)
@@ -140,23 +145,23 @@  av_cold void TX_TAB(ff_tx_init_tabs)(int len)
     if (factor_2) {
         int idx = factor_2 - 3;
         for (int i = 0; i <= idx; i++)
-            ff_thread_once(&sr_tabs_init_once[i].control,
-                            sr_tabs_init_once[i].func);
+            ff_thread_once(&sr_tabs_init_once[i],
+                            sr_tabs_init_funcs[i]);
         len >>= factor_2;
     }
 
-    for (int i = 0; i < FF_ARRAY_ELEMS(nptwo_tabs_init_once); i++) {
+    for (int i = 0; i < FF_ARRAY_ELEMS(nptwo_tabs_init_data); i++) {
         int f, f_idx = 0;
 
         if (len <= 1)
             return;
 
-        while ((f = nptwo_tabs_init_once[i].factors[f_idx++])) {
+        while ((f = nptwo_tabs_init_data[i].factors[f_idx++])) {
             if (f % len)
                 continue;
 
-            ff_thread_once(&nptwo_tabs_init_once[i].control,
-                            nptwo_tabs_init_once[i].func);
+            ff_thread_once(&nptwo_tabs_init_once[i],
+                            nptwo_tabs_init_data[i].func);
             len /= f;
             break;
         }