Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
name threads to help debugs
[simgrid.git] / include / xbt / dynar.h
index 52ea05c..c3e8597 100644 (file)
@@ -62,13 +62,15 @@ SG_BEGIN_DECL()
    typedef struct xbt_dynar_s *xbt_dynar_t;
 
 
-  XBT_PUBLIC xbt_dynar_t   xbt_dynar_new(unsigned long elm_size, 
-                            void_f_pvoid_t *free_func);
+  XBT_PUBLIC(xbt_dynar_t)   xbt_dynar_new(unsigned long elm_size, 
+                                         void_f_pvoid_t *free_func);
+  XBT_PUBLIC(xbt_dynar_t)   xbt_dynar_new_sync(unsigned long elm_size, 
+                                              void_f_pvoid_t *free_func);
   XBT_PUBLIC(void)          xbt_dynar_free(xbt_dynar_t *dynar);
   XBT_PUBLIC(void)          xbt_dynar_free_voidp(void *dynar);
   XBT_PUBLIC(void)          xbt_dynar_free_container(xbt_dynar_t *dynar);
 
-  XBT_PUBLIC unsigned long xbt_dynar_length(const xbt_dynar_t dynar);
+  XBT_PUBLIC(unsigned long) xbt_dynar_length(const xbt_dynar_t dynar);
   XBT_PUBLIC(void)          xbt_dynar_reset(xbt_dynar_t dynar);
   XBT_PUBLIC(void)          xbt_dynar_shrink(xbt_dynar_t dynar, int empty_slots);
 
@@ -160,18 +162,25 @@ SG_BEGIN_DECL()
  *
  * Cursors are used to iterate over the structure. Never add elements to the 
  * DynArr during the traversal. To remove elements, use the
- * xbt_dynar_cursor_rm() function
+ * xbt_dynar_cursor_rm() function.
+ *
+ * Do not call these functions directly, but only the xbt_dynar_foreach macro.
+ * 
+ * For synchronized dynars, the dynar will be locked during the whole
+ * loop and it will get unlocked automatically if you traverse all
+ * elements. If you want to break the loop before the end, make sure
+ * to call xbt_dynar_cursor_unlock() before the <tt>break;</tt>
  *
  *  @{
  */
 
-  XBT_PUBLIC(void) xbt_dynar_cursor_first (const xbt_dynar_t dynar, int *cursor);
-  XBT_PUBLIC(void) xbt_dynar_cursor_step  (const xbt_dynar_t dynar, int *cursor);
-  XBT_PUBLIC(int)  xbt_dynar_cursor_get   (const xbt_dynar_t dynar, int *cursor, 
-                              void *whereto);
+  XBT_PUBLIC(void) _xbt_dynar_cursor_first (const xbt_dynar_t dynar, int *cursor);
+  XBT_PUBLIC(void) _xbt_dynar_cursor_step  (const xbt_dynar_t dynar, int *cursor);
+  XBT_PUBLIC(int)  _xbt_dynar_cursor_get   (const xbt_dynar_t dynar, int *cursor, 
+                                           void *whereto);
   XBT_PUBLIC(void) xbt_dynar_cursor_rm(xbt_dynar_t dynar,
-                          int          *const cursor);
-
+                                      int         *const cursor);
+  XBT_PUBLIC(void) xbt_dynar_cursor_unlock(xbt_dynar_t dynar);
 
 /** @brief Iterates over the whole dynar. 
  * 
@@ -191,9 +200,9 @@ xbt_dynar_foreach (dyn,cpt,str) {
 \endcode
  */
 #define xbt_dynar_foreach(_dynar,_cursor,_data) \
-       for (xbt_dynar_cursor_first(_dynar,&(_cursor))      ; \
-           xbt_dynar_cursor_get(_dynar,&(_cursor),&_data) ; \
-            xbt_dynar_cursor_step(_dynar,&(_cursor))         )
+       for (_xbt_dynar_cursor_first(_dynar,&(_cursor))      ; \
+           _xbt_dynar_cursor_get(_dynar,&(_cursor),&_data) ; \
+            _xbt_dynar_cursor_step(_dynar,&(_cursor))         )
 
 /** @} */