/* TODO: Maybe check whether synchronizing image is still alive. */
void
-sync_table (sync_iface *si, int *images, size_t size)
+sync_table (sync_iface *si, int *images, int size)
{
#if defined(DEBUG_NATIVE_COARRAY) && DEBUG_NATIVE_COARRAY
dprintf (2,
dprintf (2, "%d ", images[d_i]);
dprintf (2, "\n");
#endif
- size_t i;
+ int i;
int done;
int *table = get_locked_table (si);
- for (i = 0; i < size; i++)
+ if (size > 0)
{
- table[images[i] - 1 + local->total_num_images * this_image.image_num]++;
- pthread_cond_signal (&si->triggers[images[i] - 1]);
+ for (i = 0; i < size; i++)
+ {
+ table[images[i] - 1 + local->total_num_images * this_image.image_num]++;
+ pthread_cond_signal (&si->triggers[images[i] - 1]);
+ }
+ for (;;)
+ {
+ done = 1;
+ for (i = 0; i < size; i++)
+ done &= si->table[images[i] - 1
+ + this_image.image_num * local->total_num_images]
+ == si->table[this_image.image_num
+ + (images[i] - 1) * local->total_num_images];
+ if (done)
+ break;
+ wait_table_cond (si, &si->triggers[this_image.image_num]);
+ }
}
- for (;;)
+ else
{
- done = 1;
+ size = local->total_num_images;
for (i = 0; i < size; i++)
- done &= si->table[images[i] - 1
- + this_image.image_num * local->total_num_images]
- == si->table[this_image.image_num
- + (images[i] - 1) * local->total_num_images];
- if (done)
- break;
- wait_table_cond (si, &si->triggers[this_image.image_num]);
+ {
+ table[i + local->total_num_images * this_image.image_num]++;
+ pthread_cond_signal (&si->triggers[i]);
+ }
+ for (;;)
+ {
+ done = 1;
+ for (i = 0; i < size; i++)
+ done &= si->table[i + this_image.image_num * local->total_num_images]
+ == si->table[this_image.image_num
+ + i * local->total_num_images];
+ if (done)
+ break;
+ wait_table_cond (si, &si->triggers[this_image.image_num]);
+ }
}
unlock_table (si);
}
void cas_coarray_sync_all (int *);
export_proto (cas_coarray_sync_all);
-void cas_sync_images (size_t, int *, int *, char *, size_t);
+void cas_sync_images (int, int *, int *, char *, size_t);
export_proto (cas_sync_images);
void cas_lock (void *);
}
void
-cas_sync_images (size_t s, int *images, int *stat, char *error,
+cas_sync_images (int s, int *images, int *stat, char *error,
size_t err_size)
{
STAT_ERRMSG_ENTRY_CHECK (stat, error, err_size);