1616#include "memspace_internal.h"
1717#include "memtarget_internal.h"
1818#include "memtarget_ops.h"
19+ #include "utils_log.h"
1920
2021#ifndef NDEBUG
2122static umf_result_t
@@ -60,6 +61,10 @@ umf_result_t umfPoolCreateFromMemspace(umf_const_memspace_handle_t memspace,
6061 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
6162 }
6263
64+ if (memspace -> size == 0 ) {
65+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
66+ }
67+
6368 void * * privs = NULL ;
6469 umf_result_t ret = memoryTargetHandlesToPriv (memspace , & privs );
6570 if (ret != UMF_RESULT_SUCCESS ) {
@@ -85,6 +90,10 @@ umfMemoryProviderCreateFromMemspace(umf_const_memspace_handle_t memspace,
8590 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
8691 }
8792
93+ if (memspace -> size == 0 ) {
94+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
95+ }
96+
8897 void * * privs = NULL ;
8998 umf_result_t ret = memoryTargetHandlesToPriv (memspace , & privs );
9099 if (ret != UMF_RESULT_SUCCESS ) {
@@ -102,6 +111,25 @@ umfMemoryProviderCreateFromMemspace(umf_const_memspace_handle_t memspace,
102111 return ret ;
103112}
104113
114+ umf_result_t umfMemspaceNew (umf_memspace_handle_t * hMemspace ) {
115+ if (!hMemspace ) {
116+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
117+ }
118+
119+ umf_memspace_handle_t memspace =
120+ umf_ba_global_alloc (sizeof (struct umf_memspace_t ));
121+ if (!memspace ) {
122+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
123+ }
124+
125+ memspace -> size = 0 ;
126+ memspace -> nodes = NULL ;
127+
128+ * hMemspace = memspace ;
129+
130+ return UMF_RESULT_SUCCESS ;
131+ }
132+
105133void umfMemspaceDestroy (umf_memspace_handle_t memspace ) {
106134 assert (memspace );
107135 for (size_t i = 0 ; i < memspace -> size ; i ++ ) {
@@ -306,3 +334,95 @@ umfMemspaceMemtargetGet(umf_const_memspace_handle_t hMemspace,
306334 }
307335 return hMemspace -> nodes [targetNum ];
308336}
337+
338+ umf_result_t umfMemspaceMemtargetAdd (umf_memspace_handle_t hMemspace ,
339+ umf_const_memtarget_handle_t hMemtarget ) {
340+ if (!hMemspace || !hMemtarget ) {
341+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
342+ }
343+
344+ for (size_t i = 0 ; i < hMemspace -> size ; i ++ ) {
345+ int cmp ;
346+ umf_result_t ret =
347+ umfMemtargetCompare (hMemspace -> nodes [i ], hMemtarget , & cmp );
348+ if (ret != UMF_RESULT_SUCCESS ) {
349+ return ret ;
350+ }
351+
352+ if (cmp == 0 ) {
353+ LOG_ERR ("Memory target already exists in the memspace" );
354+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
355+ } else if (cmp < 0 ) {
356+ LOG_ERR ("You can't mix different memory target types in the same "
357+ "memspace" );
358+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
359+ }
360+ }
361+
362+ umf_memtarget_handle_t * newNodes =
363+ umf_ba_global_alloc (sizeof (* newNodes ) * (hMemspace -> size + 1 ));
364+ if (!newNodes ) {
365+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
366+ }
367+
368+ for (size_t i = 0 ; i < hMemspace -> size ; i ++ ) {
369+ newNodes [i ] = hMemspace -> nodes [i ];
370+ }
371+ umf_memtarget_t * hMemtargetClone ;
372+
373+ umf_result_t ret = umfMemtargetClone (hMemtarget , & hMemtargetClone );
374+ if (ret != UMF_RESULT_SUCCESS ) {
375+ umf_ba_global_free (newNodes );
376+ return ret ;
377+ }
378+ newNodes [hMemspace -> size ++ ] = hMemtargetClone ;
379+
380+ umf_ba_global_free (hMemspace -> nodes );
381+ hMemspace -> nodes = newNodes ;
382+ return UMF_RESULT_SUCCESS ;
383+ }
384+
385+ umf_result_t
386+ umfMemspaceMemtargetRemove (umf_memspace_handle_t hMemspace ,
387+ umf_const_memtarget_handle_t hMemtarget ) {
388+ if (!hMemspace || !hMemtarget ) {
389+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
390+ }
391+ unsigned i ;
392+ for (i = 0 ; i < hMemspace -> size ; i ++ ) {
393+ int cmp ;
394+ umf_result_t ret =
395+ umfMemtargetCompare (hMemspace -> nodes [i ], hMemtarget , & cmp );
396+
397+ if (ret != UMF_RESULT_SUCCESS ) {
398+ return ret ;
399+ }
400+
401+ if (cmp == 0 ) {
402+ break ;
403+ }
404+ }
405+
406+ if (i == hMemspace -> size ) {
407+ LOG_ERR ("Memory target not found in the memspace" );
408+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
409+ }
410+
411+ umf_memtarget_handle_t * newNodes =
412+ umf_ba_global_alloc (sizeof (* newNodes ) * (hMemspace -> size - 1 ));
413+ if (!newNodes ) {
414+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
415+ }
416+
417+ for (unsigned j = 0 , z = 0 ; j < hMemspace -> size ; j ++ ) {
418+ if (j != i ) {
419+ newNodes [z ++ ] = hMemspace -> nodes [j ];
420+ }
421+ }
422+
423+ umfMemtargetDestroy (hMemspace -> nodes [i ]);
424+ umf_ba_global_free (hMemspace -> nodes );
425+ hMemspace -> nodes = newNodes ;
426+ hMemspace -> size -- ;
427+ return UMF_RESULT_SUCCESS ;
428+ }
0 commit comments