16
16
#include "memspace_internal.h"
17
17
#include "memtarget_internal.h"
18
18
#include "memtarget_ops.h"
19
+ #include "utils_log.h"
19
20
20
21
#ifndef NDEBUG
21
22
static umf_result_t
@@ -60,6 +61,10 @@ umf_result_t umfPoolCreateFromMemspace(umf_const_memspace_handle_t memspace,
60
61
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
61
62
}
62
63
64
+ if (memspace -> size == 0 ) {
65
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
66
+ }
67
+
63
68
void * * privs = NULL ;
64
69
umf_result_t ret = memoryTargetHandlesToPriv (memspace , & privs );
65
70
if (ret != UMF_RESULT_SUCCESS ) {
@@ -85,6 +90,10 @@ umfMemoryProviderCreateFromMemspace(umf_const_memspace_handle_t memspace,
85
90
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
86
91
}
87
92
93
+ if (memspace -> size == 0 ) {
94
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
95
+ }
96
+
88
97
void * * privs = NULL ;
89
98
umf_result_t ret = memoryTargetHandlesToPriv (memspace , & privs );
90
99
if (ret != UMF_RESULT_SUCCESS ) {
@@ -102,6 +111,25 @@ umfMemoryProviderCreateFromMemspace(umf_const_memspace_handle_t memspace,
102
111
return ret ;
103
112
}
104
113
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
+
105
133
void umfMemspaceDestroy (umf_memspace_handle_t memspace ) {
106
134
assert (memspace );
107
135
for (size_t i = 0 ; i < memspace -> size ; i ++ ) {
@@ -306,3 +334,95 @@ umfMemspaceMemtargetGet(umf_const_memspace_handle_t hMemspace,
306
334
}
307
335
return hMemspace -> nodes [targetNum ];
308
336
}
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