Changeset b50b5af2 in mainline for uspace/lib
- Timestamp:
- 2009-08-22T10:48:00Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 04803bf
- Parents:
- 1ea99cc (diff), a71c158 (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/libc
- Files:
-
- 1 added
- 9 edited
-
generic/async.c (modified) (3 diffs)
-
generic/fibril_sync.c (modified) (5 diffs)
-
generic/io/printf_core.c (modified) (1 diff)
-
generic/io/vsnprintf.c (modified) (1 diff)
-
generic/ipc.c (modified) (1 diff)
-
generic/malloc.c (modified) (1 diff)
-
generic/vfs/vfs.c (modified) (14 diffs)
-
include/async.h (modified) (1 diff)
-
include/ipc/ipc.h (modified) (1 diff)
-
include/ipc/kbd.h (added)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libc/generic/async.c
r1ea99cc rb50b5af2 106 106 107 107 atomic_t async_futex = FUTEX_INITIALIZER; 108 109 /** Number of threads waiting for IPC in the kernel. */ 110 atomic_t threads_in_ipc_wait = { 0 }; 108 111 109 112 /** Structures of this type represent a waiting fibril. */ … … 683 686 684 687 futex_up(&async_futex); 688 689 atomic_inc(&threads_in_ipc_wait); 685 690 686 691 ipc_call_t call; … … 688 693 SYNCH_FLAGS_NONE); 689 694 695 atomic_dec(&threads_in_ipc_wait); 696 690 697 if (!callid) { 691 698 handle_expired_timeouts(); -
uspace/lib/libc/generic/fibril_sync.c
r1ea99cc rb50b5af2 40 40 #include <assert.h> 41 41 42 static void optimize_execution_power(void) 43 { 44 /* 45 * When waking up a worker fibril previously blocked in fibril 46 * synchronization, chances are that there is an idle manager fibril 47 * waiting for IPC, that could start executing the awakened worker 48 * fibril right away. We try to detect this and bring the manager 49 * fibril back to fruitful work. 50 */ 51 if (atomic_get(&threads_in_ipc_wait) > 0) 52 ipc_poke(); 53 } 54 42 55 void fibril_mutex_initialize(fibril_mutex_t *fm) 43 56 { … … 84 97 list_remove(&f->link); 85 98 fibril_add_ready((fid_t) f); 99 optimize_execution_power(); 86 100 } 87 101 } … … 152 166 fibril_add_ready((fid_t) f); 153 167 frw->writers++; 168 optimize_execution_power(); 154 169 break; 155 170 } else { … … 157 172 fibril_add_ready((fid_t) f); 158 173 frw->readers++; 174 optimize_execution_power(); 159 175 } 160 176 } … … 200 216 list_remove(&f->link); 201 217 fibril_add_ready((fid_t) f); 218 optimize_execution_power(); 202 219 if (once) 203 220 break; -
uspace/lib/libc/generic/io/printf_core.c
r1ea99cc rb50b5af2 490 490 counter += retval; 491 491 492 /* Print t ailing spaces */492 /* Print trailing spaces */ 493 493 494 494 while (width-- > 0) { -
uspace/lib/libc/generic/io/vsnprintf.c
r1ea99cc rb50b5af2 100 100 } 101 101 102 /* Buffer is big enough tto print the whole string */102 /* Buffer is big enough to print the whole string */ 103 103 memcpy((void *)(data->dst + data->len), (void *) str, size); 104 104 data->len += size; -
uspace/lib/libc/generic/ipc.c
r1ea99cc rb50b5af2 565 565 } 566 566 567 /** Interrupt one thread of this task from waiting for IPC. */ 568 void ipc_poke(void) 569 { 570 __SYSCALL0(SYS_IPC_POKE); 571 } 572 567 573 /** Ask destination to do a callback connection. 568 574 * -
uspace/lib/libc/generic/malloc.c
r1ea99cc rb50b5af2 392 392 if (orig_size - real_size >= STRUCT_OVERHEAD) { 393 393 /* Split the original block to a full block 394 and a t ailing free block */394 and a trailing free block */ 395 395 block_init((void *) head, real_size, false); 396 396 block_init((void *) head + real_size, -
uspace/lib/libc/generic/vfs/vfs.c
r1ea99cc rb50b5af2 122 122 int res; 123 123 ipcarg_t rc; 124 ipcarg_t rc_orig; 124 125 aid_t req; 125 126 dev_handle_t dev_handle; … … 141 142 rc = ipc_data_write_start(vfs_phone, (void *) mpa, mpa_size); 142 143 if (rc != EOK) { 143 async_wait_for(req, NULL);144 async_wait_for(req, &rc_orig); 144 145 async_serialize_end(); 145 146 futex_up(&vfs_phone_futex); 146 147 free(mpa); 147 return (int) rc; 148 if (rc_orig == EOK) 149 return (int) rc; 150 else 151 return (int) rc_orig; 148 152 } 149 153 150 154 rc = ipc_data_write_start(vfs_phone, (void *) opts, str_size(opts)); 151 155 if (rc != EOK) { 152 async_wait_for(req, NULL);156 async_wait_for(req, &rc_orig); 153 157 async_serialize_end(); 154 158 futex_up(&vfs_phone_futex); 155 159 free(mpa); 156 return (int) rc; 160 if (rc_orig == EOK) 161 return (int) rc; 162 else 163 return (int) rc_orig; 157 164 } 158 165 159 166 rc = ipc_data_write_start(vfs_phone, (void *) fs_name, str_size(fs_name)); 160 167 if (rc != EOK) { 161 async_wait_for(req, NULL);168 async_wait_for(req, &rc_orig); 162 169 async_serialize_end(); 163 170 futex_up(&vfs_phone_futex); 164 171 free(mpa); 165 return (int) rc; 172 if (rc_orig == EOK) 173 return (int) rc; 174 else 175 return (int) rc_orig; 166 176 } 167 177 … … 169 179 rc = async_req_0_0(vfs_phone, IPC_M_PING); 170 180 if (rc != EOK) { 171 async_wait_for(req, NULL);181 async_wait_for(req, &rc_orig); 172 182 async_serialize_end(); 173 183 futex_up(&vfs_phone_futex); 174 184 free(mpa); 175 return (int) rc; 185 if (rc_orig == EOK) 186 return (int) rc; 187 else 188 return (int) rc_orig; 176 189 } 177 190 … … 202 215 rc = ipc_data_write_start(vfs_phone, pa, pa_size); 203 216 if (rc != EOK) { 204 async_wait_for(req, NULL); 217 ipcarg_t rc_orig; 218 219 async_wait_for(req, &rc_orig); 205 220 async_serialize_end(); 206 221 futex_up(&vfs_phone_futex); 207 222 free(pa); 208 return (int) rc; 223 if (rc_orig == EOK) 224 return (int) rc; 225 else 226 return (int) rc_orig; 209 227 } 210 228 async_wait_for(req, &rc); … … 240 258 241 259 if (rc != EOK) 242 return (int) rc;260 return (int) rc; 243 261 244 262 return (int) IPC_GET_ARG1(answer); … … 274 292 rc = ipc_data_read_start(vfs_phone, (void *)buf, nbyte); 275 293 if (rc != EOK) { 276 async_wait_for(req, NULL); 277 async_serialize_end(); 278 futex_up(&vfs_phone_futex); 279 return (ssize_t) rc; 294 ipcarg_t rc_orig; 295 296 async_wait_for(req, &rc_orig); 297 async_serialize_end(); 298 futex_up(&vfs_phone_futex); 299 if (rc_orig == EOK) 300 return (ssize_t) rc; 301 else 302 return (ssize_t) rc_orig; 280 303 } 281 304 async_wait_for(req, &rc); … … 301 324 rc = ipc_data_write_start(vfs_phone, (void *)buf, nbyte); 302 325 if (rc != EOK) { 303 async_wait_for(req, NULL); 304 async_serialize_end(); 305 futex_up(&vfs_phone_futex); 306 return (ssize_t) rc; 326 ipcarg_t rc_orig; 327 328 async_wait_for(req, &rc_orig); 329 async_serialize_end(); 330 futex_up(&vfs_phone_futex); 331 if (rc_orig == EOK) 332 return (ssize_t) rc; 333 else 334 return (ssize_t) rc_orig; 307 335 } 308 336 async_wait_for(req, &rc); … … 376 404 rc = ipc_data_read_start(vfs_phone, (void *)stat, sizeof(struct stat)); 377 405 if (rc != EOK) { 378 async_wait_for(req, NULL); 379 async_serialize_end(); 380 futex_up(&vfs_phone_futex); 381 return (ssize_t) rc; 406 ipcarg_t rc_orig; 407 408 async_wait_for(req, &rc_orig); 409 async_serialize_end(); 410 futex_up(&vfs_phone_futex); 411 if (rc_orig == EOK) 412 return (ssize_t) rc; 413 else 414 return (ssize_t) rc_orig; 382 415 } 383 416 async_wait_for(req, &rc); … … 391 424 { 392 425 ipcarg_t rc; 426 ipcarg_t rc_orig; 393 427 aid_t req; 394 428 … … 405 439 rc = ipc_data_write_start(vfs_phone, pa, pa_size); 406 440 if (rc != EOK) { 407 async_wait_for(req, NULL);441 async_wait_for(req, &rc_orig); 408 442 async_serialize_end(); 409 443 futex_up(&vfs_phone_futex); 410 444 free(pa); 411 return (int) rc; 445 if (rc_orig == EOK) 446 return (int) rc; 447 else 448 return (int) rc_orig; 412 449 } 413 450 rc = ipc_data_read_start(vfs_phone, stat, sizeof(struct stat)); 414 451 if (rc != EOK) { 415 async_wait_for(req, NULL);452 async_wait_for(req, &rc_orig); 416 453 async_serialize_end(); 417 454 futex_up(&vfs_phone_futex); 418 455 free(pa); 419 return (int) rc; 456 if (rc_orig == EOK) 457 return (int) rc; 458 else 459 return (int) rc_orig; 420 460 } 421 461 async_wait_for(req, &rc); … … 476 516 rc = ipc_data_write_start(vfs_phone, pa, pa_size); 477 517 if (rc != EOK) { 478 async_wait_for(req, NULL); 518 ipcarg_t rc_orig; 519 520 async_wait_for(req, &rc_orig); 479 521 async_serialize_end(); 480 522 futex_up(&vfs_phone_futex); 481 523 free(pa); 482 return (int) rc; 524 if (rc_orig == EOK) 525 return (int) rc; 526 else 527 return (int) rc_orig; 483 528 } 484 529 async_wait_for(req, &rc); … … 506 551 rc = ipc_data_write_start(vfs_phone, pa, pa_size); 507 552 if (rc != EOK) { 508 async_wait_for(req, NULL); 553 ipcarg_t rc_orig; 554 555 async_wait_for(req, &rc_orig); 509 556 async_serialize_end(); 510 557 futex_up(&vfs_phone_futex); 511 558 free(pa); 512 return (int) rc; 559 if (rc_orig == EOK) 560 return (int) rc; 561 else 562 return (int) rc_orig; 513 563 } 514 564 async_wait_for(req, &rc); … … 532 582 { 533 583 ipcarg_t rc; 584 ipcarg_t rc_orig; 534 585 aid_t req; 535 586 … … 553 604 rc = ipc_data_write_start(vfs_phone, olda, olda_size); 554 605 if (rc != EOK) { 555 async_wait_for(req, NULL);606 async_wait_for(req, &rc_orig); 556 607 async_serialize_end(); 557 608 futex_up(&vfs_phone_futex); 558 609 free(olda); 559 610 free(newa); 560 return (int) rc; 611 if (rc_orig == EOK) 612 return (int) rc; 613 else 614 return (int) rc_orig; 561 615 } 562 616 rc = ipc_data_write_start(vfs_phone, newa, newa_size); 563 617 if (rc != EOK) { 564 async_wait_for(req, NULL);618 async_wait_for(req, &rc_orig); 565 619 async_serialize_end(); 566 620 futex_up(&vfs_phone_futex); 567 621 free(olda); 568 622 free(newa); 569 return (int) rc; 623 if (rc_orig == EOK) 624 return (int) rc; 625 else 626 return (int) rc_orig; 570 627 } 571 628 async_wait_for(req, &rc); -
uspace/lib/libc/include/async.h
r1ea99cc rb50b5af2 47 47 extern atomic_t async_futex; 48 48 49 extern atomic_t threads_in_ipc_wait; 50 49 51 extern int __async_init(void); 50 52 extern ipc_callid_t async_get_call_timeout(ipc_call_t *call, suseconds_t usecs); -
uspace/lib/libc/include/ipc/ipc.h
r1ea99cc rb50b5af2 192 192 extern ipc_callid_t ipc_wait_cycle(ipc_call_t *, uint32_t, int); 193 193 extern ipc_callid_t ipc_wait_for_call_timeout(ipc_call_t *, uint32_t); 194 extern void ipc_poke(void); 194 195 195 196 static inline ipc_callid_t ipc_wait_for_call(ipc_call_t *data)
Note:
See TracChangeset
for help on using the changeset viewer.
