Checking Storage Manager state added to ED. Now GUI reacts depending on status of SM.
authorjniedzie <jeremi.niedziela@cern.ch>
Fri, 15 Aug 2014 08:34:02 +0000 (10:34 +0200)
committerjniedzie <jeremi.niedziela@cern.ch>
Fri, 15 Aug 2014 08:37:09 +0000 (10:37 +0200)
EVE/EveBase/AliEveConfigManager.cxx
EVE/EveBase/AliEveConfigManager.h
EVE/EveBase/AliEveEventManager.cxx
EVE/EveBase/AliEveEventManager.h
EVE/EveBase/AliEveEventManagerEditor.cxx
EVE/EveBase/AliEveEventManagerEditor.h
MONITOR/alieventserver/AliEventServerUtil.h
MONITOR/alieventserver/alieventserver.rootrc
MONITOR/alistoragemanager/alifakedisplay.cxx
MONITOR/alistoragemanager/setupStorageDatabase.sh [changed mode: 0644->0755]
xAliroot/xAliroot.xcodeproj/project.pbxproj [new file with mode: 0644]

index 75ab46d..5058a3f 100644 (file)
@@ -244,6 +244,13 @@ const char *gPictureSaveAsTypes[] = {"PNG Image", "*.png",
 
 }
 
+void AliEveConfigManager::ConnectEventManagerSignals()
+{
+    AliEveEventManager *manager = AliEveEventManager::GetCurrent();
+    manager->Connect("StorageManagerOk()","AliEveConfigManager",this,"StorageManagerChangedState(=1)");
+    manager->Connect("StorageManagerDown()","AliEveConfigManager",this,"StorageManagerChangedState(=0)");
+}
+
 void AliEveConfigManager::AliEvePopupHandler(Int_t id)
 {
   // Handle user selections from AliEve popup.
@@ -1035,33 +1042,31 @@ void AliEveConfigManager::AliEvePopupHandler(Int_t id)
 
     }
 */
-  case kStorageListEvents:
-  {
+      case kStorageListEvents:
+      {
 #ifdef ZMQ
-      fListEventsWindow =
-                 AliStorageAdministratorPanelListEvents::GetInstance();
-      
-      fListEventsWindow->Connect("SelectedEvent()","AliEveConfigManager",this,"SetEventInEventManager()");
-#endif      
-      
-         break;
-
-  }
-   case kStorageMarkEvent:
-  {
+          fListEventsWindow =
+          AliStorageAdministratorPanelListEvents::GetInstance();
+          
+          fListEventsWindow->Connect("SelectedEvent()","AliEveConfigManager",this,"SetEventInEventManager()");
+#endif
+          break;
+          
+      }
+      case kStorageMarkEvent:
+      {
 #ifdef ZMQ
-         AliStorageAdministratorPanelMarkEvent *markEventWindow =
-                 AliStorageAdministratorPanelMarkEvent::GetInstance();
+          AliStorageAdministratorPanelMarkEvent *markEventWindow =
+          AliStorageAdministratorPanelMarkEvent::GetInstance();
 #endif
-         break;
-
-  }
-
-    default:
-    {
-      Warning(kEH, "Unknown menu entry.");
-      break;
-    }
+          break;
+      }
+          
+      default:
+      {
+          Warning(kEH, "Unknown menu entry.");
+          break;
+      }
   }
 }
 
@@ -1077,7 +1082,20 @@ void AliEveConfigManager::SetEventInEventManager()
         manager->SetAutoLoad(kFALSE);
         manager->PrepareForNewEvent(event);
     }
-    
+}
+
+void AliEveConfigManager::StorageManagerChangedState(int state)
+{
+    if (state == 0)// storage manager is down
+    {
+        fStoragePopup->DisableEntry(kStorageListEvents);
+        fStoragePopup->DisableEntry(kStorageMarkEvent);
+    }
+    else if(state == 1)// storage manager is alive
+    {
+        fStoragePopup->EnableEntry(kStorageListEvents);
+        fStoragePopup->EnableEntry(kStorageMarkEvent);
+    }
 }
 
 
index 664c278..fbbceb8 100644 (file)
@@ -29,6 +29,9 @@ public:
     
     void AliEvePopupHandler(Int_t id);
     void SetEventInEventManager();
+    void StorageManagerChangedState(int state);
+    
+    void ConnectEventManagerSignals();
     
 protected:
     static AliEveConfigManager* fgMaster;  // Main instance.
index 3c86ce8..6c9c6fa 100644 (file)
@@ -10,6 +10,8 @@
 #include "AliEveEventManager.h"
 #include "AliEveEventSelector.h"
 #include "AliEveMacroExecutor.h"
+#include "AliEveConfigManager.h"
+#include "AliEveVSDCreator.h"
 
 #include <THashList.h>
 #include <TEveElement.h>
@@ -119,87 +121,6 @@ Bool_t   AliEveEventManager::fgUniformField = kFALSE;
 AliEveEventManager* AliEveEventManager::fgMaster  = 0;
 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
 
-void AliEveEventManager::GetNextEvent()
-{
-#ifdef ZMQ
-  AliStorageEventManager *eventManager =
-    AliStorageEventManager::GetEventManagerInstance();
-  eventManager->CreateSocket(EVENTS_SERVER_SUB);
-
-  fCurrentEvent[0]=0;
-  fCurrentEvent[1]=0;
-  fCurrentTree[0]=0;
-  fCurrentTree[1]=0;
-  AliESDEvent *tmpEvent = NULL;
-  TTree *tmpTree = NULL;
-  
-  while(1)
-  {
-    //if(tmpEvent){delete tmpEvent;tmpEvent=0;}
-    tmpEvent = eventManager->GetEvent(EVENTS_SERVER_SUB,-1,&tmpTree);
-
-    if(tmpEvent)
-    {
-      if(tmpEvent->GetRunNumber()>=0)
-      {
-        fMutex.Lock();
-        if(fEventInUse == 0){fWritingToEventIndex = 1;}
-        else if(fEventInUse == 1){fWritingToEventIndex = 0;}
-        cout<<"Writing to:"<<fWritingToEventIndex<<endl;
-        if(fCurrentEvent[fWritingToEventIndex])
-        {
-          cout<<"DELETING:"<<fCurrentEvent[fWritingToEventIndex]<<endl;
-          delete fCurrentEvent[fWritingToEventIndex];
-          fCurrentEvent[fWritingToEventIndex]=0;
-          delete fCurrentTree[fWritingToEventIndex];
-        }
-        fCurrentEvent[fWritingToEventIndex] = tmpEvent;
-        fCurrentTree[fWritingToEventIndex] = tmpTree;
-        fIsNewEventAvaliable = true;
-        fMutex.UnLock();
-      }
-    }  
-  }
-#endif
-}
-
-void AliEveEventManager::InitInternals()
-{
-    // Initialize internal members.
-
-    static const TEveException kEH("AliEveEventManager::InitInternals ");
-
-    if (fgCurrent != 0)
-    {
-        throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
-    }
-
-    if (fgMaster == 0)
-    {
-        fgMaster = this;
-    }
-
-    fgCurrent = this;
-
-    fAutoLoadTimer = new TTimer;
-    fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
-    fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "Timeout()");
-
-    fExecutor = new AliEveMacroExecutor;
-
-    fTransients = new TEveElementList("Transients", "Transient per-event elements.");
-    fTransients->IncDenyDestroy();
-    gEve->AddToListTree(fTransients, kFALSE);
-
-    fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
-    fTransientLists->IncDenyDestroy();
-    gEve->AddToListTree(fTransientLists, kFALSE);
-
-    fPEventSelector = new AliEveEventSelector(this);
-
-    fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
-}
-
 AliEveEventManager::AliEveEventManager(const TString& name, Int_t ev) :
     TEveEventManager(name, ""),
     fEventId(-1),
@@ -232,8 +153,11 @@ AliEveEventManager::AliEveEventManager(const TString& name, Int_t ev) :
     
 #ifdef ZMQ
     cout<<"ZMQ FOUND. Starting subscriber thread."<<endl;
-    fGetEventThread = new TThread("fGetEventThread",Dispatch,(void*)this);
-    fGetEventThread->Run();
+    fEventListenerThread = new TThread("fEventListenerThread",DispatchEventListener,(void*)this);
+    fEventListenerThread->Run();
+    
+    fStorageManagerWatcherThread = new TThread("fStorageManagerWatcherThread",DispatchStorageManagerWatcher,(void*)this);
+    fStorageManagerWatcherThread->Run();
 #else
     cout<<"NO ZMQ FOUND. Online events not avaliable."<<endl;
 #endif
@@ -261,6 +185,118 @@ AliEveEventManager::~AliEveEventManager()
     //delete fExecutor;
 }
 
+void AliEveEventManager::GetNextEvent()
+{
+#ifdef ZMQ
+    AliStorageEventManager *eventManager =
+    AliStorageEventManager::GetEventManagerInstance();
+    eventManager->CreateSocket(EVENTS_SERVER_SUB);
+    
+    fCurrentEvent[0]=0;
+    fCurrentEvent[1]=0;
+    fCurrentTree[0]=0;
+    fCurrentTree[1]=0;
+    AliESDEvent *tmpEvent = NULL;
+    TTree *tmpTree = NULL;
+    
+    while(1)
+    {
+        //if(tmpEvent){delete tmpEvent;tmpEvent=0;}
+        tmpEvent = eventManager->GetEvent(EVENTS_SERVER_SUB,-1,&tmpTree);
+        
+        if(tmpEvent)
+        {
+            if(tmpEvent->GetRunNumber()>=0)
+            {
+                fMutex.Lock();
+                if(fEventInUse == 0){fWritingToEventIndex = 1;}
+                else if(fEventInUse == 1){fWritingToEventIndex = 0;}
+                cout<<"Writing to:"<<fWritingToEventIndex<<endl;
+                if(fCurrentEvent[fWritingToEventIndex])
+                {
+                    cout<<"DELETING:"<<fCurrentEvent[fWritingToEventIndex]<<endl;
+                    delete fCurrentEvent[fWritingToEventIndex];
+                    fCurrentEvent[fWritingToEventIndex]=0;
+                    delete fCurrentTree[fWritingToEventIndex];
+                }
+                fCurrentEvent[fWritingToEventIndex] = tmpEvent;
+                fCurrentTree[fWritingToEventIndex] = tmpTree;
+                fIsNewEventAvaliable = true;
+                fMutex.UnLock();
+            }
+        }
+    }
+#endif
+}
+
+void AliEveEventManager::CheckStorageStatus()
+{
+#ifdef ZMQ
+    AliEveConfigManager *configManager = AliEveConfigManager::GetMaster();
+    configManager->ConnectEventManagerSignals();
+    
+    AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
+    eventManager->CreateSocket(CLIENT_COMMUNICATION_REQ);
+    
+    struct clientRequestStruct *request = new struct clientRequestStruct;
+    request->messageType = REQUEST_CONNECTION;
+    
+    while (1)
+    {
+        if(eventManager->Send(request,CLIENT_COMMUNICATION_REQ,5000))
+        {
+            StorageManagerOk();
+            cout<<"WARNING -- Storage Manager is OK."<<endl;
+            long response = eventManager->GetLong(CLIENT_COMMUNICATION_REQ);
+            cout<<"RESPONSE:"<<response<<endl;
+        }
+        else
+        {
+            StorageManagerDown();
+            cout<<"WARNING -- Storage Manager is DOWN!!"<<endl;
+        }
+        sleep(1);
+    }
+#endif
+}
+
+void AliEveEventManager::InitInternals()
+{
+    // Initialize internal members.
+    
+    static const TEveException kEH("AliEveEventManager::InitInternals ");
+    
+    if (fgCurrent != 0)
+    {
+        throw(kEH + "Dependent event-managers should be created via static method AddDependentManager().");
+    }
+    
+    if (fgMaster == 0)
+    {
+        fgMaster = this;
+    }
+    
+    fgCurrent = this;
+    
+    fAutoLoadTimer = new TTimer;
+    fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "AutoLoadNextEvent()");
+    fAutoLoadTimer->Connect("Timeout()", "AliEveEventManager", this, "Timeout()");
+    
+    fExecutor = new AliEveMacroExecutor;
+    
+    fTransients = new TEveElementList("Transients", "Transient per-event elements.");
+    fTransients->IncDenyDestroy();
+    gEve->AddToListTree(fTransients, kFALSE);
+    
+    fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
+    fTransientLists->IncDenyDestroy();
+    gEve->AddToListTree(fTransientLists, kFALSE);
+    
+    fPEventSelector = new AliEveEventSelector(this);
+    
+    fGlobal = new TMap; fGlobal->SetOwnerKeyValue();
+}
+
 /******************************************************************************/
 
 void AliEveEventManager::SetESDFileName(const TString& esd, EVisibleESDTrees shown)
@@ -498,11 +534,15 @@ void AliEveEventManager::Open()
     }
 
     // Open RunLoader from galice.root
+//    fgGAliceFileName = "/Users/Jerus/galice.root"; // temp
+    
     TFile *gafile = TFile::Open(fgGAliceFileName);
+    cout<<"Opening galice"<<endl;
     if (gafile)
     {
         gafile->Close();
         delete gafile;
+        cout<<"SETTING RUN LOADER in Open()"<<endl;
         fRunLoader = AliRunLoader::Open(fgGAliceFileName, GetName());
         if (fRunLoader)
         {
@@ -1041,8 +1081,15 @@ void AliEveEventManager::NextEvent()
     }
     
     gSystem->ProcessEvents();
-
-    //if(fGetEventThread){delete fGetEventThread;fGetEventThread=0;}
+    
+    /*
+    cout<<"VSD"<<endl;
+    AliEveVSDCreator *vsdCreator = new AliEveVSDCreator();
+    cout<<"contructor called"<<endl;
+    vsdCreator->CreateVSD("myVSD.root");
+    cout<<"PO"<<endl;
+*/
+    //if(fEventListenerThread){delete fEventListenerThread;fEventListenerThread=0;}
 }
 
 void AliEveEventManager::PrevEvent()
@@ -1742,16 +1789,23 @@ void AliEveEventManager::AfterNewEventLoaded()
 void AliEveEventManager::NewEventDataLoaded()
 {
     // Emit NewEventDataLoaded signal.
-
     Emit("NewEventDataLoaded()");
 }
-
 void AliEveEventManager::NewEventLoaded()
 {
     // Emit NewEventLoaded signal.
-
     Emit("NewEventLoaded()");
 }
+void AliEveEventManager::StorageManagerOk()
+{
+    // Emit StorageManagerOk signal.
+    Emit("StorageManagerOk()");
+}
+void AliEveEventManager::StorageManagerDown()
+{
+    // Emit StorageManagerOk signal.
+    Emit("StorageManagerDown()");
+}
 
 
 //------------------------------------------------------------------------------
index 8d17a72..58fae55 100644 (file)
@@ -142,6 +142,8 @@ public:
     virtual void  AfterNewEventLoaded();
     void          NewEventDataLoaded();  // *SIGNAL*
     void          NewEventLoaded();      // *SIGNAL*
+    void          StorageManagerOk();    // *SIGNAL*
+    void          StorageManagerDown();  // *SIGNAL*
 
     AliEveMacroExecutor* GetExecutor() const { return fExecutor; }
     void InitOCDB(int runNo=-1);
@@ -222,10 +224,12 @@ private:
     static AliEveEventManager* fgMaster;
     static AliEveEventManager* fgCurrent;
 
-
-    static void* Dispatch(void *arg){static_cast<AliEveEventManager*>(arg)->GetNextEvent();}
+    static void* DispatchEventListener(void *arg){static_cast<AliEveEventManager*>(arg)->GetNextEvent();}
+    static void* DispatchStorageManagerWatcher(void *arg){static_cast<AliEveEventManager*>(arg)->CheckStorageStatus();}
     void GetNextEvent();
-    TThread *fGetEventThread;
+    void CheckStorageStatus();
+    TThread *fEventListenerThread;
+    TThread *fStorageManagerWatcherThread;
     TMutex fMutex;
     AliESDEvent *fCurrentEvent[2];
     TTree *fCurrentTree[2];
index f7ccefb..36c752a 100644 (file)
@@ -177,12 +177,17 @@ AliEveEventManagerWindow::AliEveEventManagerWindow(AliEveEventManager* mgr) :
     fTrigSel->Select(-1,kFALSE);
     f->AddFrame(fTrigSel, new TGLayoutHints(kLHintsNormal, 10, 5, 0, 0));
     fTrigSel->Connect("Selected(char*)", cls, this, "DoSetTrigSel()");
-  }
 
+    fStorageStatus = MkLabel(f,"Storage: Waiting",0,8,8);
+      
+  }
+    
   fEventInfo = new TGTextView(this, 400, 600);
   AddFrame(fEventInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY));
 
   fM->Connect("NewEventLoaded()", cls, this, "Update()");
+    fM->Connect("StorageManagerOk()",cls,this,"StorageManagerChangedState(=1)");
+    fM->Connect("StorageManagerDown()",cls,this,"StorageManagerChangedState(=0)");
 
   SetCleanup(kDeepCleanup);
   Layout();
@@ -320,6 +325,20 @@ void AliEveEventManagerWindow::Update()
   Layout();
 }
 
+void AliEveEventManagerWindow::StorageManagerChangedState(int state)
+{
+    if (state == 0)
+    {
+        fStorageStatus->SetText("Storage: DOWN");
+        fMarkEvent->SetEnabled(false);
+    }
+    else if(state == 1)
+    {
+        fStorageStatus->SetText("Storage: OK");
+        fMarkEvent->SetEnabled(true);
+    }
+}
+
 //------------------------------------------------------------------------------
 // Protected methods
 //------------------------------------------------------------------------------
index b54f587..f151479 100644 (file)
@@ -83,6 +83,8 @@ public:
   void DoSetTrigSel();
 
   void Update();
+    
+    void StorageManagerChangedState(int state);
 
 protected:
   AliEveEventManager   *fM;            // Model object.
@@ -101,6 +103,7 @@ protected:
   TEveGValuator        *fAutoLoadTime; // Time for automatic loading of events
 
   TGComboBox           *fTrigSel;      // Trigger selection combo box
+  TGLabel              *fStorageStatus; // Display status of Storage Manager
 
   TGTextView           *fEventInfo;    // Text box with event info
 
index b9cc9a0..ae71ff7 100644 (file)
@@ -7,11 +7,11 @@
 //______________DEFAULT SETTINGS________________
 #define DEFAULT_SERVER_HOST "tcp://*"
 #define DEFAULT_SERVER_PORT 5024
-#define DEFAULT_SERVER_SAVE_RECO_DIR "/opt/reco"
-#define DEFAULT_CDB_STORAGE "local:///opt/OCDB/2013"
-#define DEFAULT_CDB_SPEC_STORAGE_PATH1 "opt/reco/GRP/GRP/Data"
+#define DEFAULT_SERVER_SAVE_RECO_DIR "/local/reco"
+#define DEFAULT_CDB_STORAGE "local:///local/OCDB/2013"
+#define DEFAULT_CDB_SPEC_STORAGE_PATH1 "/local/reco/GRP/GRP/Data"
 #define DEFAULT_CDB_SPEC_STORAGE_VALUE1 ""
-#define DEFAULT_CDB_SPEC_STORAGE_PATH2 "opt/reco/GRP/CTP/Config"
+#define DEFAULT_CDB_SPEC_STORAGE_PATH2 "/local/reco/GRP/CTP/Config"
 #define DEFAULT_CDB_SPEC_STORAGE_VALUE2 ""
 #define DEFAULT_CDB_SPEC_STORAGE_PATH3 ""
 #define DEFAULT_CDB_SPEC_STORAGE_VALUE3 ""
index 0744efe..1c7dca4 100644 (file)
@@ -1,10 +1,10 @@
 server.host:                             tcp://*
 server.port:                             5024
-server.saveRecoDir:                      /opt/reco
-cdb.defaultStorage:                      local:///opt/OCDB/2013
-cdb.specificStoragePath1:                local:///opt/reco/GRP/GRP/Data
+server.saveRecoDir:                      /local/reco
+cdb.defaultStorage:                      local:///local/OCDB/2013
+cdb.specificStoragePath1:                local:///local/reco/GRP/GRP/Data
 cdb.specificStorageValue1:               
-cdb.specificStoragePath2:                local:///opt/reco/GRP/CTP/Config
+cdb.specificStoragePath2:                local:///local/reco/GRP/CTP/Config
 cdb.specificStorageValue2:               
 cdb.specificStoragePath3:                
 cdb.specificStorageValue3:               
index 7d556df..d9f023b 100644 (file)
@@ -20,7 +20,7 @@ using namespace std;
 // global variables:
 AliESDEvent *currentEvent[2];
 TTree *currentTree[2];
-TMutex mutex;
+TMutex myMutex;
 int eventInUse=1;
 int writingToEventIndex=0;
 bool isNewEventAvaliable=false;
@@ -107,7 +107,7 @@ int main(int argc, char **argv)
             if(isNewEventAvaliable)
             {
               cout<<"new event"<<endl;
-              mutex.Lock();
+              myMutex.Lock();
               if(writingToEventIndex == 0) eventInUse = 0;
               else if(writingToEventIndex == 1) eventInUse = 1;
               cout<<"Using:"<<eventInUse<<endl;
@@ -120,7 +120,7 @@ int main(int argc, char **argv)
                 }
               }
               isNewEventAvaliable = false;
-              mutex.UnLock();
+              myMutex.UnLock();
             }
             else{cout<<"No new event is avaliable."<<endl;}
 
@@ -152,7 +152,7 @@ void* GetNextEvent(void*)
     {
       if(tmpEvent->GetRunNumber()>=0)
       {
-        mutex.Lock();
+        myMutex.Lock();
         if(eventInUse == 0){writingToEventIndex = 1;}
         else if(eventInUse == 1){writingToEventIndex = 0;}
         cout<<"Writing to:"<<writingToEventIndex<<endl;
@@ -166,7 +166,7 @@ void* GetNextEvent(void*)
         currentEvent[writingToEventIndex] = tmpEvent;
         currentTree[writingToEventIndex] = tmpTree;
         isNewEventAvaliable = true;
-        mutex.UnLock();
+        myMutex.UnLock();
       }
     }  
   }
old mode 100644 (file)
new mode 100755 (executable)
index 9930f3b..491ddf3
@@ -5,7 +5,7 @@ DATABASE="storage"
 USER="storage"
 PASS="storage123"
 TABLE="events"
-STORAGE_PATH="/local/home/edis/storedFiles"
+STORAGE_PATH="/Users/Jerus/storedFiles"
 MAX_SIZE="10000000"
 MAX_OCCUPATION="80"
 REMOVE_PERCENT="60"
diff --git a/xAliroot/xAliroot.xcodeproj/project.pbxproj b/xAliroot/xAliroot.xcodeproj/project.pbxproj
new file mode 100644 (file)
index 0000000..96d53bc
--- /dev/null
@@ -0,0 +1,67 @@
+// !$*UTF8*$!
+{
+       archiveVersion = 1;
+       classes = {
+       };
+       objectVersion = 46;
+       objects = {
+
+/* Begin PBXGroup section */
+               E60595D7199B671F009B3D1B = {
+                       isa = PBXGroup;
+                       children = (
+                       );
+                       sourceTree = "<group>";
+               };
+/* End PBXGroup section */
+
+/* Begin PBXProject section */
+               E60595D8199B671F009B3D1B /* Project object */ = {
+                       isa = PBXProject;
+                       attributes = {
+                               LastUpgradeCheck = 0600;
+                       };
+                       buildConfigurationList = E60595DB199B671F009B3D1B /* Build configuration list for PBXProject "xAliroot" */;
+                       compatibilityVersion = "Xcode 3.2";
+                       developmentRegion = English;
+                       hasScannedForEncodings = 0;
+                       knownRegions = (
+                               en,
+                       );
+                       mainGroup = E60595D7199B671F009B3D1B;
+                       projectDirPath = "";
+                       projectRoot = "";
+                       targets = (
+                       );
+               };
+/* End PBXProject section */
+
+/* Begin XCBuildConfiguration section */
+               E60595DC199B671F009B3D1B /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                       };
+                       name = Debug;
+               };
+               E60595DD199B671F009B3D1B /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                       };
+                       name = Release;
+               };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+               E60595DB199B671F009B3D1B /* Build configuration list for PBXProject "xAliroot" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               E60595DC199B671F009B3D1B /* Debug */,
+                               E60595DD199B671F009B3D1B /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+/* End XCConfigurationList section */
+       };
+       rootObject = E60595D8199B671F009B3D1B /* Project object */;
+}