vdl-sort.c
author Hajime Tazaki <tazaki@nict.go.jp>
Wed, 13 Feb 2013 22:37:34 +0900
changeset 651 9d7e2cd9633b
parent 540 f2b7d02973a0
permissions -rw-r--r--
add a testcase to reproduce threaded dlclose crash (Bug 1513)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
#include "vdl-sort.h"
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
     2
#include "vdl-list.h"
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
#include "vdl-utils.h"
540
f2b7d02973a0 split some more
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 529
diff changeset
     4
#include "vdl-file.h"
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
#include <stdint.h>
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
static uint32_t
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
     8
get_max_depth (struct VdlList *files)
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
{
379
661bab436b34 handle cyclic dependencies
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 376
diff changeset
    10
  uint32_t max_depth = 0;
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    11
  void **cur;
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    12
  for (cur = vdl_list_begin (files); 
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    13
       cur != vdl_list_end (files); 
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    14
       cur = vdl_list_next (cur))
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
    {
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    16
      struct VdlFile *file = *cur;
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    17
      max_depth = vdl_utils_max (file->depth,
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
				 max_depth);
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
    }
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
  return max_depth;
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
}
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    23
struct VdlList *
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    24
vdl_sort_increasing_depth (struct VdlList *files)
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
{
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    26
  uint32_t max_depth = get_max_depth (files);
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    27
  
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    28
  struct VdlList *output = vdl_list_new ();
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
  uint32_t i;
379
661bab436b34 handle cyclic dependencies
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 376
diff changeset
    31
  for (i = 0; i <= max_depth; i++)
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    32
    {
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
      // find files with matching depth and output them
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    34
      void **cur;
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    35
      for (cur = vdl_list_begin (files);
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    36
	   cur != vdl_list_end (files); 
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    37
	   cur = vdl_list_next (cur))
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    38
	{
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    39
	  struct VdlFile *file = *cur;
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    40
	  if (file->depth == i)
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
	    {
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    42
	      vdl_list_push_back (output, file);
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    43
	    }
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    44
	}
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    45
    }
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    46
  return output;
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    47
}
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    48
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    49
struct VdlList *vdl_sort_deps_breadth_first (struct VdlFile *file)
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    50
{
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    51
  struct VdlList *sorted = vdl_list_new ();
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    52
  vdl_list_push_back (sorted, file);
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    53
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    54
  void **i;
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    55
  for (i = vdl_list_begin (sorted); 
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    56
       i != vdl_list_end (sorted); 
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    57
       i = vdl_list_next (i))
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    58
    {
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    59
      struct VdlFile *item = *i;
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    60
      void **j;
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    61
      for (j = vdl_list_begin (item->deps);
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    62
	   j != vdl_list_end (item->deps);
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    63
	   j = vdl_list_next (j))
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    64
	{
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    65
	  if (vdl_list_find (sorted, *j) == vdl_list_end (sorted))
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    66
	    {
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    67
	      // not found
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    68
	      vdl_list_push_back (sorted, *j);
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    69
	    }
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    70
	}
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
    }
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    72
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    73
  return sorted;
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    74
}
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    76
struct VdlList *vdl_sort_call_init (struct VdlList *files)
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
{
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    78
  struct VdlList *sorted = vdl_sort_increasing_depth (files);
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    79
  vdl_list_reverse (sorted);
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    80
  return sorted;
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
}
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    82
struct VdlList *vdl_sort_call_fini (struct VdlList *files)
343
d03feb8a706b more more lock-safe
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 339
diff changeset
    83
{
529
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    84
  struct VdlList *sorted = vdl_sort_increasing_depth (files);
cccc081ed03d get rid of VdlFileList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 394
diff changeset
    85
  return sorted;
339
9f82c20058c5 make more use of the loaded/unloaded lists
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    86
}