2009/7/8 fang zhengshu fangzhsh07@gmail.com
2009/7/6 fang zhengshu fangzhsh07@gmail.com
hi all, when I write a function in the IDL file, there is a problem:want to write a different-length string to a array and then read parts of the array to another string like:
interface test{ int write([string]char* str, int len); int read([out,prealloc_client, size_is(size), prealloc_server]char str[], int size); };
I modify the idl file as the following:
int write([in,string]char *str, int len) int read([out, prealloc_client]char *str, int len) there no error when compile it,but
I have defined a fixed size array in the server like array[256]. In the write() function I write a different length string to the array, then I want to read parts or all of the array in the read() function, the process will be like the following:
string[len] str[size] | ^ | | --------->array[256] -----------|
but when I put the function above and compile it, there are some error happen. I have change the size_is() with length_is() or max_is(), but there still error when I compile it. I know if I define a fix array str[256] the code can be work, but I just want to use a unfixed length array to get the string. could someone please give me some advice?if I describe the problem clearly, please let me know.
thank you!
I don't know whether I describe what I want to do clearly,so I put the
simple code below:
read-client write-client #define STR_TO 30 #define STR_FROM 30 ... ... char str_to[SRR_TO]; char str_from[STR_FROM]; ... ... read(str_to, STR_TO); write(str_from, STR_FROM); ... ...
server #define SIZE 256 ... char string[SIZE]; ... int write(char
*str_from, int str_from) { //write str_from size chars of str_from array to the string array which is in server } int read(char *str_to, int str_to) { //read str_to size chars from the string array which is in server to str_to }
Then I define write functions as the above in a .idl file,but when I compile it,there will be the following error: terminate called after throwing an instance of 'std::out_of_range' what(): CBEMsgBuffer::IsEarlier make[1]: *** [test-server.c] Aborted make[1]: *** [test-server.c] Deleting file `test-sys.h' make[1]: *** [test-server.c] Deleting file `test-client.h' make[1]: *** [test-server.c] Deleting file `test-client.c' make: *** [/home/l4/tudos/build/pkg/ fifo/idl/OBJ-x86-l4v2] Error 2
must we use the format as the dice manual below?: int read([out, prealloc_client, size_is(len)] char **str, [out,in]int *len) and when I modify the function as int read([out, prealloc_client, prealloc_server, size_is(len)] char *str, [out,in]int *len) there is no error when compile it,but there will be another error called :fpage could you give me some advice for the read function? thank you. -- fang,
when I run the test in qemu, the error come out: fifo | L4RM: [PF] read at 0x00002000, ip 01800aa1, src B.02 fifo | [B.0] l4rm/lib/src/pagefault.c:81:__unknown_pf(): fifo | unhandled page fault
the execute code of fifo binary is : ... /home/l4/tudos/build/pkg/fifo/idl/OBJ-x86-l4v2/fifo-server.c:259 l4_msgdope_t _dice_size_dope; l4_msgdope_t _dice_send_dope; l4_umword_t _word[2]; } _word; } fifo_fifo_read_msg_buffer_t; l4_umword_t _dice_str_size = (str) ? (_dice_strlen(str)+1) : 0; 1800a8b: 85 db test %ebx,%ebx 1800a8d: 0f 84 f9 00 00 00 je 1800b8c <fifo_dispatch+0x21c> 1800a93: 80 3b 00 cmpb $0x0,(%ebx) 1800a96: 0f 84 11 01 00 00 je 1800bad <fifo_dispatch+0x23d> 1800a9c: 31 c0 xor %eax,%eax 1800a9e: 66 90 xchg %ax,%ax 1800aa0: 40 inc %eax 1800aa1: 80 3c 18 00 cmpb $0x0,(%eax,%ebx,1) 1800aa5: 75 f9 jne 1800aa0 <fifo_dispatch+0x130> 1800aa7: 8d 58 01 lea 0x1(%eax),%ebx ...
the fifo-server.c:259 code is:
inline void fifo_read_marshal (CORBA_Object _dice_corba_obj, int _dice_return /* out */, l4_msgtag_t *_dice_tag, char* str /* out */, fifo_msg_buffer_t *_dice_msg_buffer, CORBA_Server_Environment *_dice_corba_env) {
... l4_umword_t _dice_str_size = (str) ? (_dice_strlen(str)+1) : 0; ...
so anyone can give me some advice?
thank you!
2009/7/10 fang zhengshu fangzhsh07@gmail.com
2009/7/8 fang zhengshu fangzhsh07@gmail.com
2009/7/6 fang zhengshu fangzhsh07@gmail.com
hi all, when I write a function in the IDL file, there is a problem:want to write a different-length string to a array and then read parts of the array to another string like:
interface test{ int write([string]char* str, int len); int read([out,prealloc_client, size_is(size), prealloc_server]char str[], int size); };
I modify the idl file as the following:
int write([in,string]char *str, int len) int read([out, prealloc_client]char *str, int len)
there no error when compile it,but
I have defined a fixed size array in the server like array[256]. In the write() function I write a different length string to the array, then I want to read parts or all of the array in the read() function, the process will be like the following:
string[len] str[size] | ^ | | --------->array[256] -----------|
but when I put the function above and compile it, there are some error happen. I have change the size_is() with length_is() or max_is(), but there still error when I compile it. I know if I define a fix array str[256] the code can be work, but I just want to use a unfixed length array to get the string. could someone please give me some advice?if I describe the problem clearly, please let me know.
thank you!
I don't know whether I describe what I want to do clearly,so I put the
simple code below:
read-client write-client #define STR_TO 30 #define STR_FROM 30 ... ... char str_to[SRR_TO]; char str_from[STR_FROM]; ... ... read(str_to, STR_TO); write(str_from, STR_FROM); ... ...
server #define SIZE 256 ... char string[SIZE]; ... int write(char
*str_from, int str_from) { //write str_from size chars of str_from array to the string array which is in server } int read(char *str_to, int str_to) { //read str_to size chars from the string array which is in server to str_to }
Then I define write functions as the above in a .idl file,but when I compile it,there will be the following error: terminate called after throwing an instance of 'std::out_of_range' what(): CBEMsgBuffer::IsEarlier make[1]: *** [test-server.c] Aborted make[1]: *** [test-server.c] Deleting file `test-sys.h' make[1]: *** [test-server.c] Deleting file `test-client.h' make[1]: *** [test-server.c] Deleting file `test-client.c' make: *** [/home/l4/tudos/build/pkg/ fifo/idl/OBJ-x86-l4v2] Error 2
must we use the format as the dice manual below?: int read([out, prealloc_client, size_is(len)] char **str, [out,in]int *len) and when I modify the function as int read([out, prealloc_client, prealloc_server, size_is(len)] char *str, [out,in]int *len) there is no error when compile it,but there will be another error called :fpage could you give me some advice for the read function? thank you. -- fang,
when I run the test in qemu, the error come out: fifo | L4RM: [PF] read at 0x00002000, ip 01800aa1, src B.02 fifo | [B.0] l4rm/lib/src/pagefault.c:81:__unknown_pf(): fifo | unhandled page fault
the execute code of fifo binary is : ... /home/l4/tudos/build/pkg/fifo/idl/OBJ-x86-l4v2/fifo-server.c:259 l4_msgdope_t _dice_size_dope; l4_msgdope_t _dice_send_dope; l4_umword_t _word[2]; } _word; } fifo_fifo_read_msg_buffer_t; l4_umword_t _dice_str_size = (str) ? (_dice_strlen(str)+1) : 0; 1800a8b: 85 db test %ebx,%ebx 1800a8d: 0f 84 f9 00 00 00 je 1800b8c <fifo_dispatch+0x21c> 1800a93: 80 3b 00 cmpb $0x0,(%ebx) 1800a96: 0f 84 11 01 00 00 je 1800bad <fifo_dispatch+0x23d> 1800a9c: 31 c0 xor %eax,%eax 1800a9e: 66 90 xchg %ax,%ax 1800aa0: 40 inc %eax 1800aa1: 80 3c 18 00 cmpb $0x0,(%eax,%ebx,1) 1800aa5: 75 f9 jne 1800aa0 <fifo_dispatch+0x130> 1800aa7: 8d 58 01 lea 0x1(%eax),%ebx ...
the fifo-server.c:259 code is:
inline void fifo_read_marshal (CORBA_Object _dice_corba_obj, int _dice_return /* out */, l4_msgtag_t *_dice_tag, char* str /* out */, fifo_msg_buffer_t *_dice_msg_buffer, CORBA_Server_Environment *_dice_corba_env) {
... l4_umword_t _dice_str_size = (str) ? (_dice_strlen(str)+1) : 0; ...
so anyone can give me some advice?
thank you!
fang,
thank you for people's help:) I have handle the problem that can't read data from server. I modify the read function in the idl file:
int read([in, out, size_is(len), max_is(256)] char str[], [in, out] int *len);
and in the client-read side, malloc a array with 256 size(malloc(sizeof(char)*256)]),then there is no error in the read_component function and I can read the data from the server side which define a static array.
Hi,
I fear I still don't really get the problem. Could you please post your complete sample code (client, server, idl file, Makefiles) so I can try to repeat your steps here?
Bjoern
l4-hackers@os.inf.tu-dresden.de