00001 #include <l4/omega0/client.h>
00002 #include <omega0_proto.h>
00003 #include <l4/sys/types.h>
00004 #include <l4/sys/ipc.h>
00005 #include "internal.h"
00006 #include "config.h"
00007
00008 extern omega0_alien_handler_t omega0_alien_handler;
00009
00010
00011 int omega0_request_timeout(int handle, omega0_request_t action,
00012 l4_timeout_t timeout){
00013 if(!omega0_initalized && omega0_init()) return -1;
00014
00015 if(omega0_alien_handler){
00016 l4_threadid_t alien;
00017 l4_umword_t d0, d1;
00018 int err;
00019
00020 while(1) {
00021 if((err = omega0_open_call(handle, OMEGA0_REQUEST, action.i,
00022 timeout, &alien, &d0, &d1))!=0)
00023 return err;
00024 if(!l4_task_equal(alien, omega0_management_thread)){
00025 omega0_alien_handler(alien, d0, d1);
00026 } else return d0;
00027 action.s.consume=action.s.mask=action.s.unmask=0;
00028 action.s.again=1;
00029 }
00030 } else
00031 return omega0_call(handle, OMEGA0_REQUEST, action.i, timeout);
00032 }
00033