struct hostent * gethostbyname2(const char *name, int type) { static struct hostent host, *hp; static char hostbuf[BUFSIZ]; static int herr; int rval; static const ns_dtab dtab[] = { NS_FILES_CB(_ht_gethostbyname, NULL) { NSSRC_DNS, _dns_gethostbyname, NULL }, NS_NIS_CB(_nis_gethostbyname, NULL) /* force -DHESIOD */ { 0 } }; #ifdef HAVE_DD_LOCK __lock_acquire(name_lock); #endif rval = nsdispatch((void *)&hp, dtab, NSDB_HOSTS, "gethostbyname", default_src, name, type, &host, hostbuf, BUFSIZ, &herr); #ifdef HAVE_DD_LOCK __lock_release(name_lock); #endif if (rval != NS_SUCCESS) return NULL; else return hp; }
_VOID _DEFUN_VOID (__tz_unlock) { #ifndef __SINGLE_THREAD__ __lock_release(__tz_lock_object); #endif }
mode_t umask (mode_t mask) { mode_t old_mask; /* we need to lock so as to not interfere with getumask */ __lock_acquire(umask_lock); old_mask = __umask (mask); __lock_release(umask_lock); return old_mask; }
mode_t getumask (void) { mode_t mask; __lock_acquire(umask_lock); mask = __umask (0); mask = __umask (mask); __lock_release(umask_lock); return mask; }
int __patmos_lock_release_recursive(_LOCK_RECURSIVE_T *lock) { const unsigned cnt = get_cpucnt(); if (cnt > 1) { _UNCACHED _LOCK_RECURSIVE_T *ll = (_UNCACHED _LOCK_RECURSIVE_T *)lock; ll->depth--; if (ll->depth == 0) { ll->owner = -1; // reset owner to invalid ID __lock_release(lock->lock); } } return 0; }
ssize_t mq_receive (mqd_t msgid, char *msg, size_t msg_len, unsigned int *msg_prio) { struct libc_mq *info; struct sembuf sb2 = {2, 1, 0}; struct sembuf sb3 = {3, -1, IPC_NOWAIT}; struct sembuf sb5 = {5, 1, IPC_NOWAIT}; ssize_t num_bytes; int ipcflag; info = __find_mq (msgid); if (info == NULL || (info->oflag & O_ACCMODE) == O_WRONLY) { errno = EBADF; return -1; } if (msg_len < info->attr->mq_msgsize) { errno = EMSGSIZE; return -1; } __lock_acquire (mq_rdbuf_lock); ipcflag = (info->attr->mq_flags & O_NONBLOCK) ? IPC_NOWAIT : 0; semop (info->semid, &sb5, 1); /* increase number of readers */ num_bytes = msgrcv (info->msgqid, info->rdbuf, msg_len, -MQ_PRIO_MAX, ipcflag); sb5.sem_op = -1; semop (info->semid, &sb5, 1); /* decrease number of readers */ if (num_bytes != (ssize_t)-1) { semop (info->semid, &sb2, 1); /* add one to messages left to write */ semop (info->semid, &sb3, 1); /* subtract one from messages to read */ memcpy (msg, info->rdbuf->text, num_bytes); if (msg_prio != NULL) *msg_prio = MQ_PRIO_MAX - info->rdbuf->type; } __lock_release (mq_rdbuf_lock); return num_bytes; }