本文整理汇总了C++中INLINE_SYSCALL函数的典型用法代码示例。如果您正苦于以下问题:C++ INLINE_SYSCALL函数的具体用法?C++ INLINE_SYSCALL怎么用?C++ INLINE_SYSCALL使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了INLINE_SYSCALL函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DEV
/* Create a device file named PATH relative to FD, with permission and
special bits MODE and device number DEV (which can be constructed
from major and minor device numbers with the `makedev' macro above). */
int
__xmknodat (int vers, int fd, const char *file, mode_t mode, dev_t * dev)
{
if (vers != _MKNOD_VER)
{
__set_errno (EINVAL);
return -1;
}
# ifndef __ASSUME_ATFCTS
if (__have_atfcts >= 0)
# endif
{
int result;
/* The FreeBSD mknod() system call cannot be used to create FIFOs; we
must use the mkfifo() system call for this purpose. */
if (S_ISFIFO (mode))
result = INLINE_SYSCALL (mkfifoat, 3, fd, file, mode);
else
result = INLINE_SYSCALL (mknodat, 4, fd, file, mode, *dev);
# ifndef __ASSUME_ATFCTS
if (result == -1 && errno == ENOSYS)
__have_atfcts = -1;
else
# endif
return result;
}
#ifndef __ASSUME_ATFCTS
if (fd != AT_FDCWD && file[0] != '/')
{
int mib[4];
size_t kf_len = 0;
char *kf_buf, *kf_bufp;
size_t filelen;
if (fd < 0)
{
__set_errno (EBADF);
return -1;
}
filelen = strlen (file);
if (__builtin_expect (filelen == 0, 0))
{
__set_errno (ENOENT);
return -1;
}
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_FILEDESC;
mib[3] = __getpid ();
if (__sysctl (mib, 4, NULL, &kf_len, NULL, 0) != 0)
{
__set_errno (ENOSYS);
return -1;
}
kf_buf = alloca (kf_len + filelen);
if (__sysctl (mib, 4, kf_buf, &kf_len, NULL, 0) != 0)
{
__set_errno (ENOSYS);
return -1;
}
kf_bufp = kf_buf;
while (kf_bufp < kf_buf + kf_len)
{
struct kinfo_file *kf = (struct kinfo_file *) (uintptr_t) kf_bufp;
if (kf->kf_fd == fd)
{
if (kf->kf_type != KF_TYPE_VNODE ||
kf->kf_vnode_type != KF_VTYPE_VDIR)
{
__set_errno (ENOTDIR);
return -1;
}
strcat (kf->kf_path, "/");
strcat (kf->kf_path, file);
file = kf->kf_path;
break;
}
kf_bufp += kf->kf_structsize;
}
if (kf_bufp >= kf_buf + kf_len)
{
__set_errno (EBADF);
return -1;
}
}
//.........这里部分代码省略.........
示例2: _DkMutexLockTimeout
int _DkMutexLockTimeout (struct mutex_handle * mut, int timeout)
{
int i, c = 0;
if (timeout == -1)
return -_DkMutexLock(mut);
struct atomic_int * m = &mut->value;
/* Spin and try to take lock */
for (i = 0 ; i < MUTEX_SPINLOCK_TIMES ; i++)
{
c = atomic_dec_and_test(m);
if (c)
goto success;
cpu_relax();
}
/* The lock is now contended */
int ret;
if (timeout == 0) {
ret = c ? 0 : -PAL_ERROR_TRYAGAIN;
goto out;
}
while (!c) {
int val = atomic_read(m);
if (val == 1)
goto again;
struct timespec waittime;
long sec = timeout / 1000000;
long microsec = timeout - (sec * 1000000);
waittime.tv_sec = sec;
waittime.tv_nsec = microsec * 1000;
ret = INLINE_SYSCALL(futex, 6, m, FUTEX_WAIT, val, &waittime, NULL, 0);
if (IS_ERR(ret) &&
ERRNO(ret) != EWOULDBLOCK &&
ERRNO(ret) != EINTR) {
ret = unix_to_pal_error(ERRNO(ret));
goto out;
}
#ifdef DEBUG_MUTEX
if (IS_ERR(ret))
printf("mutex held by thread %d\n", mut->owner);
#endif
again:
/* Upon wakeup, we still need to check whether mutex is unlocked or
* someone else took it.
* If c==0 upon return from xchg (i.e., the older value of m==0), we
* will exit the loop. Else, we sleep again (through a futex call).
*/
c = atomic_dec_and_test(m);
}
success:
#ifdef DEBUG_MUTEX
mut->owner = INLINE_SYSCALL(gettid, 0);
#endif
ret = 0;
out:
return ret;
}
示例3: __real_chown
int
__real_chown (const char *file, uid_t owner, gid_t group)
{
# if __ASSUME_LCHOWN_SYSCALL == 0
static int __libc_old_chown;
int result;
if (!__libc_old_chown)
{
int saved_errno = errno;
# ifdef __NR_chown32
if (__libc_missing_32bit_uids <= 0)
{
int result;
int saved_errno = errno;
result = INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
if (result == 0 || errno != ENOSYS)
return result;
__set_errno (saved_errno);
__libc_missing_32bit_uids = 1;
}
# endif /* __NR_chown32 */
if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
{
__set_errno (EINVAL);
return -1;
}
result = INLINE_SYSCALL (chown, 3, CHECK_STRING (file), owner, group);
if (result >= 0 || errno != ENOSYS)
return result;
__set_errno (saved_errno);
__libc_old_chown = 1;
}
return __lchown (file, owner, group);
# elif __ASSUME_32BITUIDS
/* This implies __ASSUME_LCHOWN_SYSCALL. */
return INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
# else
/* !__ASSUME_32BITUIDS && ASSUME_LCHOWN_SYSCALL */
# ifdef __NR_chown32
if (__libc_missing_32bit_uids <= 0)
{
int result;
int saved_errno = errno;
result = INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
if (result == 0 || errno != ENOSYS)
return result;
__set_errno (saved_errno);
__libc_missing_32bit_uids = 1;
}
# endif /* __NR_chown32 */
if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
{
__set_errno (EINVAL);
return -1;
}
return INLINE_SYSCALL (chown, 3, CHECK_STRING (file), owner, group);
# endif
}
示例4: timer_helper_thread
/* Helper function to support starting threads for SIGEV_THREAD. */
static void *
timer_helper_thread (void *arg)
{
/* Wait for the SIGTIMER signal, allowing the setXid signal, and
none else. */
sigset_t ss;
sigemptyset (&ss);
__sigaddset (&ss, SIGTIMER);
/* Endless loop of waiting for signals. The loop is only ended when
the thread is canceled. */
while (1)
{
siginfo_t si;
/* sigwaitinfo cannot be used here, since it deletes
SIGCANCEL == SIGTIMER from the set. */
int oldtype = LIBC_CANCEL_ASYNC ();
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
int result = INLINE_SYSCALL (rt_sigtimedwait, 4, &ss, &si, NULL,
_NSIG / 8);
LIBC_CANCEL_RESET (oldtype);
if (result > 0)
{
if (si.si_code == SI_TIMER)
{
struct timer *tk = (struct timer *) si.si_ptr;
/* Check the timer is still used and will not go away
while we are reading the values here. */
pthread_mutex_lock (&__active_timer_sigev_thread_lock);
struct timer *runp = __active_timer_sigev_thread;
while (runp != NULL)
if (runp == tk)
break;
else
runp = runp->next;
if (runp != NULL)
{
struct thread_start_data *td = malloc (sizeof (*td));
/* There is not much we can do if the allocation fails. */
if (td != NULL)
{
/* This is the signal we are waiting for. */
td->thrfunc = tk->thrfunc;
td->sival = tk->sival;
pthread_t th;
(void) pthread_create (&th, &tk->attr,
timer_sigev_thread, td);
}
}
pthread_mutex_unlock (&__active_timer_sigev_thread_lock);
}
else if (si.si_code == SI_TKILL)
/* The thread is canceled. */
pthread_exit (NULL);
}
}
}
示例5: __libc_fork
pid_t __libc_fork (void)
{
return (pid_t) INLINE_SYSCALL (clone, 2, SIGCHLD, 0);
}
示例6: __lchown
/* Change the owner and group of FILE. */
int
__lchown (const char *file, uid_t owner, gid_t group)
{
return INLINE_SYSCALL (fchownat, 5, AT_FDCWD, file, owner, group,
AT_SYMLINK_NOFOLLOW);
}
示例7: _DkVirtualMemoryProtect
int _DkVirtualMemoryProtect (void * addr, int size, int prot)
{
int ret = INLINE_SYSCALL(mprotect, 3, addr, size, HOST_PROT(prot));
return IS_ERR(ret) ? unix_to_pal_error(ERRNO(ret)) : 0;
}
示例8: __new_semctl
int
__new_semctl (int semid, int semnum, int cmd, ...)
{
union semun arg;
va_list ap;
va_start (ap, cmd);
/* Get the argument. */
arg = va_arg (ap, union semun);
va_end (ap);
#if __ASSUME_32BITUIDS > 0
return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
CHECK_SEMCTL (&arg, semid, cmd | __IPC_64));
#else
switch (cmd) {
case SEM_STAT:
case IPC_STAT:
case IPC_SET:
break;
default:
return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
CHECK_SEMCTL (&arg, semid, cmd));
}
{
int result;
struct __old_semid_ds old;
struct semid_ds *buf;
#ifdef __NR_getuid32
if (__libc_missing_32bit_uids <= 0)
{
if (__libc_missing_32bit_uids < 0)
{
int save_errno = errno;
/* Test presence of new IPC by testing for getuid32 syscall. */
result = INLINE_SYSCALL (getuid32, 0);
if (result == -1 && errno == ENOSYS)
__libc_missing_32bit_uids = 1;
else
__libc_missing_32bit_uids = 0;
__set_errno(save_errno);
}
if (__libc_missing_32bit_uids <= 0)
{
result = INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
CHECK_SEMCTL (&arg, semid, cmd | __IPC_64));
return result;
}
}
#endif
buf = arg.buf;
arg.__old_buf = &old;
if (cmd == IPC_SET)
{
old.sem_perm.uid = buf->sem_perm.uid;
old.sem_perm.gid = buf->sem_perm.gid;
old.sem_perm.mode = buf->sem_perm.mode;
if (old.sem_perm.uid != buf->sem_perm.uid ||
old.sem_perm.gid != buf->sem_perm.gid)
{
__set_errno (EINVAL);
return -1;
}
}
result = INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
CHECK_SEMCTL (&arg, semid, cmd));
if (result != -1 && cmd != IPC_SET)
{
memset(buf, 0, sizeof(*buf));
buf->sem_perm.__key = old.sem_perm.__key;
buf->sem_perm.uid = old.sem_perm.uid;
buf->sem_perm.gid = old.sem_perm.gid;
buf->sem_perm.cuid = old.sem_perm.cuid;
buf->sem_perm.cgid = old.sem_perm.cgid;
buf->sem_perm.mode = old.sem_perm.mode;
buf->sem_perm.__seq = old.sem_perm.__seq;
buf->sem_otime = old.sem_otime;
buf->sem_ctime = old.sem_ctime;
buf->sem_nsems = old.sem_nsems;
}
return result;
}
#endif
}
示例9: __pipe
/* Create a one-way communication channel (__pipe).
If successful, two file descriptors are stored in PIPEDES;
bytes written on PIPEDES[1] can be read from PIPEDES[0].
Returns 0 if successful, -1 if not. */
int
__pipe (int __pipedes[2])
{
return INLINE_SYSCALL (pipe2, 2, __pipedes, 0);
}
示例10: __shmctl
int
__shmctl (int shmid, int cmd, struct shmid_ds *buf)
{
return INLINE_SYSCALL (shmctl, 3, shmid, cmd | __IPC_64, buf);
}
示例11: reboot
/* Call kernel with additional two arguments the syscall requires. */
int
reboot (int howto)
{
return INLINE_SYSCALL (reboot, 3, (int) 0xfee1dead, 672274793, howto);
}
示例12: __mkdir
/* Create a directory named PATH with protections MODE. */
int
__mkdir (const char *path, mode_t mode)
{
return INLINE_SYSCALL (mkdirat, 3, AT_FDCWD, path, mode);
}
示例13: __xstat
/* Get information about the file NAME in BUF. */
int
__xstat (int vers, const char *name, struct stat *buf)
{
return INLINE_SYSCALL (stat, 2, name, buf);
}
示例14: __real_chown
int
__real_chown (const char *file, uid_t owner, gid_t group)
{
return INLINE_SYSCALL (chown32, 3, file, owner, group);
}
示例15: __fstatfs
/* Return information about the filesystem on which FD resides. */
int
__fstatfs (int fd, struct statfs *buf)
{
int rc = INLINE_SYSCALL (fstatfs64, 3, fd, sizeof (*buf), buf);
return rc ?: statfs_overflow (buf);
}