Description: Use array during global init
    The resource creators are registered during global init, at which point the
    list may be uninitialized which leads to errors during initialization
    and/or creators being forgotten when the ctor is run.
    
    Using an array and assuming proper NULL initialization solves the problem
    for most platforms. It does not work when NULL is not represented by an
    all-zeros pattern.
Author: Simon Richter <sjr@debian.org>
Last-Update: 2013-04-06

diff --git a/src/resource_manager.cpp b/src/resource_manager.cpp
index 4b00601..dc48116 100644
--- a/src/resource_manager.cpp
+++ b/src/resource_manager.cpp
@@ -84,8 +84,10 @@ ViStatus resource_manager::FindRsrc(
         *findList = objects.create_findlist();
         findlist *list = objects.get_findlist(*findList);
 
-        for(creator_iterator i = creators.begin(); i != creators.end(); ++i)
+        for(resource_creator const *const *i = creators; i != creators + num_creators; ++i)
         {
+                if(!*i)
+                        continue;
                 (*i)->find(*list);
         }
 
@@ -108,7 +110,13 @@ ViStatus resource_manager::ParseRsrc(
 
 void resource_manager::register_creator(resource_creator const &cre)
 {
-        creators.push_back(&cre);
+        for(resource_creator const **i = creators; i != creators + num_creators; ++i)
+        {
+                if(*i)
+                        continue;
+                *i = &cre;
+                break;
+        }
 }
 
 resource *resource_manager::create(ViRsrc rsrcName)
@@ -131,8 +139,10 @@ resource *resource_manager::create(ViRsrc rsrcName)
         }
         components.push_back(std::string(component_begin, name.end()));
 
-        for(creator_iterator i = creators.begin(); i != creators.end(); ++i)
+        for(resource_creator const *const *i = creators; i != creators + num_creators; ++i)
         {
+                if(!*i)
+                        continue;
                 resource *rsrc = (*i)->create(components);
                 if(rsrc)
                         return rsrc;
diff --git a/src/resource_manager.h b/src/resource_manager.h
index c688040..debf169 100644
--- a/src/resource_manager.h
+++ b/src/resource_manager.h
@@ -20,8 +20,6 @@
 
 #include "resource.h"
 
-#include <list>
-
 namespace librevisa {
 
 class resource_creator;
@@ -30,8 +28,6 @@ class resource_manager :
         public resource
 {
 public:
-        ~resource_manager() throw() { }
-
         virtual ViStatus Open(ViRsrc, ViAccessMode, ViUInt32, ViSession *);
 
         virtual ViStatus FindRsrc(ViString, ViFindList *, ViUInt32 *, ViRsrc);
@@ -75,11 +71,8 @@ public:
 private:
         unsigned int refcount;
 
-        typedef std::list<resource_creator const *> creator_list;
-        typedef creator_list::iterator creator_iterator;
-        typedef creator_list::const_iterator creator_const_iterator;
-
-        creator_list creators;
+        static unsigned int const num_creators = 20;
+        resource_creator const *creators[num_creators];
 };
 
 extern resource_manager default_resource_manager;
