2 * critical-sections.c: Critical sections
5 * Dick Porter (dick@ximian.com)
7 * (C) 2002 Ximian, Inc.
14 #include <mono/io-layer/wapi.h>
15 #include <mono/io-layer/critical-section-private.h>
17 #include "mono-mutex.h"
21 /* A critical section is really just like a lightweight mutex. It
22 * can't be waited for, and doesn't have a handle.
25 /* According to the MSDN docs, the Microsoft implementation spins a
26 * number of times then waits for a semaphore. I could implement that
27 * here but I'd need a mutex around the critical section structure
28 * anyway. So I may as well just use a pthread mutex.
30 static mono_once_t attr_key_once=MONO_ONCE_INIT;
31 static mono_mutexattr_t attr;
33 static void attr_init(void)
37 ret = mono_mutexattr_init(&attr);
40 ret = mono_mutexattr_settype(&attr, MONO_MUTEX_RECURSIVE);
44 void _wapi_critical_section_cleanup (void)
46 mono_mutexattr_destroy (&attr);
50 * InitializeCriticalSection:
51 * @section: The critical section to initialise
53 * Initialises a critical section.
55 void InitializeCriticalSection(WapiCriticalSection *section)
59 mono_once(&attr_key_once, attr_init);
60 ret = mono_mutex_init(§ion->mutex, &attr);
65 * InitializeCriticalSectionAndSpinCount:
66 * @section: The critical section to initialise.
67 * @spincount: The spin count for this critical section. Not
70 * Initialises a critical section and sets the spin count. This
71 * implementation just calls InitializeCriticalSection().
73 * Return value: %TRUE on success, %FALSE otherwise. (%FALSE never
76 gboolean InitializeCriticalSectionAndSpinCount(WapiCriticalSection *section,
77 guint32 spincount G_GNUC_UNUSED)
79 InitializeCriticalSection(section);
85 * DeleteCriticalSection:
86 * @section: The critical section to delete.
88 * Releases all resources owned by critical section @section.
90 void DeleteCriticalSection(WapiCriticalSection *section)
94 ret = mono_mutex_destroy(§ion->mutex);
99 * SetCriticalSectionSpinCount:
100 * @section: The critical section to set
101 * @spincount: The new spin count for this critical section. Not
104 * Sets the spin count for the critical section @section. The spin
105 * count is currently ignored, and set to zero.
107 * Return value: The previous spin count. (Currently always zero).
109 guint32 SetCriticalSectionSpinCount(WapiCriticalSection *section G_GNUC_UNUSED, guint32 spincount G_GNUC_UNUSED)
115 * TryEnterCriticalSection:
116 * @section: The critical section to try and enter
118 * Attempts to enter a critical section without blocking. If
119 * successful the calling thread takes ownership of the critical
122 * A thread can recursively call EnterCriticalSection() and
123 * TryEnterCriticalSection(), but must call LeaveCriticalSection() an
124 * equal number of times.
126 * Return value: %TRUE if the thread successfully locked the critical
127 * section, %FALSE otherwise.
129 gboolean TryEnterCriticalSection(WapiCriticalSection *section)
133 ret=mono_mutex_trylock(§ion->mutex);