Continue LibNode 2.1.x migration,
Lot of bugs fixed, Now compile, Managers need a lot of fixes...
This commit is contained in:
parent
d05bee0900
commit
4cfc687710
210
lib/libshmem.c
210
lib/libshmem.c
@ -1,9 +1,9 @@
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* $RCSfile: libshmem.c,v $ */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* $Revision: 2.0 $ */
|
||||
/* $Revision: 2.1 $ */
|
||||
/* $Name: $ */
|
||||
/* $Date: 2005/01/24 22:57:06 $ */
|
||||
/* $Date: 2005/01/24 23:10:09 $ */
|
||||
/* $Author: agibert $ */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
#include <libshmem.h>
|
||||
|
||||
#ifdef _LIBVER_SUPPORT
|
||||
VER_INFO_EXPORT(libshmem,"$Revision: 2.0 $", "$Name: $",__FILE__,"$Author: agibert $")
|
||||
VER_INFO_EXPORT(libshmem,"$Revision: 2.1 $", "$Name: $",__FILE__,"$Author: agibert $")
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
@ -369,7 +369,7 @@ SMT_Status SM_Library_Dump_I( FILE *Out)
|
||||
|
||||
/* Affichage des informations de chaque heap */
|
||||
|
||||
return( ND_DataStruct_Print( Out, SM_Base->MHR, NDD_RECURSIVE_MODE_PARENT_CHILD, 0, 0));
|
||||
return( ND_DataStruct_Value_Print( Out, SM_Base->MHR, NDD_RECURSIVE_MODE_PARENT_CHILD, 0, 0));
|
||||
}
|
||||
|
||||
|
||||
@ -400,7 +400,7 @@ SMT_Status SM_Library_Unlock_I( void)
|
||||
|
||||
/* Libération des verrous sur les heaps */
|
||||
|
||||
ND_Node_First_Get( SM_Base->MHR, &Node);
|
||||
ND_Index_Node_First_Get( &Node, SM_Base->MHR, NDD_INDEX_PRIMARY);
|
||||
|
||||
while( Node)
|
||||
{
|
||||
@ -415,15 +415,15 @@ SMT_Status SM_Library_Unlock_I( void)
|
||||
return( SMS_ERRSEM);
|
||||
}
|
||||
|
||||
ND_Node_Next_Get( Node, &Node);
|
||||
ND_Index_Node_Next_Get( &Node, Node);
|
||||
}
|
||||
|
||||
ND_Node_First_Get( Opened_Heap_List, &Node);
|
||||
ND_Index_Node_First_Get( &Node, Opened_Heap_List, NDD_INDEX_PRIMARY);
|
||||
|
||||
while( Node)
|
||||
{
|
||||
( (SMT_Heap *)(Node->Value))->Lock_Mode = SMD_NO_LOCK;
|
||||
ND_Node_Next_Get( Node, &Node);
|
||||
ND_Index_Node_Next_Get( &Node, Node);
|
||||
}
|
||||
|
||||
return( SMS_OK);
|
||||
@ -471,7 +471,7 @@ SMT_Status SM_Heap_Exist_I ( const char *Heap_Name)
|
||||
|
||||
/* Recherche dans le MHR */
|
||||
|
||||
ND_Node_First_Get( SM_Base->MHR, &Node);
|
||||
ND_Index_Node_First_Get( &Node, SM_Base->MHR, NDD_INDEX_PRIMARY);
|
||||
|
||||
while( Node)
|
||||
{
|
||||
@ -482,7 +482,7 @@ SMT_Status SM_Heap_Exist_I ( const char *Heap_Name)
|
||||
return( SMS_YES);
|
||||
}
|
||||
|
||||
ND_Node_Next_Get( Node, &Node);
|
||||
ND_Index_Node_Next_Get( &Node, Node);
|
||||
}
|
||||
|
||||
/* Déverrouillage éventuel du heap système */
|
||||
@ -565,7 +565,7 @@ SMT_Status SM_Heap_Open_I( const char *Heap_Name, SMT_Heap **Heap, size_t Se
|
||||
/* Ouverture d'un heap existant */
|
||||
|
||||
strcpy( To_Find.Name, Prefixed_Name);
|
||||
ND_Node_Find( SM_Base->MHR, &Node, &To_Find, NULL);
|
||||
ND_Index_Node_Find( &Node, SM_Base->MHR, NDD_INDEX_PRIMARY, &To_Find, NULL);
|
||||
|
||||
MHH = (SMT_MHH *)( Node->Value);
|
||||
|
||||
@ -584,7 +584,7 @@ SMT_Status SM_Heap_Open_I( const char *Heap_Name, SMT_Heap **Heap, size_t Se
|
||||
|
||||
/* On ouvre tous les segments du heap */
|
||||
|
||||
ND_Node_First_Get( ( *Heap)->MHH->DSR, &Node);
|
||||
ND_Index_Node_First_Get( &Node, ( *Heap)->MHH->DSR, NDD_INDEX_PRIMARY);
|
||||
|
||||
while( Node)
|
||||
{
|
||||
@ -598,7 +598,7 @@ SMT_Status SM_Heap_Open_I( const char *Heap_Name, SMT_Heap **Heap, size_t Se
|
||||
goto Error1;
|
||||
}
|
||||
|
||||
ND_Node_Next_Get( Node, &Node);
|
||||
ND_Index_Node_Next_Get( &Node, Node);
|
||||
}
|
||||
|
||||
(*Heap)->Nb_Seg = (*Heap)->MHH->DSR->Index_Tab[NDD_INDEX_PRIMARY].Node_Number;
|
||||
@ -617,7 +617,7 @@ SMT_Status SM_Heap_Open_I( const char *Heap_Name, SMT_Heap **Heap, size_t Se
|
||||
|
||||
/* Ajout au cache des heaps ouverts */
|
||||
|
||||
rc = ND_Value_Add (Opened_Heap_List, *Heap);
|
||||
rc = ND_DataStruct_Value_Add (Opened_Heap_List, *Heap);
|
||||
|
||||
if( rc != NDS_OK)
|
||||
{
|
||||
@ -692,7 +692,7 @@ SMT_Status SM_Heap_Open_I( const char *Heap_Name, SMT_Heap **Heap, size_t Se
|
||||
|
||||
/* Réservation du MHH (dans la base pour le heap système, dans le heap système pour les autres heaps) */
|
||||
|
||||
if( ND_Allocator_Exec( SM_Base->MHR->Allocator_Ptr, (void **)(&MHH), sizeof( SMT_MHH), NULL) != NDS_OK)
|
||||
if( ND_Allocator_Exec( (void **)(&MHH), sizeof( SMT_MHH), SM_Base->MHR->Allocator_Name, SM_Base->MHR->Allocator_Ptr, NULL) != NDS_OK)
|
||||
{
|
||||
sprintf( SM_Error_Msg, "SM_Heap_Open : unable to allocate memory for the heap header");
|
||||
SM_Error_Print();
|
||||
@ -773,7 +773,7 @@ SMT_Status SM_Heap_Open_I( const char *Heap_Name, SMT_Heap **Heap, size_t Se
|
||||
goto Error7;
|
||||
}
|
||||
|
||||
rc = ND_Value_Add( MHH->DSR, New_DSH);
|
||||
rc = ND_DataStruct_Value_Add( MHH->DSR, New_DSH);
|
||||
if( rc != NDS_OK)
|
||||
{
|
||||
sprintf( SM_Error_Msg, "SM_Heap_Open : unable to add a data segment to the DSR structure");
|
||||
@ -786,7 +786,7 @@ SMT_Status SM_Heap_Open_I( const char *Heap_Name, SMT_Heap **Heap, size_t Se
|
||||
|
||||
/* Ajout du nouveau heap à la structure MHR */
|
||||
|
||||
rc = ND_Value_Add( SM_Base->MHR, MHH);
|
||||
rc = ND_DataStruct_Value_Add( SM_Base->MHR, MHH);
|
||||
if( rc != NDS_OK)
|
||||
{
|
||||
sprintf( SM_Error_Msg, "SM_Heap_Open : unable to add the new heap to the MHR structure");
|
||||
@ -826,7 +826,7 @@ SMT_Status SM_Heap_Open_I( const char *Heap_Name, SMT_Heap **Heap, size_t Se
|
||||
( *Heap)->Lock_Mode = SMD_LOCK_MSK( Open_Mode);
|
||||
( *Heap)->Nb_Seg = 1;
|
||||
|
||||
rc = ND_Value_Add( Opened_Heap_List, *Heap);
|
||||
rc = ND_DataStruct_Value_Add( Opened_Heap_List, *Heap);
|
||||
if( rc != NDS_OK)
|
||||
{
|
||||
sprintf( SM_Error_Msg, "SM_Heap_Open : unable to add heap \"%s\" to the opened heap cache", Prefixed_Name);
|
||||
@ -848,25 +848,25 @@ SMT_Status SM_Heap_Open_I( const char *Heap_Name, SMT_Heap **Heap, size_t Se
|
||||
*Heap = NULL;
|
||||
|
||||
Error10:
|
||||
ND_Value_Remove( SM_Base->MHR, MHH, (void **)&MHH);
|
||||
ND_DataStruct_Value_Remove( SM_Base->MHR, MHH);
|
||||
|
||||
Error9:
|
||||
ND_Value_Remove( MHH->DSR, New_DSH, (void **)&New_DSH);
|
||||
ND_DataStruct_Value_Remove( MHH->DSR, New_DSH);
|
||||
|
||||
Error8:
|
||||
SM_DataSegment_End( MHH->DSR, New_DSH);
|
||||
|
||||
Error7:
|
||||
ND_Desallocator_Exec( SM_Base->MHR->Desallocator_Ptr, MHH->FCR, NULL);
|
||||
ND_Desallocator_Exec( MHH->FCR, SM_Base->MHR->Desallocator_Name, SM_Base->MHR->Desallocator_Ptr, NULL);
|
||||
|
||||
Error6:
|
||||
ND_Desallocator_Exec( SM_Base->MHR->Desallocator_Ptr, MHH->ACR, NULL);
|
||||
ND_Desallocator_Exec( MHH->ACR, SM_Base->MHR->Desallocator_Name, SM_Base->MHR->Desallocator_Ptr, NULL);
|
||||
|
||||
Error5:
|
||||
ND_Desallocator_Exec( SM_Base->MHR->Desallocator_Ptr, MHH->DSR, NULL);
|
||||
ND_Desallocator_Exec( MHH->DSR, SM_Base->MHR->Desallocator_Name, SM_Base->MHR->Desallocator_Ptr, NULL);
|
||||
|
||||
Error4:
|
||||
ND_Desallocator_Exec( SM_Base->MHR->Desallocator_Ptr, MHH, NULL);
|
||||
ND_Desallocator_Exec( MHH, SM_Base->MHR->Desallocator_Name, SM_Base->MHR->Desallocator_Ptr, NULL);
|
||||
|
||||
Error3:
|
||||
semctl( SemID, 0, IPC_RMID, Sem_Ctl);
|
||||
@ -901,22 +901,32 @@ SMT_Status SM_Heap_Open_I( const char *Heap_Name, SMT_Heap **Heap, size_t Se
|
||||
SMT_Status SM_Heap_IsOpen_I( const char *Heap_Name, SMT_Heap **Heap )
|
||||
{
|
||||
SMT_Status rc;
|
||||
|
||||
SMT_Heap To_Find;
|
||||
NDT_Node * Node;
|
||||
NDT_Node *Node_Ptr;
|
||||
|
||||
|
||||
*Heap = NULL;
|
||||
|
||||
To_Find.Name = SM_Name_Prefix( Heap_Name);
|
||||
|
||||
rc = ND_Node_Find (Opened_Heap_List, &Node, &To_Find, NULL);
|
||||
rc = ND_Index_Node_Find( &Node_Ptr, Opened_Heap_List, NDD_INDEX_PRIMARY, &To_Find, NULL);
|
||||
|
||||
if (SM_ERROR(rc)) return rc;
|
||||
|
||||
if (rc == NDS_KO) return SMS_NO;
|
||||
|
||||
*Heap = (SMT_Heap *)(Node->Value);
|
||||
return SMS_YES;
|
||||
if( ND_ERROR(rc))
|
||||
{
|
||||
return( SMS_KO);
|
||||
}
|
||||
else
|
||||
{
|
||||
if( Node_Ptr == NULL)
|
||||
{
|
||||
return( SMS_NO);
|
||||
}
|
||||
else
|
||||
{
|
||||
*Heap = (SMT_Heap *)( Node_Ptr->Value);
|
||||
return( SMS_YES);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -970,7 +980,7 @@ SMT_Status SM_Heap_End_I ( const char * Heap_Name )
|
||||
|
||||
/* Suppression du heap */
|
||||
|
||||
rc = ND_Value_Remove (SM_Base->MHR, Heap->MHH, (void **)&(Heap->MHH));
|
||||
rc = ND_DataStruct_Value_Remove( SM_Base->MHR, Heap->MHH);
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_Heap_End: unable to remove heap \"%s\" from the MHR structure", Heap_Name);
|
||||
@ -1011,13 +1021,13 @@ SMT_Status SM_Heap_Close_I ( SMT_Heap * Heap)
|
||||
en commencant par le dernier (important pour le heap système)
|
||||
*/
|
||||
|
||||
ND_Node_Last_Get (Heap->MHH->DSR, &Node);
|
||||
ND_Index_Node_Last_Get( &Node, Heap->MHH->DSR, NDD_INDEX_PRIMARY);
|
||||
while (Node)
|
||||
{
|
||||
rc = SM_DataSegment_Close (Node->Value);
|
||||
if (SM_ERROR(rc)) return rc;
|
||||
|
||||
ND_Node_Previous_Get (Node, &Node);
|
||||
ND_Index_Node_Previous_Get( &Node, Node);
|
||||
}
|
||||
|
||||
/* Déverrouillage du heap */
|
||||
@ -1026,7 +1036,7 @@ SMT_Status SM_Heap_Close_I ( SMT_Heap * Heap)
|
||||
|
||||
/* Suppression du heap de la liste des heaps ouverts */
|
||||
|
||||
rc = ND_Value_Remove (Opened_Heap_List, Heap, (void **)&Heap);
|
||||
rc = ND_DataStruct_Value_Remove( Opened_Heap_List, Heap);
|
||||
if (SM_ERROR(rc)) return rc;
|
||||
|
||||
rc = ND_Value_Free( Opened_Heap_List, Heap);
|
||||
@ -1142,7 +1152,7 @@ SMT_Status SM_Heap_Lock_I ( SMT_Heap * Heap, SMT_Flags Lock_Mode, int * Locked )
|
||||
|
||||
/* On ouvre tous les segments du heap */
|
||||
|
||||
ND_Node_First_Get (Heap->MHH->DSR, &Node);
|
||||
ND_Index_Node_First_Get( &Node, Heap->MHH->DSR, NDD_INDEX_PRIMARY);
|
||||
while (Node)
|
||||
{
|
||||
rc = SM_DataSegment_Open (Node->Value);
|
||||
@ -1155,7 +1165,7 @@ SMT_Status SM_Heap_Lock_I ( SMT_Heap * Heap, SMT_Flags Lock_Mode, int * Locked )
|
||||
return rc;
|
||||
}
|
||||
|
||||
ND_Node_Next_Get (Node, &Node);
|
||||
ND_Index_Node_Next_Get( &Node, Node);
|
||||
}
|
||||
|
||||
Heap->Nb_Seg = Heap->MHH->DSR->Index_Tab[NDD_INDEX_PRIMARY].Node_Number;
|
||||
@ -1316,11 +1326,11 @@ SMT_Status SM_Heap_Compress_I ( SMT_Heap * Heap, size_t * Compress)
|
||||
|
||||
/* Compression de chaque segment de données du heap */
|
||||
|
||||
ND_Node_First_Get (Heap->MHH->DSR, &Node);
|
||||
ND_Index_Node_First_Get( &Node, Heap->MHH->DSR, NDD_INDEX_PRIMARY);
|
||||
while (Node)
|
||||
{
|
||||
*Compress += SM_DataSegment_Compress ((SMT_DSH *)(Node->Value), Heap->MHH->FCR);
|
||||
ND_Node_Next_Get (Node, &Node);
|
||||
ND_Index_Node_Next_Get( &Node, Node);
|
||||
}
|
||||
|
||||
return SMS_OK;
|
||||
@ -1381,7 +1391,7 @@ SMT_Status SM_Heap_Check_I ( SMT_Heap * Heap, int * Nb_Detected, int * Nb_Correc
|
||||
|
||||
/* Ouverture des segments du heap au cas ça n'aurait pas été fait */
|
||||
|
||||
ND_Node_First_Get (Heap->MHH->DSR, &Node);
|
||||
ND_Index_Node_First_Get( &Node, Heap->MHH->DSR, NDD_INDEX_PRIMARY);
|
||||
|
||||
while (Node)
|
||||
{
|
||||
@ -1399,7 +1409,7 @@ SMT_Status SM_Heap_Check_I ( SMT_Heap * Heap, int * Nb_Detected, int * Nb_Correc
|
||||
return rc;
|
||||
}
|
||||
|
||||
ND_Node_Next_Get (Node, &Node);
|
||||
ND_Index_Node_Next_Get( &Node, Node);
|
||||
}
|
||||
|
||||
/* Vérification de la structure ACR du heap */
|
||||
@ -1518,13 +1528,13 @@ SMT_Status SM_Chunk_Alloc_I ( SMT_Heap * Heap, size_t Alloc_Size, void ** Ptr )
|
||||
|
||||
Found = FALSE;
|
||||
|
||||
ND_Node_First_Get (Heap->MHH->FCR, &Node);
|
||||
ND_Index_Node_First_Get( &Node, Heap->MHH->FCR, NDD_INDEX_PRIMARY);
|
||||
while (Found == FALSE && Node)
|
||||
{
|
||||
Chunk = (SMT_Chunk *)(Node->Value);
|
||||
|
||||
if (Chunk->Size >= Alloc_Size) Found = TRUE;
|
||||
else ND_Node_Next_Get (Node, &Node);
|
||||
else ND_Index_Node_Next_Get( &Node, Node);
|
||||
}
|
||||
|
||||
if (Found == FALSE)
|
||||
@ -1550,7 +1560,7 @@ SMT_Status SM_Chunk_Alloc_I ( SMT_Heap * Heap, size_t Alloc_Size, void ** Ptr )
|
||||
return SMS_ERRSHM;
|
||||
}
|
||||
|
||||
rc = ND_Value_Add (Heap->MHH->DSR, DSH);
|
||||
rc = ND_DataStruct_Value_Add (Heap->MHH->DSR, DSH);
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_Chunk_Alloc : unable to add a data segment to the DSR structure of heap \"%s\"", Heap->Name);
|
||||
@ -1572,7 +1582,7 @@ SMT_Status SM_Chunk_Alloc_I ( SMT_Heap * Heap, size_t Alloc_Size, void ** Ptr )
|
||||
|
||||
/* Suppression du chunk de la liste des chunks libres */
|
||||
|
||||
rc = ND_Node_Remove (Node);
|
||||
rc = ND_Index_Node_Remove (Node);
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_Chunk_Alloc : unable to remove a chunk from the FCR structure of heap \"%s\"", Heap->Name);
|
||||
@ -1583,7 +1593,7 @@ SMT_Status SM_Chunk_Alloc_I ( SMT_Heap * Heap, size_t Alloc_Size, void ** Ptr )
|
||||
|
||||
/* Ajout du chunk à la liste des chunks alloués */
|
||||
|
||||
rc = ND_Node_Add (Heap->MHH->ACR, Node);
|
||||
rc = ND_Index_Node_Add( Heap->MHH->ACR, NDD_INDEX_PRIMARY, Node);
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_Chunk_Alloc : unable to add a chunk to the ACR structure of heap \"%s\"", Heap->Name);
|
||||
@ -1591,7 +1601,7 @@ SMT_Status SM_Chunk_Alloc_I ( SMT_Heap * Heap, size_t Alloc_Size, void ** Ptr )
|
||||
|
||||
/* On tente de revenir en arrière */
|
||||
|
||||
ND_Node_Add (Heap->MHH->FCR, Node);
|
||||
ND_Index_Node_Add( Heap->MHH->FCR, NDD_INDEX_PRIMARY, Node);
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -1635,7 +1645,7 @@ SMT_Status SM_Chunk_Alloc_I ( SMT_Heap * Heap, size_t Alloc_Size, void ** Ptr )
|
||||
New_Node->Right = NULL;
|
||||
New_Node->Value = New_Chunk;
|
||||
|
||||
rc = ND_Node_Add (Heap->MHH->FCR, New_Node);
|
||||
rc = ND_Index_Node_Add( Heap->MHH->FCR, NDD_INDEX_PRIMARY, New_Node);
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_Chunk_Alloc : unable to add a chunk to the FCR structure of heap \"%s\"", Heap->Name);
|
||||
@ -1667,7 +1677,7 @@ SMT_Status SM_Chunk_Alloc_I ( SMT_Heap * Heap, size_t Alloc_Size, void ** Ptr )
|
||||
|
||||
/* On compte le nombre de chunks libres "utilisables" dans la structure FCR */
|
||||
|
||||
ND_Node_First_Get (Heap->MHH->FCR, &Node);
|
||||
ND_Index_Node_First_Get( &Node, Heap->MHH->FCR, NDD_INDEX_PRIMARY);
|
||||
while (Node)
|
||||
{
|
||||
Free_Chunk = Node->Value;
|
||||
@ -1678,7 +1688,7 @@ SMT_Status SM_Chunk_Alloc_I ( SMT_Heap * Heap, size_t Alloc_Size, void ** Ptr )
|
||||
Free_Usable_Size += Free_Chunk->Size;
|
||||
}
|
||||
|
||||
ND_Node_Next_Get (Node, &Node);
|
||||
ND_Index_Node_Next_Get( &Node, Node);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1714,7 +1724,7 @@ SMT_Status SM_Chunk_Alloc_I ( SMT_Heap * Heap, size_t Alloc_Size, void ** Ptr )
|
||||
SM_DataSegment_Init pour éviter que ce noeud soit alloué dans le nouveau segment.
|
||||
*/
|
||||
|
||||
SM_System_Alloc (sizeof (NDT_Node), (void **)(&New_Node), NULL);
|
||||
SM_System_Alloc( (void **)(&New_Node), sizeof (NDT_Node), NULL);
|
||||
New_Node->Root = NULL;
|
||||
New_Node->Parent = NULL;
|
||||
New_Node->Left = NULL;
|
||||
@ -1735,7 +1745,7 @@ SMT_Status SM_Chunk_Alloc_I ( SMT_Heap * Heap, size_t Alloc_Size, void ** Ptr )
|
||||
|
||||
/* On ajoute le nouveau segment au heap système */
|
||||
|
||||
rc = ND_Node_Add (Heap->MHH->DSR, New_Node);
|
||||
rc = ND_Index_Node_Add( Heap->MHH->DSR, NDD_INDEX_PRIMARY, New_Node);
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_Chunk_Alloc : unable to add a data segment to the DSR structure of the system heap (anticipation)");
|
||||
@ -1798,7 +1808,7 @@ SMT_Status SM_Chunk_Free_I ( SMT_Heap * Heap, void * Ptr)
|
||||
|
||||
/* Suppression du chunk de la liste des chunks alloués */
|
||||
|
||||
rc = ND_Node_Remove (Node);
|
||||
rc = ND_Index_Node_Remove (Node);
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_Chunk_Free : unable to remove the allocated chunk from the ACR structure of heap \"%s\"", Heap->Name);
|
||||
@ -1809,7 +1819,7 @@ SMT_Status SM_Chunk_Free_I ( SMT_Heap * Heap, void * Ptr)
|
||||
|
||||
/* Ajout du chunk à la liste des chunks libres */
|
||||
|
||||
rc = ND_Node_Add (Heap->MHH->FCR, Node);
|
||||
rc = ND_Index_Node_Add( Heap->MHH->FCR, NDD_INDEX_PRIMARY, Node);
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_Chunk_Free : unable to add the free chunk to the FCR structure of heap \"%s\"", Heap->Name);
|
||||
@ -1817,7 +1827,7 @@ SMT_Status SM_Chunk_Free_I ( SMT_Heap * Heap, void * Ptr)
|
||||
|
||||
/* Retour arrière */
|
||||
|
||||
ND_Node_Add (Heap->MHH->ACR, Node);
|
||||
ND_Index_Node_Add( Heap->MHH->ACR, NDD_INDEX_PRIMARY, Node);
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -2467,14 +2477,12 @@ SMT_Status SM_Chunk_Free_C ( SMT_Heap * Heap, void * Ptr)
|
||||
/* Allocation de mémoire dans la base */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
|
||||
SMT_Status SM_Base_Alloc (size_t Size, void ** Ptr, void * Data)
|
||||
NDT_Status SM_Base_Alloc( void **Ptr, size_t Size, void *Data_Ptr)
|
||||
{
|
||||
*Ptr = NULL;
|
||||
|
||||
*Ptr = SM_Base->Free;
|
||||
SM_Base->Free = (void *)((size_t)(SM_Base->Free) + Size);
|
||||
|
||||
return SMS_OK;
|
||||
return( NDS_OK);
|
||||
}
|
||||
|
||||
|
||||
@ -2485,11 +2493,11 @@ SMT_Status SM_Base_Alloc (size_t Size, void ** Ptr, void * Data)
|
||||
/* Désallocation de mémoire dans la base */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
|
||||
SMT_Status SM_Base_Free (void * Ptr, void * Data)
|
||||
NDT_Status SM_Base_Free( void *Ptr, void *Data_Ptr)
|
||||
{
|
||||
if (!Ptr) return SMS_ERRAPI;
|
||||
if( !Ptr) return( SMS_ERRAPI);
|
||||
|
||||
return SMS_OK;
|
||||
return( NDS_OK);
|
||||
}
|
||||
|
||||
|
||||
@ -2500,9 +2508,9 @@ SMT_Status SM_Base_Free (void * Ptr, void * Data)
|
||||
/* Allocation de mémoire dans le heap système */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
|
||||
SMT_Status SM_System_Alloc (size_t Size, void ** Ptr, void * Data)
|
||||
NDT_Status SM_System_Alloc( void **Ptr, size_t Size, void *Data_Ptr)
|
||||
{
|
||||
return SM_Chunk_Alloc_I (System_Heap, Size, Ptr);
|
||||
return( SM_Chunk_Alloc_I( System_Heap, Size, Ptr));
|
||||
}
|
||||
|
||||
|
||||
@ -2513,9 +2521,9 @@ SMT_Status SM_System_Alloc (size_t Size, void ** Ptr, void * Data)
|
||||
/* Désallocation de mémoire dans le heap système */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
|
||||
SMT_Status SM_System_Free (void * Ptr, void * Data)
|
||||
NDT_Status SM_System_Free( void *Ptr, void *Data_Ptr)
|
||||
{
|
||||
return SM_Chunk_Free_I (System_Heap, Ptr);
|
||||
return( SM_Chunk_Free_I( System_Heap, Ptr));
|
||||
}
|
||||
|
||||
|
||||
@ -2834,13 +2842,13 @@ SMT_Status SM_Base_End ( void )
|
||||
NB : à chaque destruction de heap, la base est verrouillée en écriture
|
||||
*/
|
||||
|
||||
ND_Node_Last_Get (SM_Base->MHR, &Node);
|
||||
ND_Index_Node_Last_Get( &Node, SM_Base->MHR, NDD_INDEX_PRIMARY);
|
||||
|
||||
while (Node)
|
||||
{
|
||||
SMT_MHH * MHH = (SMT_MHH *)(Node->Value);
|
||||
|
||||
ND_Node_Previous_Get (Node, &Previous_Node);
|
||||
ND_Index_Node_Previous_Get( &Previous_Node, Node);
|
||||
|
||||
/*
|
||||
Pour la suppression du heap système, il faut redéfinir la fonction de
|
||||
@ -2854,7 +2862,7 @@ SMT_Status SM_Base_End ( void )
|
||||
|
||||
/* Retrait du heap de la structure du MHR */
|
||||
|
||||
rc = ND_Value_Remove (SM_Base->MHR, MHH, (void **)&MHH);
|
||||
rc = ND_DataStruct_Value_Remove( SM_Base->MHR, MHH);
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_Base_End : unable to remove heap \"%s\" from the MHR", MHH->Name);
|
||||
@ -3075,12 +3083,12 @@ SMT_Status SM_Base_Close ( void )
|
||||
Attention : il faut fermer le heap système en dernier.
|
||||
*/
|
||||
|
||||
ND_Node_First_Get (Opened_Heap_List, &Node);
|
||||
ND_Index_Node_First_Get( &Node, Opened_Heap_List, NDD_INDEX_PRIMARY);
|
||||
|
||||
while (Node)
|
||||
{
|
||||
NDT_Node *Next_Node;
|
||||
ND_Node_Next_Get (Node, &Next_Node);
|
||||
ND_Index_Node_Next_Get( &Next_Node, Node);
|
||||
SM_Heap_Close_I ((SMT_Heap *)(Node->Value));
|
||||
Node = Next_Node;;
|
||||
}
|
||||
@ -3360,13 +3368,13 @@ SMT_Status SM_MHH_End ( SMT_MHH * MHH)
|
||||
du DSR pour celui-ci.
|
||||
*/
|
||||
|
||||
ND_Node_Last_Get (MHH->DSR, &Node);
|
||||
ND_Index_Node_Last_Get( &Node, MHH->DSR, NDD_INDEX_PRIMARY);
|
||||
|
||||
while (Node)
|
||||
{
|
||||
DSH = (SMT_DSH *)(Node->Value);
|
||||
|
||||
ND_Node_Previous_Get (Node, &Previous_Node);
|
||||
ND_Index_Node_Previous_Get( &Previous_Node, Node);
|
||||
|
||||
/* S'agit-il du heap système ? */
|
||||
|
||||
@ -3377,7 +3385,7 @@ SMT_Status SM_MHH_End ( SMT_MHH * MHH)
|
||||
|
||||
/* Retrait du segment du DSR */
|
||||
|
||||
rc = ND_Value_Remove (MHH->DSR, DSH, (void **)&DSH);
|
||||
rc = ND_DataStruct_Value_Remove( MHH->DSR, DSH);
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_MHH_End : unable to remove the shared memory segment (address=%p) from the DSR structure", DSH->Start);
|
||||
@ -3418,14 +3426,14 @@ SMT_Status SM_MHH_End ( SMT_MHH * MHH)
|
||||
leur racine.
|
||||
*/
|
||||
|
||||
rc = ND_Desallocator_Exec( SM_Base->MHR->Desallocator_Ptr, MHH->ACR, NULL);
|
||||
rc = ND_Desallocator_Exec( MHH->ACR, SM_Base->MHR->Desallocator_Name, SM_Base->MHR->Desallocator_Ptr, NULL);
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_MHH_End : unable to free the ACR root of heap \"%s\"", MHH->Name);
|
||||
SM_Error_Print ();
|
||||
}
|
||||
|
||||
rc = ND_Desallocator_Exec (SM_Base->MHR->Desallocator_Ptr, MHH->FCR, NULL);
|
||||
rc = ND_Desallocator_Exec( MHH->FCR, SM_Base->MHR->Desallocator_Name, SM_Base->MHR->Desallocator_Ptr, NULL);
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_MHH_End : unable to free the FCR root of heap \"%s\"", MHH->Name);
|
||||
@ -3435,11 +3443,25 @@ SMT_Status SM_MHH_End ( SMT_MHH * MHH)
|
||||
/* Suppression du heap de la liste des heaps ouverts */
|
||||
|
||||
To_Find.Name = MHH->Name;
|
||||
rc = ND_Value_Remove (Opened_Heap_List, &To_Find, (void **)&Opened_Heap);
|
||||
if (rc == NDS_OK)
|
||||
rc = ND_DataStruct_Value_Find( (void **)&Opened_Heap, Opened_Heap_List, &To_Find);
|
||||
|
||||
if( ( rc == NDS_OK) && ( Opened_Heap != NULL))
|
||||
{
|
||||
rc = ND_DataStruct_Value_Remove( Opened_Heap_List, Opened_Heap);
|
||||
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
return( rc);
|
||||
}
|
||||
else
|
||||
{
|
||||
rc = ND_Value_Free( Opened_Heap_List, Opened_Heap);
|
||||
if (rc != NDS_OK) return rc;
|
||||
|
||||
if( rc != NDS_OK)
|
||||
{
|
||||
return( rc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Destruction du sémaphore attaché au heap */
|
||||
@ -3448,7 +3470,7 @@ SMT_Status SM_MHH_End ( SMT_MHH * MHH)
|
||||
|
||||
/* Désallocation de la structure du MHH */
|
||||
|
||||
rc = ND_Desallocator_Exec( SM_Base->MHR->Desallocator_Ptr, MHH, NULL);
|
||||
rc = ND_Desallocator_Exec( MHH, SM_Base->MHR->Desallocator_Name, SM_Base->MHR->Desallocator_Ptr, NULL);
|
||||
if (rc != SMS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_MHH_End : unable to free the header of heap \"%s\"", MHH->Name);
|
||||
@ -3571,7 +3593,7 @@ SMT_DSH * SM_DataSegment_Init ( SMT_MHH * MHH, size_t Segment_Size)
|
||||
|
||||
/* Création de l'entête */
|
||||
|
||||
if( ND_Allocator_Exec( MHH->DSR->Allocator_Ptr, (void **)(&New_DSH), sizeof (SMT_DSH), NULL) != NDS_OK)
|
||||
if( ND_Allocator_Exec( (void **)(&New_DSH), sizeof (SMT_DSH), MHH->DSR->Allocator_Name, MHH->DSR->Allocator_Ptr, NULL) != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_DataSegment_Init : unable to allocate memory for the new data segment header");
|
||||
SM_Error_Print ();
|
||||
@ -3604,7 +3626,7 @@ SMT_DSH * SM_DataSegment_Init ( SMT_MHH * MHH, size_t Segment_Size)
|
||||
|
||||
SM_Error_Print ();
|
||||
|
||||
ND_Desallocator_Exec( MHH->DSR->Desallocator_Ptr, New_DSH, NULL);
|
||||
ND_Desallocator_Exec( New_DSH, MHH->DSR->Desallocator_Name, MHH->DSR->Desallocator_Ptr, NULL);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -3620,7 +3642,7 @@ SMT_DSH * SM_DataSegment_Init ( SMT_MHH * MHH, size_t Segment_Size)
|
||||
|
||||
shmctl (New_DSH->MemID, IPC_RMID, 0);
|
||||
|
||||
ND_Desallocator_Exec( MHH->DSR->Desallocator_Ptr, New_DSH, NULL);
|
||||
ND_Desallocator_Exec( New_DSH, MHH->DSR->Desallocator_Name, MHH->DSR->Desallocator_Ptr, NULL);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -3645,14 +3667,14 @@ SMT_DSH * SM_DataSegment_Init ( SMT_MHH * MHH, size_t Segment_Size)
|
||||
|
||||
/* Ajout du chunk libre à la liste des chunks libres du heap */
|
||||
|
||||
if (ND_Node_Add (MHH->FCR, Chunk_Node) != NDS_OK)
|
||||
if (ND_Index_Node_Add( MHH->FCR, NDD_INDEX_PRIMARY, Chunk_Node) != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_DataSegment_Init : unable to add a first chunk to the FCR structure of heap \"%s\"", MHH->Name);
|
||||
SM_Error_Print ();
|
||||
|
||||
shmctl (New_DSH->MemID, IPC_RMID, 0);
|
||||
|
||||
ND_Desallocator_Exec( MHH->DSR->Desallocator_Ptr, New_DSH, NULL);
|
||||
ND_Desallocator_Exec( New_DSH, MHH->DSR->Desallocator_Name, MHH->DSR->Desallocator_Ptr, NULL);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -3698,7 +3720,7 @@ SMT_Status SM_DataSegment_End (NDT_Root * Root, SMT_DSH *DSH)
|
||||
|
||||
/* Désallocation de l'entête */
|
||||
|
||||
rc = ND_Desallocator_Exec( Root->Desallocator_Ptr, DSH, NULL);
|
||||
rc = ND_Desallocator_Exec( DSH, Root->Desallocator_Name, Root->Desallocator_Ptr, NULL);
|
||||
if (rc != NDS_OK)
|
||||
{
|
||||
sprintf (SM_Error_Msg, "SM_DataSegment_End : the data segment header is nul");
|
||||
@ -3784,7 +3806,7 @@ size_t SM_DataSegment_Compress ( SMT_DSH *DSH, NDT_Root *FCR)
|
||||
|
||||
/* Recherche du premier chunk libre contenu dans le segment courant */
|
||||
|
||||
ND_Node_First_Get (FCR, &Node);
|
||||
ND_Index_Node_First_Get( &Node, FCR, NDD_INDEX_PRIMARY);
|
||||
|
||||
while (Found == FALSE && Node)
|
||||
{
|
||||
@ -3792,7 +3814,7 @@ size_t SM_DataSegment_Compress ( SMT_DSH *DSH, NDT_Root *FCR)
|
||||
else
|
||||
{
|
||||
if (Node >= (NDT_Node *)(DSH->Start)) Found = TRUE;
|
||||
else ND_Node_Next_Get (Node, &Node);
|
||||
else ND_Index_Node_Next_Get( &Node, Node);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3800,7 +3822,7 @@ size_t SM_DataSegment_Compress ( SMT_DSH *DSH, NDT_Root *FCR)
|
||||
|
||||
/* Parcours de tous les chunks libres du segment courant */
|
||||
|
||||
ND_Node_Next_Get (Node, &Next_Node);
|
||||
ND_Index_Node_Next_Get( &Next_Node, Node);
|
||||
|
||||
while (Next_Node && (void *)Next_Node < DSH_End)
|
||||
{
|
||||
@ -3812,7 +3834,7 @@ size_t SM_DataSegment_Compress ( SMT_DSH *DSH, NDT_Root *FCR)
|
||||
|
||||
if (Next_Node == (NDT_Node *)((size_t)(Chunk->Data) + Chunk->Size))
|
||||
{
|
||||
ND_Node_Remove (Next_Node);
|
||||
ND_Index_Node_Remove (Next_Node);
|
||||
|
||||
Compress = sizeof (SMT_Chunk) + sizeof (NDT_Node);
|
||||
|
||||
@ -3820,12 +3842,12 @@ size_t SM_DataSegment_Compress ( SMT_DSH *DSH, NDT_Root *FCR)
|
||||
|
||||
Total_Compress += Compress;
|
||||
|
||||
ND_Node_Next_Get (Node, &Next_Node);
|
||||
ND_Index_Node_Next_Get( &Next_Node, Node);
|
||||
}
|
||||
else
|
||||
{
|
||||
Node = Next_Node;
|
||||
ND_Node_Next_Get (Next_Node, &Next_Node);
|
||||
ND_Index_Node_Next_Get( &Next_Node, Next_Node);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* $RCSfile: libshmem.h,v $ */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* $Revision: 2.0 $ */
|
||||
/* $Revision: 2.1 $ */
|
||||
/* $Name: $ */
|
||||
/* $Date: 2005/01/24 22:57:06 $ */
|
||||
/* $Date: 2005/01/24 23:10:09 $ */
|
||||
/* $Author: agibert $ */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
@ -166,22 +166,22 @@ typedef union semun
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Allocation de mémoire dans la base */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
SMT_Status SM_Base_Alloc (size_t, void **, void *);
|
||||
NDT_Status SM_Base_Alloc( void **, size_t, void *);
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Désallocation de mémoire dans la base */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
SMT_Status SM_Base_Free (void *, void *);
|
||||
NDT_Status SM_Base_Free( void *, void *);
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Allocation de mémoire dans le heap système */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
SMT_Status SM_System_Alloc (size_t, void **, void *);
|
||||
NDT_Status SM_System_Alloc( void **, size_t, void *);
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Désallocation de mémoire dans le heap système */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
SMT_Status SM_System_Free (void *, void *);
|
||||
NDT_Status SM_System_Free( void *, void *);
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Initialisation de la base */
|
||||
|
@ -6,7 +6,7 @@
|
||||
#define SM_MODE 0 /* Utilisation des API sécurisés */
|
||||
#include <shmem.h>
|
||||
|
||||
/* VER_INFO_EXPORT (smadmin, "$Revision: 2.0 $", "$Name: $", __FILE__, "$Author: agibert $") */
|
||||
//VER_INFO_EXPORT (smadmin, "$Revision: 2.1 $", "$Name: $", __FILE__, "$Author: agibert $")
|
||||
|
||||
#define USAGE "Usage : %s [ --help | --version [-v] | --create | --destroy ]\n"
|
||||
|
||||
@ -56,13 +56,13 @@ int main (int argc, char ** argv)
|
||||
fprintf (stderr, USAGE, argv[0]);
|
||||
return -1;
|
||||
}
|
||||
else if (!strcmp (argv[1], "--version"))
|
||||
/* else if (!strcmp (argv[1], "--version"))
|
||||
{
|
||||
if (argc >= 3 && !strcmp (argv[2], "-v"))
|
||||
return VER_Object_Print (stdout, VERD_VERBOSE);
|
||||
else
|
||||
return VER_Object_Print (stdout, VERD_MINIMAL);
|
||||
}
|
||||
} */
|
||||
else if (!strcmp (argv[1], "--create"))
|
||||
{
|
||||
if (SM_Library_Open (0, NULL, SMD_CREATE | SMD_DEBUG_ALL) != SMS_OK)
|
||||
@ -261,8 +261,8 @@ int main (int argc, char ** argv)
|
||||
gets (name);
|
||||
if (SM_Heap_Open (name, &Heap, 0, SMD_OPEN | SMD_READ, &Locked) == SMS_OK)
|
||||
{
|
||||
ND_DataStruct_Info_Print (Heap->MHH->DSR, stdout);
|
||||
ND_DataStruct_Print (Heap->MHH->DSR, stdout);
|
||||
ND_DataStruct_Info_Print( stdout, Heap->MHH->DSR, NDD_RECURSIVE_MODE_PARENT_CHILD, 0, 0);
|
||||
ND_DataStruct_Value_Print( stdout, Heap->MHH->DSR, NDD_RECURSIVE_MODE_PARENT_CHILD, 0, 0);
|
||||
if (Locked == TRUE) SM_Heap_Unlock (Heap);
|
||||
}
|
||||
break;
|
||||
@ -272,8 +272,8 @@ int main (int argc, char ** argv)
|
||||
gets (name);
|
||||
if (SM_Heap_Open (name, &Heap, 0, SMD_OPEN | SMD_READ, &Locked) == SMS_OK)
|
||||
{
|
||||
ND_DataStruct_Info_Print (Heap->MHH->ACR, stdout);
|
||||
ND_DataStruct_Print (Heap->MHH->ACR, stdout);
|
||||
ND_DataStruct_Info_Print( stdout, Heap->MHH->ACR, NDD_RECURSIVE_MODE_PARENT_CHILD, 0, 0);
|
||||
ND_DataStruct_Value_Print( stdout, Heap->MHH->ACR, NDD_RECURSIVE_MODE_PARENT_CHILD, 0, 0);
|
||||
if (Locked == TRUE) SM_Heap_Unlock (Heap);
|
||||
}
|
||||
break;
|
||||
@ -283,8 +283,8 @@ int main (int argc, char ** argv)
|
||||
gets (name);
|
||||
if (SM_Heap_Open (name, &Heap, 0, SMD_OPEN | SMD_READ, &Locked) == SMS_OK)
|
||||
{
|
||||
ND_DataStruct_Info_Print (Heap->MHH->FCR, stdout);
|
||||
ND_DataStruct_Print (Heap->MHH->FCR, stdout);
|
||||
ND_DataStruct_Info_Print( stdout, Heap->MHH->FCR, NDD_RECURSIVE_MODE_PARENT_CHILD, 0, 0);
|
||||
ND_DataStruct_Value_Print( stdout, Heap->MHH->FCR, NDD_RECURSIVE_MODE_PARENT_CHILD, 0, 0);
|
||||
if (Locked == TRUE) SM_Heap_Unlock (Heap);
|
||||
}
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user