l4-hackers Digest, Vol 72, Issue 8

fang zhengshu fangzhsh07 at gmail.com
Wed Jul 8 12:15:04 CEST 2009


2009/7/6 fang zhengshu <fangzhsh07 at 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 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,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://os.inf.tu-dresden.de/pipermail/l4-hackers/attachments/20090708/7abe3405/attachment.htm>


More information about the l4-hackers mailing list