il2cpp-class-internals.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. #pragma once
  2. #include "il2cpp-config.h"
  3. #include <stdint.h>
  4. #include "il2cpp-runtime-metadata.h"
  5. #include "il2cpp-metadata.h"
  6. #define IL2CPP_CLASS_IS_ARRAY(c) ((c)->rank)
  7. struct Il2CppClass;
  8. struct Il2CppGuid;
  9. struct Il2CppImage;
  10. struct Il2CppAssembly;
  11. struct Il2CppAppDomain;
  12. struct Il2CppAppDomainSetup;
  13. struct Il2CppDelegate;
  14. struct Il2CppAppContext;
  15. struct Il2CppNameToTypeDefinitionIndexHashTable;
  16. #if RUNTIME_MONO
  17. extern "C"
  18. {
  19. #include <mono/metadata/metadata.h>
  20. }
  21. #endif
  22. struct VirtualInvokeData
  23. {
  24. Il2CppMethodPointer methodPtr;
  25. #if RUNTIME_MONO
  26. const MonoMethod* method;
  27. #else
  28. const MethodInfo* method;
  29. #endif
  30. };
  31. enum Il2CppTypeNameFormat
  32. {
  33. IL2CPP_TYPE_NAME_FORMAT_IL,
  34. IL2CPP_TYPE_NAME_FORMAT_REFLECTION,
  35. IL2CPP_TYPE_NAME_FORMAT_FULL_NAME,
  36. IL2CPP_TYPE_NAME_FORMAT_ASSEMBLY_QUALIFIED
  37. };
  38. extern bool g_il2cpp_is_fully_initialized;
  39. typedef struct
  40. {
  41. Il2CppImage *corlib;
  42. Il2CppClass *object_class;
  43. Il2CppClass *byte_class;
  44. Il2CppClass *void_class;
  45. Il2CppClass *boolean_class;
  46. Il2CppClass *sbyte_class;
  47. Il2CppClass *int16_class;
  48. Il2CppClass *uint16_class;
  49. Il2CppClass *int32_class;
  50. Il2CppClass *uint32_class;
  51. Il2CppClass *int_class;
  52. Il2CppClass *uint_class;
  53. Il2CppClass *int64_class;
  54. Il2CppClass *uint64_class;
  55. Il2CppClass *single_class;
  56. Il2CppClass *double_class;
  57. Il2CppClass *char_class;
  58. Il2CppClass *string_class;
  59. Il2CppClass *enum_class;
  60. Il2CppClass *array_class;
  61. Il2CppClass *delegate_class;
  62. Il2CppClass *multicastdelegate_class;
  63. Il2CppClass *asyncresult_class;
  64. Il2CppClass *manualresetevent_class;
  65. Il2CppClass *typehandle_class;
  66. Il2CppClass *fieldhandle_class;
  67. Il2CppClass *methodhandle_class;
  68. Il2CppClass *systemtype_class;
  69. Il2CppClass *monotype_class;
  70. Il2CppClass *exception_class;
  71. Il2CppClass *threadabortexception_class;
  72. Il2CppClass *thread_class;
  73. #if NET_4_0
  74. Il2CppClass *internal_thread_class;
  75. #endif
  76. /*Il2CppClass *transparent_proxy_class;
  77. Il2CppClass *real_proxy_class;
  78. Il2CppClass *mono_method_message_class;*/
  79. Il2CppClass *appdomain_class;
  80. Il2CppClass *appdomain_setup_class;
  81. Il2CppClass *field_info_class;
  82. Il2CppClass *method_info_class;
  83. Il2CppClass *property_info_class;
  84. Il2CppClass *event_info_class;
  85. Il2CppClass *mono_event_info_class;
  86. Il2CppClass *stringbuilder_class;
  87. /*Il2CppClass *math_class;*/
  88. Il2CppClass *stack_frame_class;
  89. Il2CppClass *stack_trace_class;
  90. Il2CppClass *marshal_class;
  91. /*Il2CppClass *iserializeable_class;
  92. Il2CppClass *serializationinfo_class;
  93. Il2CppClass *streamingcontext_class;*/
  94. Il2CppClass *typed_reference_class;
  95. /*Il2CppClass *argumenthandle_class;*/
  96. Il2CppClass *marshalbyrefobject_class;
  97. /*Il2CppClass *monitor_class;
  98. Il2CppClass *iremotingtypeinfo_class;
  99. Il2CppClass *runtimesecurityframe_class;
  100. Il2CppClass *executioncontext_class;
  101. Il2CppClass *internals_visible_class;*/
  102. Il2CppClass *generic_ilist_class;
  103. Il2CppClass *generic_icollection_class;
  104. Il2CppClass *generic_ienumerable_class;
  105. #if NET_4_0
  106. Il2CppClass *generic_ireadonlylist_class;
  107. Il2CppClass *generic_ireadonlycollection_class;
  108. Il2CppClass *runtimetype_class;
  109. #endif
  110. Il2CppClass *generic_nullable_class;
  111. /*Il2CppClass *variant_class;
  112. Il2CppClass *com_object_class;*/
  113. Il2CppClass *il2cpp_com_object_class;
  114. /*Il2CppClass *com_interop_proxy_class;
  115. Il2CppClass *iunknown_class;
  116. Il2CppClass *idispatch_class;
  117. Il2CppClass *safehandle_class;
  118. Il2CppClass *handleref_class;
  119. Il2CppClass *attribute_class;*/
  120. Il2CppClass *customattribute_data_class;
  121. //Il2CppClass *critical_finalizer_object;
  122. Il2CppClass *version;
  123. Il2CppClass *culture_info;
  124. Il2CppClass *async_call_class;
  125. Il2CppClass *assembly_class;
  126. #if NET_4_0
  127. Il2CppClass *mono_assembly_class;
  128. #endif
  129. Il2CppClass *assembly_name_class;
  130. #if !NET_4_0
  131. Il2CppClass *enum_info_class;
  132. #endif
  133. Il2CppClass *mono_field_class;
  134. Il2CppClass *mono_method_class;
  135. Il2CppClass *mono_method_info_class;
  136. Il2CppClass *mono_property_info_class;
  137. Il2CppClass *parameter_info_class;
  138. #if NET_4_0
  139. Il2CppClass *mono_parameter_info_class;
  140. #endif
  141. Il2CppClass *module_class;
  142. Il2CppClass *pointer_class;
  143. Il2CppClass *system_exception_class;
  144. Il2CppClass *argument_exception_class;
  145. Il2CppClass *wait_handle_class;
  146. Il2CppClass *safe_handle_class;
  147. Il2CppClass *sort_key_class;
  148. Il2CppClass *dbnull_class;
  149. Il2CppClass *error_wrapper_class;
  150. Il2CppClass *missing_class;
  151. Il2CppClass *value_type_class;
  152. #if NET_4_0
  153. // Stuff used by the mono code
  154. Il2CppClass *threadpool_wait_callback_class;
  155. MethodInfo *threadpool_perform_wait_callback_method;
  156. Il2CppClass *mono_method_message_class;
  157. #endif
  158. // Windows.Foundation.IReference`1<T>
  159. Il2CppClass* ireference_class;
  160. // Windows.Foundation.Collections.IKeyValuePair`2<K, V>
  161. Il2CppClass* ikey_value_pair_class;
  162. // System.Collections.Generic.KeyValuePair`2<K, V>
  163. Il2CppClass* key_value_pair_class;
  164. // Windows.Foundation.Uri
  165. Il2CppClass* windows_foundation_uri_class;
  166. // Windows.Foundation.IUriRuntimeClass
  167. Il2CppClass* windows_foundation_iuri_runtime_class_class;
  168. // System.Uri
  169. Il2CppClass* system_uri_class;
  170. } Il2CppDefaults;
  171. extern LIBIL2CPP_CODEGEN_API Il2CppDefaults il2cpp_defaults;
  172. struct Il2CppClass;
  173. struct MethodInfo;
  174. struct FieldInfo;
  175. struct Il2CppObject;
  176. struct MemberInfo;
  177. struct CustomAttributesCache
  178. {
  179. int count;
  180. Il2CppObject** attributes;
  181. };
  182. struct CustomAttributeTypeCache
  183. {
  184. int count;
  185. Il2CppClass** attributeTypes;
  186. };
  187. typedef void (*CustomAttributesCacheGenerator)(CustomAttributesCache*);
  188. const int THREAD_STATIC_FIELD_OFFSET = -1;
  189. struct FieldInfo
  190. {
  191. const char* name;
  192. const Il2CppType* type;
  193. Il2CppClass *parent;
  194. int32_t offset; // If offset is -1, then it's thread static
  195. CustomAttributeIndex customAttributeIndex;
  196. uint32_t token;
  197. };
  198. struct PropertyInfo
  199. {
  200. Il2CppClass *parent;
  201. const char *name;
  202. const MethodInfo *get;
  203. const MethodInfo *set;
  204. uint32_t attrs;
  205. CustomAttributeIndex customAttributeIndex;
  206. uint32_t token;
  207. };
  208. struct EventInfo
  209. {
  210. const char* name;
  211. const Il2CppType* eventType;
  212. Il2CppClass* parent;
  213. const MethodInfo* add;
  214. const MethodInfo* remove;
  215. const MethodInfo* raise;
  216. CustomAttributeIndex customAttributeIndex;
  217. uint32_t token;
  218. };
  219. struct ParameterInfo
  220. {
  221. const char* name;
  222. int32_t position;
  223. uint32_t token;
  224. CustomAttributeIndex customAttributeIndex;
  225. const Il2CppType* parameter_type;
  226. };
  227. #if RUNTIME_MONO
  228. typedef void* (*InvokerMethod)(Il2CppMethodPointer, const MonoMethod*, void*, void**);
  229. #else
  230. typedef void* (*InvokerMethod)(Il2CppMethodPointer, const MethodInfo*, void*, void**);
  231. #endif
  232. union Il2CppRGCTXData
  233. {
  234. void* rgctxDataDummy;
  235. const MethodInfo* method;
  236. const Il2CppType* type;
  237. Il2CppClass* klass;
  238. };
  239. struct MethodInfo
  240. {
  241. Il2CppMethodPointer methodPointer;
  242. InvokerMethod invoker_method;
  243. const char* name;
  244. Il2CppClass *declaring_type;
  245. const Il2CppType *return_type;
  246. const ParameterInfo* parameters;
  247. union
  248. {
  249. const Il2CppRGCTXData* rgctx_data; /* is_inflated is true and is_generic is false, i.e. a generic instance method */
  250. const Il2CppMethodDefinition* methodDefinition;
  251. };
  252. /* note, when is_generic == true and is_inflated == true the method represents an uninflated generic method on an inflated type. */
  253. union
  254. {
  255. const Il2CppGenericMethod* genericMethod; /* is_inflated is true */
  256. const Il2CppGenericContainer* genericContainer; /* is_inflated is false and is_generic is true */
  257. };
  258. CustomAttributeIndex customAttributeIndex;
  259. uint32_t token;
  260. uint16_t flags;
  261. uint16_t iflags;
  262. uint16_t slot;
  263. uint8_t parameters_count;
  264. uint8_t is_generic : 1; /* true if method is a generic method definition */
  265. uint8_t is_inflated : 1; /* true if declaring_type is a generic instance or if method is a generic instance*/
  266. };
  267. struct Il2CppRuntimeInterfaceOffsetPair
  268. {
  269. Il2CppClass* interfaceType;
  270. int32_t offset;
  271. };
  272. typedef void (*PInvokeMarshalToNativeFunc)(void* managedStructure, void* marshaledStructure);
  273. typedef void (*PInvokeMarshalFromNativeFunc)(void* marshaledStructure, void* managedStructure);
  274. typedef void (*PInvokeMarshalCleanupFunc)(void* marshaledStructure);
  275. typedef struct Il2CppIUnknown* (*CreateCCWFunc)(Il2CppObject* obj);
  276. #if RUNTIME_MONO
  277. #include "il2cpp-mapping.h"
  278. #endif
  279. struct Il2CppInteropData
  280. {
  281. Il2CppMethodPointer delegatePInvokeWrapperFunction;
  282. PInvokeMarshalToNativeFunc pinvokeMarshalToNativeFunction;
  283. PInvokeMarshalFromNativeFunc pinvokeMarshalFromNativeFunction;
  284. PInvokeMarshalCleanupFunc pinvokeMarshalCleanupFunction;
  285. CreateCCWFunc createCCWFunction;
  286. const Il2CppGuid* guid;
  287. #if RUNTIME_MONO
  288. MonoMetadataToken typeToken;
  289. uint64_t hash;
  290. #else
  291. const Il2CppType* type;
  292. #endif
  293. };
  294. #if IL2CPP_COMPILER_MSVC
  295. #pragma warning( push )
  296. #pragma warning( disable : 4200 )
  297. #elif defined(__clang__)
  298. #pragma clang diagnostic push
  299. #pragma clang diagnostic ignored "-Winvalid-offsetof"
  300. #endif
  301. struct Il2CppClass
  302. {
  303. // The following fields are always valid for a Il2CppClass structure
  304. const Il2CppImage* image;
  305. void* gc_desc;
  306. const char* name;
  307. const char* namespaze;
  308. const Il2CppType* byval_arg;
  309. const Il2CppType* this_arg;
  310. Il2CppClass* element_class;
  311. Il2CppClass* castClass;
  312. Il2CppClass* declaringType;
  313. Il2CppClass* parent;
  314. Il2CppGenericClass *generic_class;
  315. const Il2CppTypeDefinition* typeDefinition; // non-NULL for Il2CppClass's constructed from type defintions
  316. const Il2CppInteropData* interopData;
  317. // End always valid fields
  318. // The following fields need initialized before access. This can be done per field or as an aggregate via a call to Class::Init
  319. FieldInfo* fields; // Initialized in SetupFields
  320. const EventInfo* events; // Initialized in SetupEvents
  321. const PropertyInfo* properties; // Initialized in SetupProperties
  322. const MethodInfo** methods; // Initialized in SetupMethods
  323. Il2CppClass** nestedTypes; // Initialized in SetupNestedTypes
  324. Il2CppClass** implementedInterfaces; // Initialized in SetupInterfaces
  325. Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets; // Initialized in Init
  326. void* static_fields; // Initialized in Init
  327. const Il2CppRGCTXData* rgctx_data; // Initialized in Init
  328. // used for fast parent checks
  329. Il2CppClass** typeHierarchy; // Initialized in SetupTypeHierachy
  330. // End initialization required fields
  331. uint32_t cctor_started;
  332. uint32_t cctor_finished;
  333. ALIGN_TYPE(8) uint64_t cctor_thread;
  334. // Remaining fields are always valid except where noted
  335. GenericContainerIndex genericContainerIndex;
  336. CustomAttributeIndex customAttributeIndex;
  337. uint32_t instance_size;
  338. uint32_t actualSize;
  339. uint32_t element_size;
  340. int32_t native_size;
  341. uint32_t static_fields_size;
  342. uint32_t thread_static_fields_size;
  343. int32_t thread_static_fields_offset;
  344. uint32_t flags;
  345. uint32_t token;
  346. uint16_t method_count; // lazily calculated for arrays, i.e. when rank > 0
  347. uint16_t property_count;
  348. uint16_t field_count;
  349. uint16_t event_count;
  350. uint16_t nested_type_count;
  351. uint16_t vtable_count; // lazily calculated for arrays, i.e. when rank > 0
  352. uint16_t interfaces_count;
  353. uint16_t interface_offsets_count; // lazily calculated for arrays, i.e. when rank > 0
  354. uint8_t typeHierarchyDepth; // Initialized in SetupTypeHierachy
  355. uint8_t genericRecursionDepth;
  356. uint8_t rank;
  357. uint8_t minimumAlignment;
  358. uint8_t packingSize;
  359. uint8_t valuetype : 1;
  360. uint8_t initialized : 1;
  361. uint8_t enumtype : 1;
  362. uint8_t is_generic : 1;
  363. uint8_t has_references : 1;
  364. uint8_t init_pending : 1;
  365. uint8_t size_inited : 1;
  366. uint8_t has_finalize : 1;
  367. uint8_t has_cctor : 1;
  368. uint8_t is_blittable : 1;
  369. uint8_t is_import_or_windows_runtime : 1;
  370. uint8_t is_vtable_initialized : 1;
  371. VirtualInvokeData vtable[IL2CPP_ZERO_LEN_ARRAY];
  372. };
  373. #if IL2CPP_COMPILER_MSVC
  374. #pragma warning( pop )
  375. #elif defined(__clang__)
  376. #pragma clang diagnostic pop
  377. #endif
  378. // compiler calcualted values
  379. struct Il2CppTypeDefinitionSizes
  380. {
  381. uint32_t instance_size;
  382. int32_t native_size;
  383. uint32_t static_fields_size;
  384. uint32_t thread_static_fields_size;
  385. };
  386. struct Il2CppDomain
  387. {
  388. Il2CppAppDomain* domain;
  389. Il2CppAppDomainSetup* setup;
  390. Il2CppAppContext* default_context;
  391. const char* friendly_name;
  392. uint32_t domain_id;
  393. #if NET_4_0
  394. volatile int threadpool_jobs;
  395. #endif
  396. };
  397. struct Il2CppImage
  398. {
  399. const char* name;
  400. const char *nameNoExt;
  401. AssemblyIndex assemblyIndex;
  402. TypeDefinitionIndex typeStart;
  403. uint32_t typeCount;
  404. TypeDefinitionIndex exportedTypeStart;
  405. uint32_t exportedTypeCount;
  406. MethodIndex entryPointIndex;
  407. mutable Il2CppNameToTypeDefinitionIndexHashTable* nameToClassHashTable;
  408. uint32_t token;
  409. };
  410. struct Il2CppCodeGenOptions
  411. {
  412. bool enablePrimitiveValueTypeGenericSharing;
  413. };
  414. struct Il2CppCodeRegistration
  415. {
  416. uint32_t methodPointersCount;
  417. const Il2CppMethodPointer* methodPointers;
  418. uint32_t reversePInvokeWrapperCount;
  419. const Il2CppMethodPointer* reversePInvokeWrappers;
  420. uint32_t genericMethodPointersCount;
  421. const Il2CppMethodPointer* genericMethodPointers;
  422. uint32_t invokerPointersCount;
  423. const InvokerMethod* invokerPointers;
  424. CustomAttributeIndex customAttributeCount;
  425. const CustomAttributesCacheGenerator* customAttributeGenerators;
  426. uint32_t unresolvedVirtualCallCount;
  427. const Il2CppMethodPointer* unresolvedVirtualCallPointers;
  428. uint32_t interopDataCount;
  429. Il2CppInteropData* interopData;
  430. };
  431. struct Il2CppMetadataRegistration
  432. {
  433. int32_t genericClassesCount;
  434. Il2CppGenericClass* const * genericClasses;
  435. int32_t genericInstsCount;
  436. const Il2CppGenericInst* const * genericInsts;
  437. int32_t genericMethodTableCount;
  438. const Il2CppGenericMethodFunctionsDefinitions* genericMethodTable;
  439. int32_t typesCount;
  440. const Il2CppType* const * types;
  441. int32_t methodSpecsCount;
  442. const Il2CppMethodSpec* methodSpecs;
  443. FieldIndex fieldOffsetsCount;
  444. const int32_t** fieldOffsets;
  445. TypeDefinitionIndex typeDefinitionsSizesCount;
  446. const Il2CppTypeDefinitionSizes** typeDefinitionsSizes;
  447. const size_t metadataUsagesCount;
  448. void** const* metadataUsages;
  449. };
  450. struct Il2CppRuntimeStats
  451. {
  452. uint64_t new_object_count;
  453. uint64_t initialized_class_count;
  454. // uint64_t generic_vtable_count;
  455. // uint64_t used_class_count;
  456. uint64_t method_count;
  457. // uint64_t class_vtable_size;
  458. uint64_t class_static_data_size;
  459. uint64_t generic_instance_count;
  460. uint64_t generic_class_count;
  461. uint64_t inflated_method_count;
  462. uint64_t inflated_type_count;
  463. // uint64_t delegate_creations;
  464. // uint64_t minor_gc_count;
  465. // uint64_t major_gc_count;
  466. // uint64_t minor_gc_time_usecs;
  467. // uint64_t major_gc_time_usecs;
  468. bool enabled;
  469. };
  470. extern Il2CppRuntimeStats il2cpp_runtime_stats;
  471. /*
  472. * new structure to hold performance counters values that are exported
  473. * to managed code.
  474. * Note: never remove fields from this structure and only add them to the end.
  475. * Size of fields and type should not be changed as well.
  476. */
  477. struct Il2CppPerfCounters
  478. {
  479. /* JIT category */
  480. uint32_t jit_methods;
  481. uint32_t jit_bytes;
  482. uint32_t jit_time;
  483. uint32_t jit_failures;
  484. /* Exceptions category */
  485. uint32_t exceptions_thrown;
  486. uint32_t exceptions_filters;
  487. uint32_t exceptions_finallys;
  488. uint32_t exceptions_depth;
  489. uint32_t aspnet_requests_queued;
  490. uint32_t aspnet_requests;
  491. /* Memory category */
  492. uint32_t gc_collections0;
  493. uint32_t gc_collections1;
  494. uint32_t gc_collections2;
  495. uint32_t gc_promotions0;
  496. uint32_t gc_promotions1;
  497. uint32_t gc_promotion_finalizers;
  498. uint32_t gc_gen0size;
  499. uint32_t gc_gen1size;
  500. uint32_t gc_gen2size;
  501. uint32_t gc_lossize;
  502. uint32_t gc_fin_survivors;
  503. uint32_t gc_num_handles;
  504. uint32_t gc_allocated;
  505. uint32_t gc_induced;
  506. uint32_t gc_time;
  507. uint32_t gc_total_bytes;
  508. uint32_t gc_committed_bytes;
  509. uint32_t gc_reserved_bytes;
  510. uint32_t gc_num_pinned;
  511. uint32_t gc_sync_blocks;
  512. /* Remoting category */
  513. uint32_t remoting_calls;
  514. uint32_t remoting_channels;
  515. uint32_t remoting_proxies;
  516. uint32_t remoting_classes;
  517. uint32_t remoting_objects;
  518. uint32_t remoting_contexts;
  519. /* Loader category */
  520. uint32_t loader_classes;
  521. uint32_t loader_total_classes;
  522. uint32_t loader_appdomains;
  523. uint32_t loader_total_appdomains;
  524. uint32_t loader_assemblies;
  525. uint32_t loader_total_assemblies;
  526. uint32_t loader_failures;
  527. uint32_t loader_bytes;
  528. uint32_t loader_appdomains_uloaded;
  529. /* Threads and Locks category */
  530. uint32_t thread_contentions;
  531. uint32_t thread_queue_len;
  532. uint32_t thread_queue_max;
  533. uint32_t thread_num_logical;
  534. uint32_t thread_num_physical;
  535. uint32_t thread_cur_recognized;
  536. uint32_t thread_num_recognized;
  537. /* Interop category */
  538. uint32_t interop_num_ccw;
  539. uint32_t interop_num_stubs;
  540. uint32_t interop_num_marshals;
  541. /* Security category */
  542. uint32_t security_num_checks;
  543. uint32_t security_num_link_checks;
  544. uint32_t security_time;
  545. uint32_t security_depth;
  546. uint32_t unused;
  547. /* Threadpool */
  548. uint64_t threadpool_workitems;
  549. uint64_t threadpool_ioworkitems;
  550. unsigned int threadpool_threads;
  551. unsigned int threadpool_iothreads;
  552. };