@@ -240,6 +240,11 @@ TEST_P(FixedProviderTest, alloc_page64_align_one_half_pages_WRONG_ALIGNMENT_2) {
240
240
UMF_RESULT_ERROR_INVALID_ALIGNMENT, 0 );
241
241
}
242
242
243
+ TEST_P (FixedProviderTest, alloc_size_exceeds_buffer) {
244
+ size_t size = memory_size + page_size;
245
+ test_alloc_failure (size, 0 , UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY, 0 );
246
+ }
247
+
243
248
// Other positive tests
244
249
245
250
TEST_P (FixedProviderTest, get_min_page_size) {
@@ -334,11 +339,105 @@ TEST_F(test, create_with_zero_size) {
334
339
ASSERT_EQ (wrong_params, nullptr );
335
340
}
336
341
337
- TEST_P (FixedProviderTest, alloc_size_exceeds_buffer) {
338
- size_t size = memory_size + page_size;
339
- test_alloc_failure (size, 0 , UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY, 0 );
342
+ TEST_F (test, params_several_set_memory) {
343
+ umf_memory_provider_handle_t provider1 = nullptr , provider2 = nullptr ;
344
+ size_t memory_size1 = FIXED_BUFFER_SIZE,
345
+ memory_size2 = FIXED_BUFFER_SIZE * 10 ;
346
+ size_t alloc_size1 = memory_size1 / 2 , alloc_size2 = memory_size2 / 2 ;
347
+ void *memory_buffer1 = nullptr ;
348
+ void *memory_buffer2 = nullptr ;
349
+ memory_buffer1 = malloc (memory_size1);
350
+ memory_buffer2 = malloc (memory_size2);
351
+ void *ptr1 = nullptr ;
352
+ void *ptr2 = nullptr ;
353
+ const char *source_str = " Allocated memory!" ;
354
+
355
+ umf_fixed_memory_provider_params_handle_t params = nullptr ;
356
+ umf_result_t umf_result = umfFixedMemoryProviderParamsCreate (
357
+ ¶ms, memory_buffer1, memory_size1);
358
+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
359
+
360
+ umf_result = umfMemoryProviderCreate (umfFixedMemoryProviderOps (), params,
361
+ &provider1);
362
+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
363
+
364
+ umf_result = umfMemoryProviderAlloc (provider1, alloc_size1, 0 , &ptr1);
365
+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
366
+ ASSERT_NE (ptr1, nullptr );
367
+
368
+ // provider1: write to the allocated memory and free it
369
+ memset (ptr1, ' \0 ' , alloc_size1);
370
+ memcpy (ptr1, (const void *)source_str, sizeof (source_str));
371
+ ASSERT_GE ((uintptr_t )ptr1, (uintptr_t )memory_buffer1);
372
+ ASSERT_LE ((uintptr_t )ptr1 + alloc_size1,
373
+ (uintptr_t )memory_buffer1 + memory_size1);
374
+
375
+ umf_result = umfMemoryProviderFree (provider1, ptr1, alloc_size1);
376
+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
377
+
378
+ // Reuse the same params for the new provider
379
+ umf_result = umfFixedMemoryProviderParamsSetMemory (params, memory_buffer2,
380
+ memory_size2);
381
+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
382
+
383
+ umf_result = umfMemoryProviderCreate (umfFixedMemoryProviderOps (), params,
384
+ &provider2);
385
+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
386
+
387
+ umf_result = umfMemoryProviderAlloc (provider2, alloc_size2, 0 , &ptr2);
388
+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
389
+ ASSERT_NE (ptr2, nullptr );
390
+
391
+ // provider2: write to the allocated memory and free it
392
+ memset (ptr2, ' \0 ' , alloc_size2);
393
+ memcpy (ptr2, (const void *)source_str, sizeof (source_str));
394
+ ASSERT_GE ((uintptr_t )ptr2, (uintptr_t )memory_buffer2);
395
+ ASSERT_LE ((uintptr_t )ptr2 + alloc_size2,
396
+ (uintptr_t )memory_buffer2 + memory_size2);
397
+
398
+ umf_result = umfMemoryProviderFree (provider2, ptr2, alloc_size2);
399
+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
400
+
401
+ ASSERT_NE (ptr1, ptr2);
402
+ ASSERT_NE (provider1, provider2);
403
+
404
+ // Cleanup
405
+ umfMemoryProviderDestroy (provider1);
406
+ umfMemoryProviderDestroy (provider2);
407
+
408
+ umf_result = umfFixedMemoryProviderParamsDestroy (params);
409
+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
410
+
411
+ free (memory_buffer1);
412
+ free (memory_buffer2);
413
+ }
414
+
415
+ TEST_F (test, params_invalid_set_memory) {
416
+ constexpr size_t memory_size = 100 ;
417
+ char memory_buffer[memory_size];
418
+ umf_fixed_memory_provider_params_handle_t valid_params = nullptr ;
419
+ umf_result_t umf_result = umfFixedMemoryProviderParamsCreate (
420
+ &valid_params, memory_buffer, memory_size);
421
+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
422
+
423
+ umf_result =
424
+ umfFixedMemoryProviderParamsSetMemory (NULL , memory_buffer, memory_size);
425
+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
426
+
427
+ umf_result =
428
+ umfFixedMemoryProviderParamsSetMemory (valid_params, NULL , memory_size);
429
+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
430
+
431
+ umf_result =
432
+ umfFixedMemoryProviderParamsSetMemory (valid_params, memory_buffer, 0 );
433
+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
434
+
435
+ umf_result = umfFixedMemoryProviderParamsDestroy (valid_params);
436
+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
340
437
}
341
438
439
+ // Split / merge tests
440
+
342
441
TEST_P (FixedProviderTest, merge) {
343
442
umf_result_t umf_result;
344
443
void *ptr1 = nullptr ;
0 commit comments