#ifndef DEF_REQUEST_H #define DEF_REQUEST_H #include "object.h" #define RS_PENDING 0 #define RS_PROCESSED 1 #define RS_FINISHED 2 #define RS_INTERRUPTED 3 #define PT_VOID 0 #define PT_OBJDESC 1 #define PT_LONG 2 #define PT_LONGLONG 3 //for return values #define PT_SHM 3 //for parameters struct request { struct object *obj; struct thread *requester; //0 if nonblocking message uint32_t func, params[3], obj_close[3], shmsize[3]; //obj_close : object descriptors to close when requests yields an answer struct segment_map *shm_sndr[3], *shm_rcv[3]; int acknowledged; // (only for blocking requests) 0 : request is pending, 1 : request is being processes, 2 : finished, 3 : interrupted union { int64_t ll; uint32_t n; } answer; int errcode; //returned when function has finished int pid; //pid of caller }; struct user_request { uint32_t func, params[3], shmsize[3]; int isBlocking; // 1 : blocking request, 0 : nonblocking request (message) int pid; //pid of caller process }; struct user_sendrequest { uint32_t func, a, b, c; uint32_t answeri; int64_t answerll; int errcode; }; //syscalls int request_get(int obj, uint32_t ptr, int wait); int request_has(int obj); void request_answer(int obj, uint32_t answer, uint32_t answer2, int errcode); //answer2 used for long long. int request_mapShm(int obj, uint32_t pos, int number); int request(int obj, uint32_t rq_ptr); int send_msg(int obj, uint32_t rq_ptr); #endif