diff options
Diffstat (limited to 'libc/misc/sysvipc')
| -rw-r--r-- | libc/misc/sysvipc/msgq.c | 53 | 
1 files changed, 46 insertions, 7 deletions
| diff --git a/libc/misc/sysvipc/msgq.c b/libc/misc/sysvipc/msgq.c index e43a9ed04..d67645a4d 100644 --- a/libc/misc/sysvipc/msgq.c +++ b/libc/misc/sysvipc/msgq.c @@ -1,6 +1,11 @@  #include <errno.h>  #include <sys/msg.h>  #include "ipc.h" +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +#include "sysdep-cancel.h" +#else +#define SINGLE_THREAD_P 1 +#endif  #ifdef L_msgctl @@ -43,31 +48,65 @@ struct new_msg_buf{  #ifdef L_msgrcv  #ifdef __NR_msgrcv -_syscall5(int, msgrcv, int, msqid, void *, msgp, size_t, msgsz, long int, msgtyp, int, msgflg) -#else -int msgrcv (int msqid, void *msgp, size_t msgsz, -	long int msgtyp, int msgflg) +#define __NR___syscall_msgrcv __NR_msgrcv +static inline _syscall5(int, __syscall_msgrcv, int, msqid, void *, msgp, +			size_t, msgsz, long int, msgtyp, int, msgflg) +#endif +static inline int do_msgrcv (int msqid, void *msgp, size_t msgsz, +			    long int msgtyp, int msgflg)  { +#ifdef __NR_msgrcv +    return __syscall_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg); +#else      struct new_msg_buf temp;      temp.r_msgtyp = msgtyp;      temp.oldmsg = msgp;      return __syscall_ipc(IPCOP_msgrcv ,msqid ,msgsz ,msgflg ,&temp, 0); +#endif  } +int msgrcv (int msqid, void *msgp, size_t msgsz, +	    long int msgtyp, int msgflg) +{ +    if (SINGLE_THREAD_P) +	return do_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg); +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +    int oldtype = LIBC_CANCEL_ASYNC (); +    int result = do_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg); +    LIBC_CANCEL_RESET (oldtype); +    return result;  #endif +}  #endif  #ifdef L_msgsnd  #ifdef __NR_msgsnd -_syscall4(int, msgsnd, int, msqid, const void *, msgp, size_t, msgsz, int, msgflg) -#else +#define __NR___syscall_msgsnd __NR_msgsnd +static inline _syscall4(int, __syscall_msgsnd, int, msqid, const void *, msgp, +			size_t, msgsz, int, msgflg) +#endif  /* Send message to message queue.  */ -int msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg) +static inline int do_msgsnd (int msqid, const void *msgp, size_t msgsz, +			    int msgflg)  { +#ifdef __NR_msgsnd +    return __syscall_msgsnd(msqid, msgp, msgsz, msgflg); +#else      return __syscall_ipc(IPCOP_msgsnd, msqid, msgsz, msgflg, (void *)msgp, 0); +#endif  } +int msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg) +{ +    if (SINGLE_THREAD_P) +	return do_msgsnd(msqid, msgp, msgsz, msgflg); +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +    int oldtype = LIBC_CANCEL_ASYNC (); +    int result = do_msgsnd(msqid, msgp, msgsz, msgflg); +    LIBC_CANCEL_RESET (oldtype); +    return result;  #endif +}  #endif | 
