~mmach/netext73/mesa-ryzen

« back to all changes in this revision

Viewing changes to src/mapi/shared-glapi/stub.c

  • Committer: mmach
  • Date: 2023-11-02 21:31:35 UTC
  • Revision ID: netbit73@gmail.com-20231102213135-18d4tzh7tj0uz752
2023-11-02 22:11:57

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
 
40
40
 
41
41
struct mapi_stub {
42
 
   const void *name;
 
42
   size_t name_offset;
43
43
   int slot;
44
 
   mapi_func addr;
45
44
};
46
45
 
47
46
/* define public_string_pool and public_stubs */
48
47
#define MAPI_TMP_PUBLIC_STUBS
49
48
#include "mapi_tmp.h"
50
49
 
51
 
static struct mapi_stub dynamic_stubs[MAPI_TABLE_NUM_DYNAMIC];
52
 
static int num_dynamic_stubs;
53
 
static int next_dynamic_slot = MAPI_TABLE_NUM_STATIC;
54
 
 
55
50
void
56
51
stub_init_once(void)
57
52
{
66
61
   const struct mapi_stub *stub = (const struct mapi_stub *) elem;
67
62
   const char *stub_name;
68
63
 
69
 
   stub_name = &public_string_pool[(size_t) stub->name];
 
64
   stub_name = &public_string_pool[stub->name_offset];
70
65
 
71
66
   return strcmp(name, stub_name);
72
67
}
81
76
         ARRAY_SIZE(public_stubs), sizeof(public_stubs[0]), stub_compare);
82
77
}
83
78
 
84
 
/**
85
 
 * Add a dynamic stub.
86
 
 */
87
 
static struct mapi_stub *
88
 
stub_add_dynamic(const char *name)
89
 
{
90
 
   struct mapi_stub *stub;
91
 
   int idx;
92
 
 
93
 
   idx = num_dynamic_stubs;
94
 
   /* minus 1 to make sure we can never reach the last slot */
95
 
   if (idx >= MAPI_TABLE_NUM_DYNAMIC - 1)
96
 
      return NULL;
97
 
 
98
 
   stub = &dynamic_stubs[idx];
99
 
 
100
 
   /* dispatch to the last slot, which is reserved for no-op */
101
 
   stub->addr = entry_generate(
102
 
         MAPI_TABLE_NUM_STATIC + MAPI_TABLE_NUM_DYNAMIC - 1);
103
 
   if (!stub->addr)
104
 
      return NULL;
105
 
 
106
 
   stub->name = (const void *) strdup(name);
107
 
   /* to be fixed later */
108
 
   stub->slot = -1;
109
 
 
110
 
   num_dynamic_stubs = idx + 1;
111
 
 
112
 
   return stub;
113
 
}
114
 
 
115
 
/**
116
 
 * Return the dynamic stub with the given name.  If no such stub exists and
117
 
 * generate is true, a new stub is generated.
118
 
 */
119
 
struct mapi_stub *
120
 
stub_find_dynamic(const char *name, int generate)
121
 
{
122
 
   static simple_mtx_t dynamic_mutex = SIMPLE_MTX_INITIALIZER;
123
 
   struct mapi_stub *stub = NULL;
124
 
   int count, i;
125
 
 
126
 
   simple_mtx_lock(&dynamic_mutex);
127
 
 
128
 
   if (generate)
129
 
      assert(!stub_find_public(name));
130
 
 
131
 
   count = num_dynamic_stubs;
132
 
   for (i = 0; i < count; i++) {
133
 
      if (strcmp(name, (const char *) dynamic_stubs[i].name) == 0) {
134
 
         stub = &dynamic_stubs[i];
135
 
         break;
136
 
      }
137
 
   }
138
 
 
139
 
   /* generate a dynamic stub */
140
 
   if (generate && !stub)
141
 
         stub = stub_add_dynamic(name);
142
 
 
143
 
   simple_mtx_unlock(&dynamic_mutex);
144
 
 
145
 
   return stub;
146
 
}
147
79
 
148
80
static const struct mapi_stub *
149
81
search_table_by_slot(const struct mapi_stub *table, size_t num_entries,
162
94
{
163
95
   const struct mapi_stub *stub =
164
96
      search_table_by_slot(public_stubs, ARRAY_SIZE(public_stubs), slot);
165
 
   if (stub)
166
 
      return stub;
167
 
   return search_table_by_slot(dynamic_stubs, num_dynamic_stubs, slot);
168
 
}
169
 
 
170
 
void
171
 
stub_fix_dynamic(struct mapi_stub *stub, const struct mapi_stub *alias)
172
 
{
173
 
   int slot;
174
 
 
175
 
   if (stub->slot >= 0)
176
 
      return;
177
 
 
178
 
   if (alias)
179
 
      slot = alias->slot;
180
 
   else
181
 
      slot = next_dynamic_slot++;
182
 
 
183
 
   entry_patch(stub->addr, slot);
184
 
   stub->slot = slot;
 
97
   return stub;
185
98
}
186
99
 
187
100
/**
190
103
const char *
191
104
stub_get_name(const struct mapi_stub *stub)
192
105
{
193
 
   const char *name;
194
 
 
195
 
   if (stub >= public_stubs &&
196
 
       stub < public_stubs + ARRAY_SIZE(public_stubs))
197
 
      name = &public_string_pool[(size_t) stub->name];
198
 
   else
199
 
      name = (const char *) stub->name;
200
 
 
201
 
   return name;
 
106
   return &public_string_pool[stub->name_offset];
202
107
}
203
108
 
204
109
/**
216
121
mapi_func
217
122
stub_get_addr(const struct mapi_stub *stub)
218
123
{
219
 
   assert(stub->addr || (unsigned int) stub->slot < MAPI_TABLE_NUM_STATIC);
220
 
   return (stub->addr) ? stub->addr : entry_get_public(stub->slot);
 
124
   return entry_get_public(stub->slot);
221
125
}