[erlang-questions] A async c driver issues: The emulator will be halted during the execution of c driver code.

Kenneth Lundin <>
Wed Apr 2 17:29:06 CEST 2008


In the documentation you can read how to write an asynchronous driver.
You find it here http://www.erlang.org/doc/apps/erts/driver.html#6.5.
It's part of the ERTS users guide.

It is a well known fact that drivers (the most common synchronous ones) block
the VM during their execution. You must be very careful to secure that you don't
execute for too long in those drivers.

Are you really sure that the speed for parsing this in Erlang is not enough?
You can even use native code generation with HiPE. By coding this in Erlang you
avoid the problems you have with the driver.

/Kenneth

On 4/2/08, tate.zhou.cn <> wrote:
>
> Hi , guys:
>
>
> I worte a c driver for parsing  xml pieces. The driver works , but when the
> c driver invoked , the erlang emulator will be halted until the  execution
> of  c driver  completed.  during the execution of the c driver code, other
> process of erlang get no chance to be execute , evenif the usetage of cpu is
> around 50% (My cpu is duo core 2 ).
>
> Does anybody have any idea about this issues?
>
> Any infomation about how to write a async driver is appreciate.
>
>
> List below is pieces of  my erl code and c dirver code:
>
> The execution of ?INFO_MSG in test_async_normal will start  until test_async
> complete, although the execution time of  test_async  is more than 2
> seconds.
>
>
>
>
>
>
> erlang:
> ==========================================
>
> test_async_newpid() ->
>
>
>     PID = spawn(?MODULE, test_async_normal,[""]),
>
>     PID2 = spawn(?MODULE, test_async,[""]),
>
>     ?INFO_MSG("New Pid for port communication:",[PID]),
>
>
>     ok.
>
>
> test_async_normal(Data) ->
>
>
>     timer:sleep(2* 1000),
>     ?INFO_MSG("Hi , I am in new Pid:",[erlang:self()]),
>
>     ok.
>
> test_async (Data) ->
>
>     Port = open_port({spawn, vbp_xmlhandler}, [binary]),
>
>     Bin =  erlang:list_to_binary("hello , i come from erlang: "),
> %load_xml_bin(),
>
>
>     Port ! {self(), {command, Bin}},
>
>     Ret_str = return_port_data(Port),
>
>
>     ?INFO_MSG("Return from port : ~p~n",[Ret_str]),
>
>     % ?INFO_MSG("Return from port : ~s",[Res]),
>
>     port_close(Port),
>
>
>
> ok.
>
>
>
> return_port_data(Port) ->
>     receive
>  {Port, {data, Data}} ->
>      Data
>     end.
>
>
> ====================================================
>
>
>
>
>
>
>
>
>
>
>
>
> C driver code :
>
> -----------------------------------------------------
> static ErlDrvEntry vbp_xmlhandler_entry = {
>     NULL,   /* init */
>     vbp_xmlhandler_start,
>     vbp_xmlhandler_stop,
>     vbp_xmlhandler_async,   /* output */
>     NULL,   /* ready_input */
>     NULL,   /* ready_output */
>     "vbp_xmlhandler",                 /* the name of the
> driver */
>     NULL,   /* finish */
>     NULL,   /* handle */
>     NULL,
>     NULL,   /* timeout */
>     NULL,   /* outputv */
>     NULL,   /* ready_async */
>     NULL,   /* flush */
>     NULL,   /* call */
>     NULL   /* event */
> };
> DRIVER_INIT(vbp_xmlhandler) /* must match name in driver_entry */
> {
>     return &vbp_xmlhandler_entry;
> }
>
>
>
> /*
> //   async interface for handle command.
> //
> */
> static void vbp_xmlhandler_async(ErlDrvData handle, char *buff, int
> bufflen){
>  iostream* stream;
>     char* test_data;
>  char *in_data;
>  int len;
>  int i ;
>  int loop_count;
>  expat_data* d = (expat_data*)handle;
>
>  len = bufflen;
>
>
>  stream = create_stream();
>
>  // force a lot of cpu time to be consumed in current invocation.
>  loop_count = 1000000 * 80;
>  for(i = 0;i <loop_count ;i++ ){
>   in_data = malloc(20);
>
>   free(in_data);
>  }
>  in_data = malloc(len + 1);
>  memset(in_data,0,len +1);
>  memcpy(in_data,buff,len);
>  write_str_to_stream(stream,in_data);
>  free(in_data);
>
>  write_str_to_stream(stream," [append by c driver]");
>
>  driver_output(d ->port, stream->buff, stream->index);
>
>  free_stream(stream);
> }
>
>
>
>
>
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions
>


More information about the erlang-questions mailing list