MonoSemType lock;
};
-static guint32 wsq_tlskey = -1;
+#define NO_KEY ((guint32) -1)
+static guint32 wsq_tlskey = NO_KEY;
void
mono_wsq_init ()
void
mono_wsq_cleanup ()
{
- if (wsq_tlskey == -1)
+ if (wsq_tlskey == NO_KEY)
return;
TlsFree (wsq_tlskey);
- wsq_tlskey = -1;
+ wsq_tlskey = NO_KEY;
}
MonoWSQ *
MonoWSQ *wsq;
MonoDomain *root;
+ if (wsq_tlskey == NO_KEY)
+ return NULL;
+
wsq = g_new0 (MonoWSQ, 1);
wsq->mask = INITIAL_LENGTH - 1;
- MONO_GC_REGISTER_ROOT (wsq->queue);
+ MONO_GC_REGISTER_ROOT_SINGLE (wsq->queue);
root = mono_get_root_domain ();
wsq->queue = mono_array_new_cached (root, mono_defaults.object_class, INITIAL_LENGTH);
MONO_SEM_INIT (&wsq->lock, 1);
- TlsSetValue (wsq_tlskey, wsq);
+ if (!TlsSetValue (wsq_tlskey, wsq)) {
+ mono_wsq_destroy (wsq);
+ wsq = NULL;
+ }
return wsq;
}
if (wsq == NULL || wsq->queue == NULL)
return;
- /* TODO: clean up queue if not empty */
+ g_assert (mono_wsq_count (wsq) == 0);
MONO_GC_UNREGISTER_ROOT (wsq->queue);
MONO_SEM_DESTROY (&wsq->lock);
- if (wsq_tlskey != -1 && TlsGetValue (wsq_tlskey) == wsq)
- TlsSetValue (wsq_tlskey, NULL);
memset (wsq, 0, sizeof (MonoWSQ));
+ if (wsq_tlskey != NO_KEY && TlsGetValue (wsq_tlskey) == wsq)
+ TlsSetValue (wsq_tlskey, NULL);
g_free (wsq);
}
gint
mono_wsq_count (MonoWSQ *wsq)
{
+ if (!wsq)
+ return 0;
return ((wsq->tail - wsq->head) & wsq->mask);
}
int count;
MonoWSQ *wsq;
- if (obj == NULL)
+ if (obj == NULL || wsq_tlskey == NO_KEY)
return FALSE;
wsq = (MonoWSQ *) TlsGetValue (wsq_tlskey);
gboolean res;
MonoWSQ *wsq;
- if (ptr == NULL)
+ if (ptr == NULL || wsq_tlskey == NO_KEY)
return FALSE;
wsq = (MonoWSQ *) TlsGetValue (wsq_tlskey);
void
mono_wsq_try_steal (MonoWSQ *wsq, void **ptr, guint32 ms_timeout)
{
- if (wsq == NULL || ptr == NULL || *ptr != NULL)
+ if (wsq == NULL || ptr == NULL || *ptr != NULL || wsq_tlskey == NO_KEY)
return;
if (TlsGetValue (wsq_tlskey) == wsq)
return;
- if (MONO_SEM_TIMEDWAIT (&wsq->lock, ms_timeout)) {
+ if (mono_sem_timedwait (&wsq->lock, ms_timeout, FALSE) == 0) {
int head;
head = wsq->head;