Changeset 90478727 in mainline for uspace/lib/c/generic
- Timestamp:
- 2012-08-12T11:46:44Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 41b764b7
- Parents:
- e1e4192 (diff), 371cb6c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- uspace/lib/c/generic
- Files:
-
- 1 added
- 10 edited
-
as.c (modified) (1 diff)
-
async.c (modified) (1 diff)
-
device/ahci.c (added)
-
devman.c (modified) (2 diffs)
-
elf/elf_load.c (modified) (1 diff)
-
fibril.c (modified) (1 diff)
-
loc.c (modified) (1 diff)
-
malloc.c (modified) (10 diffs)
-
mman.c (modified) (1 diff)
-
str.c (modified) (5 diffs)
-
thread.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/as.c
re1e4192 r90478727 46 46 * 47 47 * @param base Starting virtual address of the area. 48 * If set to (void *) -1, the kernel finds49 * a mappable area.48 * If set to AS_AREA_ANY ((void *) -1), 49 * the kernel finds a mappable area. 50 50 * @param size Size of the area. 51 51 * @param flags Flags describing type of the area. 52 52 * 53 53 * @return Starting virtual address of the created area on success. 54 * @return (void *) -1otherwise.54 * @return AS_MAP_FAILED ((void *) -1) otherwise. 55 55 * 56 56 */ -
uspace/lib/c/generic/async.c
re1e4192 r90478727 1388 1388 1389 1389 futex_down(&async_futex); 1390 if (msg->done) 1390 if (msg->done) { 1391 1391 amsg_destroy(msg); 1392 else 1392 } else { 1393 msg->dataptr = NULL; 1393 1394 msg->forget = true; 1395 } 1394 1396 futex_up(&async_futex); 1395 1397 } -
uspace/lib/c/generic/devman.c
re1e4192 r90478727 430 430 async_wait_for(req, &retval); 431 431 432 if (retval != EOK) 433 return retval; 432 if (retval != EOK) { 433 return retval; 434 } 434 435 435 436 act_size = IPC_GET_ARG2(dreply); … … 449 450 { 450 451 return devman_get_str_internal(DEVMAN_FUN_GET_NAME, handle, buf, 452 buf_size); 453 } 454 455 int devman_fun_get_driver_name(devman_handle_t handle, char *buf, size_t buf_size) 456 { 457 return devman_get_str_internal(DEVMAN_FUN_GET_DRIVER_NAME, handle, buf, 451 458 buf_size); 452 459 } -
uspace/lib/c/generic/elf/elf_load.c
re1e4192 r90478727 366 366 a = as_area_create((uint8_t *) base + bias, mem_sz, 367 367 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE); 368 if (a == (void *) -1) {368 if (a == AS_MAP_FAILED) { 369 369 DPRINTF("memory mapping failed (0x%x, %d)\n", 370 370 base + bias, mem_sz); -
uspace/lib/c/generic/fibril.c
re1e4192 r90478727 286 286 } 287 287 288 /** Delete a fibril that has never run. 289 * 290 * Free resources of a fibril that has been created with fibril_create() 291 * but never readied using fibril_add_ready(). 292 * 293 * @param fid Pointer to the fibril structure of the fibril to be 294 * added. 295 */ 296 void fibril_destroy(fid_t fid) 297 { 298 fibril_t *fibril = (fibril_t *) fid; 299 300 free(fibril->stack); 301 fibril_teardown(fibril); 302 } 303 288 304 /** Add a fibril to the ready list. 289 305 * -
uspace/lib/c/generic/loc.c
re1e4192 r90478727 450 450 } 451 451 452 /** Get service server name. 453 * 454 * Provided ID of a service, return the name of its server. 455 * 456 * @param svc_id Service ID 457 * @param name Place to store pointer to new string. Caller should 458 * free it using free(). 459 * @return EOK on success or negative error code 460 */ 461 int loc_service_get_server_name(service_id_t svc_id, char **name) 462 { 463 return loc_get_name_internal(LOC_SERVICE_GET_SERVER_NAME, svc_id, name); 464 } 465 452 466 int loc_namespace_get_id(const char *name, service_id_t *handle, 453 467 unsigned int flags) -
uspace/lib/c/generic/malloc.c
re1e4192 r90478727 109 109 (((uintptr_t) (area)->end) - sizeof(heap_block_foot_t)) 110 110 111 #define AREA_LAST_BLOCK_HEAD(area) \ 112 ((uintptr_t) BLOCK_HEAD(((heap_block_foot_t *) AREA_LAST_BLOCK_FOOT(area)))) 113 111 114 /** Get header in heap block. 112 115 * … … 285 288 /* Align the heap area size on page boundary */ 286 289 size_t asize = ALIGN_UP(size, PAGE_SIZE); 287 void *astart = as_area_create( (void *) -1, asize,290 void *astart = as_area_create(AS_AREA_ANY, asize, 288 291 AS_AREA_WRITE | AS_AREA_READ); 289 if (astart == (void *) -1)292 if (astart == AS_MAP_FAILED) 290 293 return false; 291 294 … … 346 349 return false; 347 350 348 /* Add new free block */ 349 size_t net_size = (size_t) (end - area->end); 350 if (net_size > 0) 351 block_init(area->end, net_size, true, area); 351 heap_block_head_t *last_head = 352 (heap_block_head_t *) AREA_LAST_BLOCK_HEAD(area); 353 354 if (last_head->free) { 355 /* Add the new space to the last block. */ 356 size_t net_size = (size_t) (end - area->end) + last_head->size; 357 malloc_assert(net_size > 0); 358 block_init(last_head, net_size, true, area); 359 } else { 360 /* Add new free block */ 361 size_t net_size = (size_t) (end - area->end); 362 if (net_size > 0) 363 block_init(area->end, net_size, true, area); 364 } 352 365 353 366 /* Update heap area parameters */ … … 355 368 356 369 return true; 357 }358 359 /** Try to enlarge any of the heap areas360 *361 * Should be called only inside the critical section.362 *363 * @param size Gross size of item to allocate (bytes).364 *365 */366 static bool heap_grow(size_t size)367 {368 if (size == 0)369 return true;370 371 /* First try to enlarge some existing area */372 for (heap_area_t *area = first_heap_area; area != NULL;373 area = area->next) {374 if (area_grow(area, size))375 return true;376 }377 378 /* Eventually try to create a new area */379 return area_create(AREA_OVERHEAD(size));380 370 } 381 371 … … 661 651 } 662 652 653 /** Try to enlarge any of the heap areas. 654 * 655 * If successful, allocate block of the given size in the area. 656 * Should be called only inside the critical section. 657 * 658 * @param size Gross size of item to allocate (bytes). 659 * @param align Memory address alignment. 660 * 661 * @return Allocated block. 662 * @return NULL on failure. 663 * 664 */ 665 static void *heap_grow_and_alloc(size_t size, size_t align) 666 { 667 if (size == 0) 668 return NULL; 669 670 /* First try to enlarge some existing area */ 671 for (heap_area_t *area = first_heap_area; area != NULL; 672 area = area->next) { 673 674 if (area_grow(area, size + align)) { 675 heap_block_head_t *first = 676 (heap_block_head_t *) AREA_LAST_BLOCK_HEAD(area); 677 678 void *addr = 679 malloc_area(area, first, NULL, size, align); 680 malloc_assert(addr != NULL); 681 return addr; 682 } 683 } 684 685 /* Eventually try to create a new area */ 686 if (area_create(AREA_OVERHEAD(size + align))) { 687 heap_block_head_t *first = 688 (heap_block_head_t *) AREA_FIRST_BLOCK_HEAD(last_heap_area); 689 690 void *addr = 691 malloc_area(last_heap_area, first, NULL, size, align); 692 malloc_assert(addr != NULL); 693 return addr; 694 } 695 696 return NULL; 697 } 698 663 699 /** Allocate a memory block 664 700 * … … 679 715 680 716 size_t falign = lcm(align, BASE_ALIGN); 681 size_t real_size = GROSS_SIZE(ALIGN_UP(size, falign)); 682 683 bool retry = false; 684 heap_block_head_t *split; 685 686 loop: 717 718 /* Check for integer overflow. */ 719 if (falign < align) 720 return NULL; 721 722 /* 723 * The size of the allocated block needs to be naturally 724 * aligned, because the footer structure also needs to reside 725 * on a naturally aligned address in order to avoid unaligned 726 * memory accesses. 727 */ 728 size_t gross_size = GROSS_SIZE(ALIGN_UP(size, BASE_ALIGN)); 687 729 688 730 /* Try the next fit approach */ 689 split = next_fit;731 heap_block_head_t *split = next_fit; 690 732 691 733 if (split != NULL) { 692 void *addr = malloc_area(split->area, split, NULL, real_size,734 void *addr = malloc_area(split->area, split, NULL, gross_size, 693 735 falign); 694 736 … … 703 745 AREA_FIRST_BLOCK_HEAD(area); 704 746 705 void *addr = malloc_area(area, first, split, real_size,747 void *addr = malloc_area(area, first, split, gross_size, 706 748 falign); 707 749 … … 710 752 } 711 753 712 if (!retry) { 713 /* Try to grow the heap space */ 714 if (heap_grow(real_size)) { 715 retry = true; 716 goto loop; 717 } 718 } 719 720 return NULL; 754 /* Finally, try to grow heap space and allocate in the new area. */ 755 return heap_grow_and_alloc(gross_size, falign); 721 756 } 722 757 … … 731 766 void *calloc(const size_t nmemb, const size_t size) 732 767 { 768 // FIXME: Check for overflow 769 733 770 void *block = malloc(nmemb * size); 734 771 if (block == NULL) … … 870 907 if (addr == NULL) 871 908 return; 872 909 873 910 futex_down(&malloc_futex); 874 911 -
uspace/lib/c/generic/mman.c
re1e4192 r90478727 42 42 { 43 43 if (!start) 44 start = (void *) -1;44 start = AS_AREA_ANY; 45 45 46 46 // if (!((flags & MAP_SHARED) ^ (flags & MAP_PRIVATE))) -
uspace/lib/c/generic/str.c
re1e4192 r90478727 428 428 * 429 429 * Do a char-by-char comparison of two NULL-terminated strings. 430 * The strings are considered equal iff they consist of the same 431 * characters on the minimum of their lengths. 430 * The strings are considered equal iff their length is equal 431 * and both strings consist of the same sequence of characters. 432 * 433 * A string S1 is less than another string S2 if it has a character with 434 * lower value at the first character position where the strings differ. 435 * If the strings differ in length, the shorter one is treated as if 436 * padded by characters with a value of zero. 432 437 * 433 438 * @param s1 First string to compare. 434 439 * @param s2 Second string to compare. 435 440 * 436 * @return 0 if the strings are equal, -1 if first is smaller,437 * 1 if second smaller.441 * @return 0 if the strings are equal, -1 if the first is less than the second, 442 * 1 if the second is less than the first. 438 443 * 439 444 */ … … 466 471 * 467 472 * Do a char-by-char comparison of two NULL-terminated strings. 468 * The strings are considered equal iff they consist of the same 469 * characters on the minimum of their lengths and the length limit. 473 * The strings are considered equal iff 474 * min(str_length(s1), max_len) == min(str_length(s2), max_len) 475 * and both strings consist of the same sequence of characters, 476 * up to max_len characters. 477 * 478 * A string S1 is less than another string S2 if it has a character with 479 * lower value at the first character position where the strings differ. 480 * If the strings differ in length, the shorter one is treated as if 481 * padded by characters with a value of zero. Only the first max_len 482 * characters are considered. 470 483 * 471 484 * @param s1 First string to compare. … … 473 486 * @param max_len Maximum number of characters to consider. 474 487 * 475 * @return 0 if the strings are equal, -1 if first is smaller,476 * 1 if second smaller.488 * @return 0 if the strings are equal, -1 if the first is less than the second, 489 * 1 if the second is less than the first. 477 490 * 478 491 */ … … 508 521 return 0; 509 522 523 } 524 525 /** Test whether p is a prefix of s. 526 * 527 * Do a char-by-char comparison of two NULL-terminated strings 528 * and determine if p is a prefix of s. 529 * 530 * @param s The string in which to look 531 * @param p The string to check if it is a prefix of s 532 * 533 * @return true iff p is prefix of s else false 534 * 535 */ 536 bool str_test_prefix(const char *s, const char *p) 537 { 538 wchar_t c1 = 0; 539 wchar_t c2 = 0; 540 541 size_t off1 = 0; 542 size_t off2 = 0; 543 544 while (true) { 545 c1 = str_decode(s, &off1, STR_NO_LIMIT); 546 c2 = str_decode(p, &off2, STR_NO_LIMIT); 547 548 if (c2 == 0) 549 return true; 550 551 if (c1 != c2) 552 return false; 553 554 if (c1 == 0) 555 break; 556 } 557 558 return false; 510 559 } 511 560 … … 1085 1134 c = (c >= 'a' ? c - 'a' + 10 : (c >= 'A' ? c - 'A' + 10 : 1086 1135 (c <= '9' ? c - '0' : 0xff))); 1087 if (c > base) {1136 if (c >= base) { 1088 1137 break; 1089 1138 } -
uspace/lib/c/generic/thread.c
re1e4192 r90478727 41 41 #include <str.h> 42 42 #include <async.h> 43 #include <errno.h> 44 #include <as.h> 43 45 #include "private/thread.h" 44 46 45 #ifndef THREAD_INITIAL_STACK_PAGES _NO46 #define THREAD_INITIAL_STACK_PAGES_NO 2 47 #ifndef THREAD_INITIAL_STACK_PAGES 48 #define THREAD_INITIAL_STACK_PAGES 2 47 49 #endif 48 50 … … 65 67 66 68 uarg->uspace_thread_function(uarg->uspace_thread_arg); 67 /* XXX: we cannot free the userspace stack while running on it 68 free(uarg->uspace_stack); 69 free(uarg); 70 */ 69 /* 70 * XXX: we cannot free the userspace stack while running on it 71 * 72 * free(uarg->uspace_stack); 73 * free(uarg); 74 */ 71 75 72 76 /* If there is a manager, destroy it */ … … 92 96 thread_id_t *tid) 93 97 { 94 char *stack; 95 uspace_arg_t *uarg; 96 int rc; 97 98 stack = (char *) malloc(getpagesize() * THREAD_INITIAL_STACK_PAGES_NO); 99 if (!stack) 100 return -1; 101 102 uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t)); 103 if (!uarg) { 104 free(stack); 105 return -1; 98 uspace_arg_t *uarg = 99 (uspace_arg_t *) malloc(sizeof(uspace_arg_t)); 100 if (!uarg) 101 return ENOMEM; 102 103 size_t stack_size = getpagesize() * THREAD_INITIAL_STACK_PAGES; 104 void *stack = as_area_create(AS_AREA_ANY, stack_size, 105 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE); 106 if (stack == AS_MAP_FAILED) { 107 free(uarg); 108 return ENOMEM; 106 109 } 107 110 108 111 uarg->uspace_entry = (void *) FADDR(__thread_entry); 109 uarg->uspace_stack = (void *) stack; 112 uarg->uspace_stack = stack; 113 uarg->uspace_stack_size = stack_size; 110 114 uarg->uspace_thread_function = function; 111 115 uarg->uspace_thread_arg = arg; 112 116 uarg->uspace_uarg = uarg; 113 117 114 rc = __SYSCALL4(SYS_THREAD_CREATE, (sysarg_t) uarg, (sysarg_t) name,115 (sysarg_t) str_size(name), (sysarg_t) tid);118 int rc = __SYSCALL4(SYS_THREAD_CREATE, (sysarg_t) uarg, 119 (sysarg_t) name, (sysarg_t) str_size(name), (sysarg_t) tid); 116 120 117 if (rc ) {121 if (rc != EOK) { 118 122 /* 119 123 * Failed to create a new thread. 120 * Free up the allocated structures.124 * Free up the allocated data. 121 125 */ 126 as_area_destroy(stack); 122 127 free(uarg); 123 free(stack);124 128 } 125 129 126 130 return rc; 127 131 }
Note:
See TracChangeset
for help on using the changeset viewer.
