Go to the documentation of this file.
33 #pragma linkage(BPX4CTW, OS)
34 #pragma linkage(BPX1CTW, OS)
41 int scandir(
const char* maindir,
struct dirent*** namelist,
42 int (*filter)(
const struct dirent*),
43 int (*compar)(
const struct dirent**,
44 const struct dirent **)) {
46 struct dirent** nl_copy;
47 struct dirent* dirent;
55 mdir = opendir(maindir);
60 dirent = readdir(mdir);
63 if (!filter || filter(dirent)) {
71 if (nl_copy == NULL) {
82 (
int (*)(
const void *,
const void *)) compar);
114 unsigned int newsize;
116 struct pollfd* newlst;
119 if (len <= lst->
size)
135 for (
i = lst->
size;
i < newsize; ++
i)
139 newlst[newsize - 1] = event;
153 lst->
msg_queue = msgget(IPC_PRIVATE, 0600 | IPC_CREAT);
187 memcpy(&
once, &child_once,
sizeof(child_once));
226 lst->
items[lst->
size - 1].events = POLLIN;
245 if (fd >= lst->
size || lst->
items[fd].fd == -1) {
250 lst->
items[fd].fd = -1;
258 if (lst->
items[fd].fd != -1) {
263 lst->
items[fd].fd = fd;
264 lst->
items[fd].events =
event->events;
265 lst->
items[fd].revents = 0;
267 if (fd >= lst->
size - 1 || lst->
items[fd].fd == -1) {
272 lst->
items[fd].events =
event->events;
273 lst->
items[fd].revents = 0;
281 #define EP_MAX_PFDS (ULONG_MAX / sizeof(struct pollfd))
282 #define EP_MAX_EVENTS (INT_MAX / sizeof(struct epoll_event))
291 struct pollfd msg_fd;
294 if (!lst || !lst->
items || !events) {
310 _SET_FDS_MSGS(
size, 1, lst->
size - 1);
312 _SET_FDS_MSGS(
size, 0, 0);
318 assert(lst->
size > 0);
320 pollret = _NFDS(pollret) + _NMSGS(pollret);
324 msg_fd = pfds[lst->
size - 1];
326 i < lst->
size &&
i < maxevents && reventcount < pollret; ++
i) {
331 if (pfd->fd == -1 || pfd->revents == 0)
337 if (pfd->revents & POLLIN && pfd->revents & POLLOUT)
339 else if (pfd->revents & (POLLIN | POLLOUT))
343 events[nevents++] = ev;
346 if (msg_fd.revents != 0 && msg_fd.fd != -1)
348 events[nevents - 1].
is_msg = 1;
363 if (fd < lst->
size && lst->
items != NULL && lst->
items[fd].fd != -1)
364 lst->
items[fd].fd = -1;
402 BPX4CTW(&
seconds, &nano, &events, &secrem, &nanorem, &rv, &
err, &rsn);
404 BPX1CTW(&
seconds, &nano, &events, &secrem, &nanorem, &rv, &
err, &rsn);
416 if (rem != NULL && (rv == 0 ||
err == EINTR)) {
417 rem->tv_nsec = nanorem;
418 rem->tv_sec = secrem;
426 static const char* tempchars =
427 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
428 static const size_t num_chars = 62;
429 static const size_t num_x = 6;
431 unsigned int tries,
i;
440 if (
len < num_x || strncmp(ep - num_x,
"XXXXXX", num_x)) {
445 fd =
open(
"/dev/urandom", O_RDONLY);
452 if (
read(fd, &
v,
sizeof(
v)) !=
sizeof(
v))
456 for (
i = 0;
i < num_x;
i++) {
457 *cp++ = tempchars[
v % num_chars];
461 if (mkdir(
path, S_IRWXU) == 0) {
465 else if (errno != EEXIST)
492 char realpathstr[PATH_MAX + 1];
495 if (tmpbuf == NULL) {
500 rlen = readlink(
path, tmpbuf,
len);
506 if (rlen < 3 || strncmp(
"/$", tmpbuf, 2) != 0) {
518 delimiter = strchr(tmpbuf + 2,
'/');
519 if (delimiter == NULL)
521 delimiter = strchr(tmpbuf + 2,
'\0');
524 old_delim = *delimiter;
526 if (realpath(tmpbuf, realpathstr) == NULL) {
532 realpathstr[PATH_MAX] =
'\0';
535 *delimiter = old_delim;
536 plen = strlen(delimiter);
537 vlen = strlen(realpathstr);
541 errno = ENAMETOOLONG;
555 char*
p = memchr(
str, 0, maxlen);
std::chrono::duration< std::int_fast64_t > seconds
static void after_fork(void)
void * uv__malloc(size_t size)
UV_EXTERN int uv_mutex_init(uv_mutex_t *handle)
int scandir(const char *maindir, struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const struct dirent **, const struct dirent **))
static int copy(grpc_slice_buffer *input, grpc_slice_buffer *output)
UV_EXTERN void uv_mutex_destroy(uv_mutex_t *handle)
int sem_wait(UV_PLATFORM_SEM_T *semid)
int nanosleep(const struct timespec *req, struct timespec *rem)
static void epoll_init(void)
char * mkdtemp(char *path)
#define QUEUE_DATA(ptr, type, field)
int sem_post(UV_PLATFORM_SEM_T *semid)
uv__os390_epoll * epoll_create1(int flags)
void epoll_queue_close(uv__os390_epoll *lst)
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
UV_EXTERN void uv_once(uv_once_t *guard, void(*callback)(void))
unsigned __int64 uint64_t
struct absl::base_internal::@2940::AllocList::Header header
int epoll_file_close(int fd)
pthread_mutex_t uv_mutex_t
UV_EXTERN void uv_mutex_unlock(uv_mutex_t *handle)
int epoll_wait(uv__os390_epoll *lst, struct epoll_event *events, int maxevents, int timeout)
void * uv__realloc(void *ptr, size_t size)
void qsort(void *a, size_t n, size_t es, int(*cmp)(const void *, const void *))
void * uv__reallocf(void *ptr, size_t size)
static void init_message_queue(uv__os390_epoll *lst)
int sem_destroy(UV_PLATFORM_SEM_T *semid)
static uv_mutex_t global_epoll_lock
static unsigned int next_power_of_two(unsigned int val)
int read(izstream &zs, T *x, Items items)
int sem_init(UV_PLATFORM_SEM_T *semid, int pshared, unsigned int value)
static QUEUE global_epoll_queue
UV_EXTERN void uv_mutex_lock(uv_mutex_t *handle)
int epoll_ctl(uv__os390_epoll *lst, int op, int fd, struct epoll_event *event)
static void child_fork(void)
#define QUEUE_FOREACH(q, h)
static void maybe_resize(uv__os390_epoll *lst, unsigned int len)
size_t strnlen(const char *str, size_t maxlen)
int sem_trywait(UV_PLATFORM_SEM_T *semid)
ssize_t os390_readlink(const char *path, char *buf, size_t len)
#define UV_PLATFORM_SEM_T
#define QUEUE_INSERT_TAIL(h, q)
static int number_of_epolls
static void before_fork(void)
grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:36