Bump referencesource for fixes required by XI
[mono.git] / mono / utils / mono-linked-list-set.h
index efb14f0352bad91156e076f94676c7ff7d4c9756..8f609d0e44d4e618e927e6b253902cd29a86449e 100644 (file)
@@ -48,16 +48,16 @@ void
 mono_lls_init (MonoLinkedListSet *list, void (*free_node_func)(void *));
 
 gboolean
-mono_lls_find (MonoLinkedListSet *list, MonoThreadHazardPointers *hp, uintptr_t key) MONO_INTERNAL;
+mono_lls_find (MonoLinkedListSet *list, MonoThreadHazardPointers *hp, uintptr_t key);
 
 gboolean
-mono_lls_insert (MonoLinkedListSet *list, MonoThreadHazardPointers *hp, MonoLinkedListSetNode *value) MONO_INTERNAL;
+mono_lls_insert (MonoLinkedListSet *list, MonoThreadHazardPointers *hp, MonoLinkedListSetNode *value);
 
 gboolean
-mono_lls_remove (MonoLinkedListSet *list, MonoThreadHazardPointers *hp, MonoLinkedListSetNode *value) MONO_INTERNAL;
+mono_lls_remove (MonoLinkedListSet *list, MonoThreadHazardPointers *hp, MonoLinkedListSetNode *value);
 
 gpointer
-get_hazardous_pointer_with_mask (gpointer volatile *pp, MonoThreadHazardPointers *hp, int hazard_index) MONO_INTERNAL;
+get_hazardous_pointer_with_mask (gpointer volatile *pp, MonoThreadHazardPointers *hp, int hazard_index);
 
 /*
 Requires the world to be stoped
@@ -66,14 +66,22 @@ Requires the world to be stoped
        MonoLinkedListSetNode *__cur;   \
        for (__cur = (list)->head; __cur; __cur = mono_lls_pointer_unmask (__cur->next)) \
                if (!mono_lls_pointer_get_mark (__cur->next)) { \
-                       (element) = (type)__cur;                        \
+                       (element) = (type)__cur;
+
+
+#define MONO_LLS_FOREACH_FILTERED(list, element, filter_func, type) {\
+       MonoLinkedListSetNode *__cur;   \
+       for (__cur = (list)->head; __cur; __cur = mono_lls_pointer_unmask (__cur->next)) \
+               if (!mono_lls_pointer_get_mark (__cur->next)) { \
+                       (element) = (type)__cur;                        \
+                       if (!filter_func (element)) continue;
 
 #define MONO_LLS_END_FOREACH }}
 
 static inline MonoLinkedListSetNode*
 mono_lls_info_step (MonoLinkedListSetNode *val, MonoThreadHazardPointers *hp)
 {
-       val = mono_lls_pointer_unmask (val);
+       val = (MonoLinkedListSetNode *) mono_lls_pointer_unmask (val);
        mono_hazard_pointer_set (hp, 1, val);
        return val;
 }
@@ -84,13 +92,25 @@ Provides snapshot iteration
 #define MONO_LLS_FOREACH_SAFE(list, element, type) {\
        MonoThreadHazardPointers *__hp = mono_hazard_pointer_get ();    \
        MonoLinkedListSetNode *__cur, *__next;  \
-       for (__cur = mono_lls_pointer_unmask (get_hazardous_pointer ((gpointer volatile*)&(list)->head, __hp, 1)); \
+       for (__cur = (MonoLinkedListSetNode *) mono_lls_pointer_unmask (get_hazardous_pointer ((gpointer volatile*)&(list)->head, __hp, 1)); \
                __cur;  \
-               __cur = mono_lls_info_step (__next, __hp)) {    \
-               __next = get_hazardous_pointer_with_mask ((gpointer volatile*)&__cur->next, __hp, 0);   \
+               __cur = (MonoLinkedListSetNode *) mono_lls_info_step (__next, __hp)) {  \
+               __next = (MonoLinkedListSetNode *) get_hazardous_pointer_with_mask ((gpointer volatile*)&__cur->next, __hp, 0); \
                if (!mono_lls_pointer_get_mark (__next)) {      \
                        (element) = (type)__cur;
 
+#define MONO_LLS_FOREACH_FILTERED_SAFE(list, element, filter_func, type) {\
+       MonoThreadHazardPointers *__hp = mono_hazard_pointer_get ();    \
+       MonoLinkedListSetNode *__cur, *__next;  \
+       for (__cur = (MonoLinkedListSetNode *) mono_lls_pointer_unmask (get_hazardous_pointer ((gpointer volatile*)&(list)->head, __hp, 1)); \
+               __cur;  \
+               __cur = (MonoLinkedListSetNode *) mono_lls_info_step (__next, __hp)) {  \
+               __next = (MonoLinkedListSetNode *) get_hazardous_pointer_with_mask ((gpointer volatile*)&__cur->next, __hp, 0); \
+               if (!mono_lls_pointer_get_mark (__next)) {      \
+                       (element) = (type)__cur;        \
+                       if (!filter_func (element)) continue;
+
+
 #define MONO_LLS_END_FOREACH_SAFE \
                } \
        }       \