Changeset 0cc4313 in mainline for uspace/lib/libc/generic/async.c
- Timestamp:
- 2007-11-22T15:50:24Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d40a8ff
- Parents:
- 8498915
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libc/generic/async.c
r8498915 r0cc4313 102 102 #include <sys/time.h> 103 103 #include <arch/barrier.h> 104 #include <bool.h> 104 105 105 106 atomic_t async_futex = FUTEX_INITIALIZER; … … 176 177 * disabled. 177 178 */ 178 __thread int in_interrupt_handler;179 __thread int _in_interrupt_handler; 179 180 180 181 static void default_client_connection(ipc_callid_t callid, ipc_call_t *call); … … 190 191 */ 191 192 static async_client_conn_t interrupt_received = default_interrupt_received; 193 194 /* 195 * Getter for _in_interrupt_handler. We need to export the value of this thread 196 * local variable to other modules, but the binutils 2.18 linkers die on an 197 * attempt to export this symbol in the header file. For now, consider this as a 198 * workaround. 199 */ 200 bool in_interrupt_handler(void) 201 { 202 return _in_interrupt_handler; 203 } 192 204 193 205 #define CONN_HASH_TABLE_CHAINS 32 … … 518 530 /* Unrouted call - do some default behaviour */ 519 531 if ((callid & IPC_CALLID_NOTIFICATION)) { 520 in_interrupt_handler = 1;532 _in_interrupt_handler = 1; 521 533 (*interrupt_received)(callid, call); 522 in_interrupt_handler = 0;534 _in_interrupt_handler = 0; 523 535 return; 524 536 } … … 717 729 * @param arg1 Service-defined payload argument. 718 730 * @param arg2 Service-defined payload argument. 731 * @param arg3 Service-defined payload argument. 732 * @param arg4 Service-defined payload argument. 719 733 * @param dataptr If non-NULL, storage where the reply data will be 720 734 * stored. … … 722 736 * @return Hash of the sent message. 723 737 */ 724 aid_t async_send_ 2(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2,725 ipc _call_t *dataptr)738 aid_t async_send_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, 739 ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipc_call_t *dataptr) 726 740 { 727 741 amsg_t *msg; 728 742 729 if ( in_interrupt_handler) {743 if (_in_interrupt_handler) { 730 744 printf("Cannot send asynchronous request in interrupt " 731 745 "handler.\n"); … … 740 754 msg->wdata.active = 1; 741 755 742 ipc_call_async_2(phoneid, method, arg1, arg2, msg, reply_received, 1); 756 ipc_call_async_4(phoneid, method, arg1, arg2, arg3, arg4, msg, 757 reply_received, 1); 743 758 744 759 return (aid_t) msg; … … 755 770 * @param arg2 Service-defined payload argument. 756 771 * @param arg3 Service-defined payload argument. 772 * @param arg4 Service-defined payload argument. 773 * @param arg5 Service-defined payload argument. 757 774 * @param dataptr If non-NULL, storage where the reply data will be 758 775 * stored. … … 760 777 * @return Hash of the sent message. 761 778 */ 762 aid_t async_send_3(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2, 763 ipcarg_t arg3, ipc_call_t *dataptr) 779 aid_t async_send_slow(int phoneid, ipcarg_t method, ipcarg_t arg1, 780 ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, 781 ipc_call_t *dataptr) 764 782 { 765 783 amsg_t *msg; 766 784 767 if ( in_interrupt_handler) {785 if (_in_interrupt_handler) { 768 786 printf("Cannot send asynchronous request in interrupt " 769 787 "handler.\n"); … … 777 795 /* We may sleep in next method, but it will use its own mechanism */ 778 796 msg->wdata.active = 1; 779 780 ipc_call_async_ 3(phoneid, method, arg1, arg2, arg3, msg, reply_received,781 1);797 798 ipc_call_async_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, msg, 799 reply_received, 1); 782 800 783 801 return (aid_t) msg; … … 867 885 amsg_t *msg; 868 886 869 if ( in_interrupt_handler) {887 if (_in_interrupt_handler) { 870 888 printf("Cannot call async_usleep in interrupt handler.\n"); 871 889 _exit(1); … … 909 927 } 910 928 911 /* Primitive functions for simple communication */ 912 void async_msg_3(int phoneid, ipcarg_t method, ipcarg_t arg1, 913 ipcarg_t arg2, ipcarg_t arg3) 914 { 915 ipc_call_async_3(phoneid, method, arg1, arg2, arg3, NULL, NULL, 916 !in_interrupt_handler); 917 } 918 919 void async_msg_2(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2) 920 { 921 ipc_call_async_2(phoneid, method, arg1, arg2, NULL, NULL, 922 !in_interrupt_handler); 929 /** Pseudo-synchronous message sending - fast version. 930 * 931 * Send message asynchronously and return only after the reply arrives. 932 * 933 * This function can only transfer 4 register payload arguments. For 934 * transferring more arguments, see the slower async_req_slow(). 935 * 936 * @param phoneid Hash of the phone through which to make the call. 937 * @param method Method of the call. 938 * @param arg1 Service-defined payload argument. 939 * @param arg2 Service-defined payload argument. 940 * @param arg3 Service-defined payload argument. 941 * @param arg4 Service-defined payload argument. 942 * @param r1 If non-NULL, storage for the 1st reply argument. 943 * @param r2 If non-NULL, storage for the 2nd reply argument. 944 * @param r3 If non-NULL, storage for the 3rd reply argument. 945 * @param r4 If non-NULL, storage for the 4th reply argument. 946 * @param r5 If non-NULL, storage for the 5th reply argument. 947 * @return Return code of the reply or a negative error code. 948 */ 949 ipcarg_t async_req_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, 950 ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t *r1, ipcarg_t *r2, 951 ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5) 952 { 953 ipc_call_t result; 954 ipcarg_t rc; 955 956 aid_t eid = async_send_4(phoneid, method, arg1, arg2, arg3, arg4, 957 &result); 958 async_wait_for(eid, &rc); 959 if (r1) 960 *r1 = IPC_GET_ARG1(result); 961 if (r2) 962 *r2 = IPC_GET_ARG2(result); 963 if (r3) 964 *r3 = IPC_GET_ARG3(result); 965 if (r4) 966 *r4 = IPC_GET_ARG4(result); 967 if (r5) 968 *r5 = IPC_GET_ARG5(result); 969 return rc; 970 } 971 972 /** Pseudo-synchronous message sending - slow version. 973 * 974 * Send message asynchronously and return only after the reply arrives. 975 * 976 * @param phoneid Hash of the phone through which to make the call. 977 * @param method Method of the call. 978 * @param arg1 Service-defined payload argument. 979 * @param arg2 Service-defined payload argument. 980 * @param arg3 Service-defined payload argument. 981 * @param arg4 Service-defined payload argument. 982 * @param arg5 Service-defined payload argument. 983 * @param r1 If non-NULL, storage for the 1st reply argument. 984 * @param r2 If non-NULL, storage for the 2nd reply argument. 985 * @param r3 If non-NULL, storage for the 3rd reply argument. 986 * @param r4 If non-NULL, storage for the 4th reply argument. 987 * @param r5 If non-NULL, storage for the 5th reply argument. 988 * @return Return code of the reply or a negative error code. 989 */ 990 ipcarg_t async_req_slow(int phoneid, ipcarg_t method, ipcarg_t arg1, 991 ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, ipcarg_t *r1, 992 ipcarg_t *r2, ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5) 993 { 994 ipc_call_t result; 995 ipcarg_t rc; 996 997 aid_t eid = async_send_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, 998 &result); 999 async_wait_for(eid, &rc); 1000 if (r1) 1001 *r1 = IPC_GET_ARG1(result); 1002 if (r2) 1003 *r2 = IPC_GET_ARG2(result); 1004 if (r3) 1005 *r3 = IPC_GET_ARG3(result); 1006 if (r4) 1007 *r4 = IPC_GET_ARG4(result); 1008 if (r5) 1009 *r5 = IPC_GET_ARG5(result); 1010 return rc; 923 1011 } 924 1012
Note:
See TracChangeset
for help on using the changeset viewer.