[Mono.Runtime.Tests] Exclude simd tests
[mono-project.git] / mono / metadata / threads-types.h
blob576b11956cecd8bf5c439802e6b192ec0575686b
1 /**
2 * \file
3 * Generic thread typedef support (includes system-specific files)
5 * Author:
6 * Dick Porter (dick@ximian.com)
8 * (C) 2001 Ximian, Inc
9 * (C) Copyright 2002-2006 Novell, Inc
10 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
13 #ifndef _MONO_METADATA_THREADS_TYPES_H_
14 #define _MONO_METADATA_THREADS_TYPES_H_
16 #include <glib.h>
18 #include <mono/utils/mono-forward-internal.h>
19 #include <mono/metadata/object.h>
20 #include "mono/metadata/handle.h"
21 #include "mono/utils/mono-compiler.h"
22 #include "mono/utils/mono-membar.h"
23 #include "mono/utils/mono-threads.h"
24 #include "mono/metadata/class-internals.h"
25 #include <mono/metadata/icalls.h>
27 /* This is a copy of System.Threading.ThreadState */
28 typedef enum {
29 ThreadState_Running = 0x00000000,
30 ThreadState_SuspendRequested = 0x00000002,
31 ThreadState_Background = 0x00000004,
32 ThreadState_Unstarted = 0x00000008,
33 ThreadState_Stopped = 0x00000010,
34 ThreadState_WaitSleepJoin = 0x00000020,
35 ThreadState_Suspended = 0x00000040,
36 ThreadState_AbortRequested = 0x00000080,
37 ThreadState_Aborted = 0x00000100
38 } MonoThreadState;
40 G_ENUM_FUNCTIONS (MonoThreadState)
42 /* This is a copy of System.Threading.ApartmentState */
43 typedef enum {
44 ThreadApartmentState_STA = 0x00000000,
45 ThreadApartmentState_MTA = 0x00000001,
46 ThreadApartmentState_Unknown = 0x00000002
47 } MonoThreadApartmentState;
49 typedef enum {
50 // These values match System.Threading.ThreadPriority.
51 // These values match System.Diagnostics.ThreadPriorityLevel and Windows, but are offset by 2.
52 MONO_THREAD_PRIORITY_LOWEST = 0,
53 MONO_THREAD_PRIORITY_BELOW_NORMAL = 1,
54 MONO_THREAD_PRIORITY_NORMAL = 2,
55 MONO_THREAD_PRIORITY_ABOVE_NORMAL = 3,
56 MONO_THREAD_PRIORITY_HIGHEST = 4,
57 } MonoThreadPriority;
59 #define SPECIAL_STATIC_NONE 0
60 #define SPECIAL_STATIC_THREAD 1
61 #define SPECIAL_STATIC_CONTEXT 2
63 /* It's safe to access System.Threading.InternalThread from native code via a
64 * raw pointer because all instances should be pinned. But for uniformity of
65 * icall wrapping, let's declare a MonoInternalThreadHandle anyway.
67 TYPED_HANDLE_DECL (MonoInternalThread);
69 typedef void (*MonoThreadCleanupFunc) (MonoNativeThreadId tid);
70 /* INFO has type MonoThreadInfo* */
71 typedef void (*MonoThreadNotifyPendingExcFunc) (gpointer info);
73 void
74 mono_thread_callbacks_init (void);
76 typedef enum {
77 MONO_THREAD_CREATE_FLAGS_NONE = 0x0,
78 MONO_THREAD_CREATE_FLAGS_THREADPOOL = 0x1,
79 MONO_THREAD_CREATE_FLAGS_DEBUGGER = 0x2,
80 MONO_THREAD_CREATE_FLAGS_FORCE_CREATE = 0x4,
81 MONO_THREAD_CREATE_FLAGS_SMALL_STACK = 0x8,
82 } MonoThreadCreateFlags;
84 // FIXME func should be MonoThreadStart and remove the template
85 MonoInternalThread*
86 mono_thread_create_internal (MonoDomain *domain, gpointer func, gpointer arg, MonoThreadCreateFlags flags, MonoError *error);
88 #ifdef __cplusplus
89 template <typename T>
90 inline MonoInternalThread*
91 mono_thread_create_internal (MonoDomain *domain, T func, gpointer arg, MonoThreadCreateFlags flags, MonoError *error)
93 return mono_thread_create_internal(domain, (gpointer)func, arg, flags, error);
95 #endif
97 MonoInternalThreadHandle
98 mono_thread_create_internal_handle (MonoDomain *domain, gpointer func, gpointer arg, MonoThreadCreateFlags flags, MonoError *error);
100 #ifdef __cplusplus
101 template <typename T>
102 inline MonoInternalThreadHandle
103 mono_thread_create_internal_handle (MonoDomain *domain, T func, gpointer arg, MonoThreadCreateFlags flags, MonoError *error)
105 return mono_thread_create_internal_handle(domain, (gpointer)func, arg, flags, error);
107 #endif
109 /* Data owned by a MonoInternalThread that must live until both the finalizer
110 * for MonoInternalThread has run, and the underlying machine thread has
111 * detached.
113 * Normally a thread is first detached and then the InternalThread object is
114 * finalized and collected. However during shutdown, when the root domain is
115 * finalized, all the InternalThread objects are finalized first and the
116 * machine threads are detached later.
118 typedef struct {
119 MonoRefCount ref;
120 MonoCoopMutex *synch_cs;
121 } MonoLongLivedThreadData;
123 void mono_threads_install_cleanup (MonoThreadCleanupFunc func);
125 ICALL_EXPORT
126 void ves_icall_System_Threading_Thread_SetName_internal (MonoInternalThread *this_obj, MonoString *name);
128 ICALL_EXPORT
129 MonoObject* ves_icall_System_Threading_Thread_GetCachedCurrentCulture (MonoInternalThread *this_obj);
131 ICALL_EXPORT
132 void ves_icall_System_Threading_Thread_SetCachedCurrentCulture (MonoThread *this_obj, MonoObject *culture);
134 ICALL_EXPORT
135 MonoObject* ves_icall_System_Threading_Thread_GetCachedCurrentUICulture (MonoInternalThread *this_obj);
137 ICALL_EXPORT
138 void ves_icall_System_Threading_Thread_SetCachedCurrentUICulture (MonoThread *this_obj, MonoObject *culture);
140 ICALL_EXPORT
141 gint32 ves_icall_System_Threading_Interlocked_Increment_Int(gint32 *location);
143 ICALL_EXPORT
144 gint64 ves_icall_System_Threading_Interlocked_Increment_Long(gint64 *location);
146 ICALL_EXPORT
147 gint32 ves_icall_System_Threading_Interlocked_Decrement_Int(gint32 *location);
149 ICALL_EXPORT
150 gint64 ves_icall_System_Threading_Interlocked_Decrement_Long(gint64 * location);
152 ICALL_EXPORT
153 gint32 ves_icall_System_Threading_Interlocked_Exchange_Int(gint32 *location, gint32 value);
155 ICALL_EXPORT
156 gint64 ves_icall_System_Threading_Interlocked_Exchange_Long(gint64 *location, gint64 value);
158 ICALL_EXPORT
159 MonoObject *ves_icall_System_Threading_Interlocked_Exchange_Object(MonoObject **location, MonoObject *value);
161 ICALL_EXPORT
162 gpointer ves_icall_System_Threading_Interlocked_Exchange_IntPtr(gpointer *location, gpointer value);
164 ICALL_EXPORT
165 gfloat ves_icall_System_Threading_Interlocked_Exchange_Single(gfloat *location, gfloat value);
167 ICALL_EXPORT
168 gdouble ves_icall_System_Threading_Interlocked_Exchange_Double(gdouble *location, gdouble value);
170 ICALL_EXPORT
171 gint32 ves_icall_System_Threading_Interlocked_CompareExchange_Int(gint32 *location, gint32 value, gint32 comparand);
173 ICALL_EXPORT
174 gint32 ves_icall_System_Threading_Interlocked_CompareExchange_Int_Success(gint32 *location, gint32 value, gint32 comparand, MonoBoolean *success);
176 ICALL_EXPORT
177 gint64 ves_icall_System_Threading_Interlocked_CompareExchange_Long(gint64 *location, gint64 value, gint64 comparand);
179 ICALL_EXPORT
180 MonoObject *ves_icall_System_Threading_Interlocked_CompareExchange_Object(MonoObject **location, MonoObject *value, MonoObject *comparand);
182 ICALL_EXPORT
183 gpointer ves_icall_System_Threading_Interlocked_CompareExchange_IntPtr(gpointer *location, gpointer value, gpointer comparand);
185 ICALL_EXPORT
186 gfloat ves_icall_System_Threading_Interlocked_CompareExchange_Single(gfloat *location, gfloat value, gfloat comparand);
188 ICALL_EXPORT
189 gdouble ves_icall_System_Threading_Interlocked_CompareExchange_Double(gdouble *location, gdouble value, gdouble comparand);
191 ICALL_EXPORT
192 MonoObject* ves_icall_System_Threading_Interlocked_CompareExchange_T(MonoObject **location, MonoObject *value, MonoObject *comparand);
194 ICALL_EXPORT
195 MonoObject* ves_icall_System_Threading_Interlocked_Exchange_T(MonoObject **location, MonoObject *value);
197 ICALL_EXPORT
198 gint32 ves_icall_System_Threading_Interlocked_Add_Int(gint32 *location, gint32 value);
200 ICALL_EXPORT
201 gint64 ves_icall_System_Threading_Interlocked_Add_Long(gint64 *location, gint64 value);
203 ICALL_EXPORT
204 gint64 ves_icall_System_Threading_Interlocked_Read_Long(gint64 *location);
206 ICALL_EXPORT
207 gint32 ves_icall_System_Threading_Interlocked_Increment_Int(gint32 *location);
209 ICALL_EXPORT
210 gint64 ves_icall_System_Threading_Interlocked_Increment_Long(gint64 *location);
212 ICALL_EXPORT
213 gint32 ves_icall_System_Threading_Interlocked_Decrement_Int(gint32 *location);
215 ICALL_EXPORT
216 gint64 ves_icall_System_Threading_Interlocked_Decrement_Long(gint64 * location);
218 ICALL_EXPORT
219 gint8 ves_icall_System_Threading_Thread_VolatileRead1 (void *ptr);
221 ICALL_EXPORT
222 gint16 ves_icall_System_Threading_Thread_VolatileRead2 (void *ptr);
224 ICALL_EXPORT
225 gint32 ves_icall_System_Threading_Thread_VolatileRead4 (void *ptr);
227 ICALL_EXPORT
228 gint64 ves_icall_System_Threading_Thread_VolatileRead8 (void *ptr);
230 ICALL_EXPORT
231 void * ves_icall_System_Threading_Thread_VolatileReadIntPtr (void *ptr);
233 ICALL_EXPORT
234 void * ves_icall_System_Threading_Thread_VolatileReadObject (void *ptr);
236 ICALL_EXPORT
237 double ves_icall_System_Threading_Thread_VolatileReadDouble (void *ptr);
239 ICALL_EXPORT
240 float ves_icall_System_Threading_Thread_VolatileReadFloat (void *ptr);
242 ICALL_EXPORT
243 void ves_icall_System_Threading_Thread_VolatileWrite1 (void *ptr, gint8);
245 ICALL_EXPORT
246 void ves_icall_System_Threading_Thread_VolatileWrite2 (void *ptr, gint16);
248 ICALL_EXPORT
249 void ves_icall_System_Threading_Thread_VolatileWrite4 (void *ptr, gint32);
251 ICALL_EXPORT
252 void ves_icall_System_Threading_Thread_VolatileWrite8 (void *ptr, gint64);
254 ICALL_EXPORT
255 void ves_icall_System_Threading_Thread_VolatileWriteIntPtr (void *ptr, void *);
257 ICALL_EXPORT
258 void ves_icall_System_Threading_Thread_VolatileWriteObject (void *ptr, MonoObject *);
260 ICALL_EXPORT
261 void ves_icall_System_Threading_Thread_VolatileWriteFloat (void *ptr, float);
263 ICALL_EXPORT
264 void ves_icall_System_Threading_Thread_VolatileWriteDouble (void *ptr, double);
266 ICALL_EXPORT
267 gint8 ves_icall_System_Threading_Volatile_Read1 (void *ptr);
269 ICALL_EXPORT
270 gint16 ves_icall_System_Threading_Volatile_Read2 (void *ptr);
272 ICALL_EXPORT
273 gint32 ves_icall_System_Threading_Volatile_Read4 (void *ptr);
275 ICALL_EXPORT
276 gint64 ves_icall_System_Threading_Volatile_Read8 (void *ptr);
278 ICALL_EXPORT
279 void * ves_icall_System_Threading_Volatile_ReadIntPtr (void *ptr);
281 ICALL_EXPORT
282 double ves_icall_System_Threading_Volatile_ReadDouble (void *ptr);
284 ICALL_EXPORT
285 float ves_icall_System_Threading_Volatile_ReadFloat (void *ptr);
287 ICALL_EXPORT
288 MonoObject* ves_icall_System_Threading_Volatile_Read_T (void *ptr);
290 ICALL_EXPORT
291 void ves_icall_System_Threading_Volatile_Write1 (void *ptr, gint8);
293 ICALL_EXPORT
294 void ves_icall_System_Threading_Volatile_Write2 (void *ptr, gint16);
296 ICALL_EXPORT
297 void ves_icall_System_Threading_Volatile_Write4 (void *ptr, gint32);
299 ICALL_EXPORT
300 void ves_icall_System_Threading_Volatile_Write8 (void *ptr, gint64);
302 ICALL_EXPORT
303 void ves_icall_System_Threading_Volatile_WriteIntPtr (void *ptr, void *);
305 ICALL_EXPORT
306 void ves_icall_System_Threading_Volatile_WriteFloat (void *ptr, float);
308 ICALL_EXPORT
309 void ves_icall_System_Threading_Volatile_WriteDouble (void *ptr, double);
311 ICALL_EXPORT
312 void ves_icall_System_Threading_Volatile_Write_T (void *ptr, MonoObject *value);
314 ICALL_EXPORT
315 void ves_icall_System_Threading_Thread_MemoryBarrier (void);
317 void
318 mono_threads_register_app_context (MonoAppContextHandle ctx, MonoError *error);
319 void
320 mono_threads_release_app_context (MonoAppContext* ctx, MonoError *error);
322 MONO_PROFILER_API MonoInternalThread *mono_thread_internal_current (void);
324 MonoInternalThreadHandle
325 mono_thread_internal_current_handle (void);
327 void mono_thread_internal_abort (MonoInternalThread *thread, gboolean appdomain_unload);
328 void mono_thread_internal_suspend_for_shutdown (MonoInternalThread *thread);
330 gboolean mono_thread_internal_has_appdomain_ref (MonoInternalThread *thread, MonoDomain *domain);
332 void mono_thread_internal_reset_abort (MonoInternalThread *thread);
334 void mono_thread_internal_unhandled_exception (MonoObject* exc);
336 void mono_alloc_special_static_data_free (GHashTable *special_static_fields);
337 gboolean mono_thread_current_check_pending_interrupt (void);
339 void mono_thread_set_state (MonoInternalThread *thread, MonoThreadState state);
340 void mono_thread_clr_state (MonoInternalThread *thread, MonoThreadState state);
341 gboolean mono_thread_test_state (MonoInternalThread *thread, MonoThreadState test);
342 gboolean mono_thread_test_and_set_state (MonoInternalThread *thread, MonoThreadState test, MonoThreadState set);
343 void mono_thread_clear_and_set_state (MonoInternalThread *thread, MonoThreadState clear, MonoThreadState set);
345 void mono_thread_init_apartment_state (void);
346 void mono_thread_cleanup_apartment_state (void);
348 void mono_threads_set_shutting_down (void);
350 gunichar2* mono_thread_get_name (MonoInternalThread *this_obj, guint32 *name_len);
352 MONO_API MonoException* mono_thread_get_undeniable_exception (void);
354 ICALL_EXPORT
355 void ves_icall_thread_finish_async_abort (void);
357 MONO_PROFILER_API void mono_thread_set_name_internal (MonoInternalThread *this_obj, MonoString *name, gboolean permanent, gboolean reset, MonoError *error);
359 void mono_thread_suspend_all_other_threads (void);
360 gboolean mono_threads_abort_appdomain_threads (MonoDomain *domain, int timeout);
362 void mono_thread_push_appdomain_ref (MonoDomain *domain);
363 void mono_thread_pop_appdomain_ref (void);
364 gboolean mono_thread_has_appdomain_ref (MonoThread *thread, MonoDomain *domain);
366 gboolean mono_thread_interruption_requested (void);
368 MonoException*
369 mono_thread_interruption_checkpoint (void);
371 gboolean
372 mono_thread_interruption_checkpoint_bool (void);
374 void
375 mono_thread_interruption_checkpoint_void (void);
377 MonoExceptionHandle
378 mono_thread_interruption_checkpoint_handle (void);
380 MonoException* mono_thread_force_interruption_checkpoint_noraise (void);
381 gint32* mono_thread_interruption_request_flag (void);
383 uint32_t mono_alloc_special_static_data (uint32_t static_type, uint32_t size, uint32_t align, uintptr_t *bitmap, int numbits);
384 void* mono_get_special_static_data (uint32_t offset);
385 gpointer mono_get_special_static_data_for_thread (MonoInternalThread *thread, guint32 offset);
387 void
388 mono_thread_resume_interruption (gboolean exec);
389 void mono_threads_perform_thread_dump (void);
391 // FIXME Correct the type of func and remove the template.
392 gboolean
393 mono_thread_create_checked (MonoDomain *domain, gpointer func, gpointer arg, MonoError *error);
395 #ifdef __cplusplus
396 template <typename T>
397 inline gboolean
398 mono_thread_create_checked (MonoDomain *domain, T func, gpointer arg, MonoError *error)
400 return mono_thread_create_checked (domain, (gpointer)func, arg, error);
402 #endif
404 void mono_threads_add_joinable_runtime_thread (MonoThreadInfo *thread_info);
405 void mono_threads_add_joinable_thread (gpointer tid);
406 void mono_threads_join_threads (void);
407 void mono_thread_join (gpointer tid);
409 ICALL_EXPORT
410 void ves_icall_System_Threading_Thread_GetStackTraces (MonoArray **out_threads, MonoArray **out_stack_traces);
412 MONO_API gpointer
413 mono_threads_attach_coop (MonoDomain *domain, gpointer *dummy);
415 MONO_API void
416 mono_threads_detach_coop (gpointer cookie, gpointer *dummy);
418 MonoDomain*
419 mono_threads_attach_coop_internal (MonoDomain *domain, gpointer *cookie, MonoStackData *stackdata);
421 void
422 mono_threads_detach_coop_internal (MonoDomain *orig_domain, gpointer cookie, MonoStackData *stackdata);
424 void mono_threads_begin_abort_protected_block (void);
425 gboolean mono_threads_end_abort_protected_block (void);
427 gboolean
428 mono_thread_internal_current_is_attached (void);
430 void
431 mono_thread_internal_describe (MonoInternalThread *internal, GString *str);
433 gboolean
434 mono_thread_internal_is_current (MonoInternalThread *internal);
436 gboolean
437 mono_thread_internal_is_current_handle (MonoInternalThreadHandle internal);
439 gboolean
440 mono_threads_is_current_thread_in_protected_block (void);
442 gboolean
443 mono_threads_is_critical_method (MonoMethod *method);
445 gpointer
446 mono_threads_enter_gc_unsafe_region_unbalanced_internal (MonoStackData *stackdata);
448 void
449 mono_threads_exit_gc_unsafe_region_unbalanced_internal (gpointer cookie, MonoStackData *stackdata);
451 gpointer
452 mono_threads_enter_gc_safe_region_unbalanced_internal (MonoStackData *stackdata);
454 void
455 mono_threads_exit_gc_safe_region_unbalanced_internal (gpointer cookie, MonoStackData *stackdata);
457 // Set directory to store thread dumps captured by SIGQUIT
458 void
459 mono_set_thread_dump_dir(gchar* dir);
461 MONO_COLD void
462 mono_set_pending_exception_handle (MonoExceptionHandle exc);
464 #define MONO_MAX_SUMMARY_NAME_LEN 140
465 #define MONO_MAX_THREAD_NAME_LEN 140
466 #define MONO_MAX_SUMMARY_THREADS 32
467 #define MONO_MAX_SUMMARY_FRAMES 80
468 #define MONO_MAX_SUMMARY_EXCEPTIONS 15
470 typedef struct {
471 gboolean is_managed;
472 char str_descr [MONO_MAX_SUMMARY_NAME_LEN];
473 struct {
474 int token;
475 int il_offset;
476 int native_offset;
477 const char *guid;
479 #ifndef MONO_PRIVATE_CRASHES
480 // We use ifdef to make it a compile-time error to store this
481 // symbolicated string on release builds
482 const char *name;
483 #endif
484 const char *filename;
485 guint32 image_size;
486 guint32 time_date_stamp;
487 } managed_data;
488 struct {
489 intptr_t ip;
490 gint32 offset;
491 const char *module;
492 gboolean is_trampoline;
493 gboolean has_name;
494 } unmanaged_data;
495 } MonoFrameSummary;
497 typedef struct {
498 MonoClass *managed_exc_type;
500 int num_managed_frames;
501 MonoFrameSummary managed_frames [MONO_MAX_SUMMARY_FRAMES];
502 } MonoExcSummary;
504 typedef struct {
505 guint64 offset_free_hash;
506 guint64 offset_rich_hash;
507 } MonoStackHash;
509 typedef struct {
510 gboolean done; // Needed because cond wait can have spurious wakeups
511 MonoSemType done_wait; // Readers are finished with this
513 // For managed stack walking
515 MonoDomain *domain;
516 MonoJitTlsData *jit_tls;
517 MonoLMF *lmf;
519 // Emitted attributes
521 gboolean is_managed;
523 char name [MONO_MAX_THREAD_NAME_LEN];
525 intptr_t info_addr;
526 intptr_t native_thread_id;
528 // Print reason we don't have a complete
529 // managed trace
530 const char *error_msg;
532 int num_managed_frames;
533 MonoFrameSummary managed_frames [MONO_MAX_SUMMARY_FRAMES];
535 int num_unmanaged_frames;
536 MonoFrameSummary unmanaged_frames [MONO_MAX_SUMMARY_FRAMES];
538 int num_exceptions;
539 MonoExcSummary exceptions [MONO_MAX_SUMMARY_EXCEPTIONS];
541 MonoStackHash hashes;
543 MonoContext *ctx;
544 MonoContext ctx_mem;
545 } MonoThreadSummary;
547 gboolean
548 mono_threads_summarize (MonoContext *ctx, gchar **out, MonoStackHash *hashes, gboolean silent, gboolean signal_handler_controller, gchar *mem, size_t provided_size);
550 gboolean
551 mono_threads_summarize_execute (MonoContext *ctx, gchar **out, MonoStackHash *hashes, gboolean silent, gchar *mem, size_t provided_size);
553 gboolean
554 mono_threads_summarize_one (MonoThreadSummary *out, MonoContext *ctx);
556 #endif /* _MONO_METADATA_THREADS_TYPES_H_ */