Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. #include"ipc.h"
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. inline int ipc_messages_avail(ipc_hdr_t * hdr)
  6. {
  7.  return hdr->free_ptr!=8;
  8. }
  9.  
  10. static inline void lock_msg_queue(ipc_hdr_t * hdr)
  11. {
  12.  int d0;
  13.  __asm__ __volatile__(
  14.      "2:\t"
  15.      "movb $1,%%al\n\t"
  16.      "xchgb %%al,%0\n\t"
  17.      "andb %%al,%%al\n\t"
  18.      "jnz 2b\n\t"
  19.      "incb %0"
  20.      :"=m"(hdr->lock),"=a"(d0)
  21.      :"m"(hdr->lock)
  22.      :"memory");
  23. }
  24.  
  25. static inline void unlock_msg_queue(ipc_hdr_t * hdr)
  26. {
  27.  __asm__ __volatile__(
  28.      "movl $0,%0"
  29.      :"=m"(hdr->lock)
  30.      :"m"(hdr->lock)
  31.      :"memory");
  32. }
  33.  
  34. ipc_msg_t * ipc_receive_msg(ipc_hdr_t * hdr)
  35. {
  36.  ipc_msg_t * msg, * tmp;
  37.  lock_msg_queue(hdr);
  38.  if(!ipc_messages_avail(hdr))
  39.  {
  40.   unlock_msg_queue(hdr);
  41.   return NULL;
  42.  }
  43.  tmp=(ipc_msg_t *)hdr->__mem;
  44.  msg=(ipc_msg_t *)malloc(tmp->msg_length);
  45.  if(!msg)
  46.  {
  47.   unlock_msg_queue(hdr);
  48.   return NULL;
  49.  }
  50.  memcpy(msg,tmp,tmp->msg_length);
  51.  if(hdr->free_ptr>(8+tmp->msg_length))
  52.  {
  53.   memcpy(tmp,tmp+1,hdr->free_ptr-8-tmp->msg_length);
  54.   hdr->free_ptr-=tmp->msg_length;
  55.  }
  56.  unlock_msg_queue(hdr);
  57.  return msg;
  58. }
  59.