
POSIX doesn't tell us to export a macro like this, and it's largely going to never be defined when compiling a serenity-native C++ file, since AK defines it already. This does raise a strange issue where some futex-related helpers in serenity.h are declared with ALWAYS_INLINE. Whether these helpers belong in a C-visible header as file-static methods is questionable, but let's work around the issue but adding some preprocessor magic to make sure these declarations get the behavior they used to have without leaking macros.
74 lines
2.3 KiB
C
74 lines
2.3 KiB
C
/*
|
|
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <Kernel/API/POSIX/futex.h>
|
|
#include <Kernel/API/POSIX/serenity.h>
|
|
#include <stdio.h>
|
|
#include <time.h>
|
|
#include <unistd.h>
|
|
|
|
__BEGIN_DECLS
|
|
|
|
int disown(pid_t);
|
|
|
|
int profiling_enable(pid_t, uint64_t);
|
|
int profiling_disable(pid_t);
|
|
int profiling_free_buffer(pid_t);
|
|
|
|
int futex(uint32_t* userspace_address, int futex_op, uint32_t value, const struct timespec* timeout, uint32_t* userspace_address2, uint32_t value3);
|
|
|
|
#ifndef ALWAYS_INLINE
|
|
# define ALWAYS_INLINE inline __attribute__((always_inline))
|
|
# define ALWAYS_INLINE_SERENITY_H
|
|
#endif
|
|
|
|
static ALWAYS_INLINE int futex_wait(uint32_t* userspace_address, uint32_t value, const struct timespec* abstime, int clockid)
|
|
{
|
|
int op;
|
|
|
|
if (abstime) {
|
|
// NOTE: FUTEX_WAIT takes a relative timeout, so use FUTEX_WAIT_BITSET instead!
|
|
op = FUTEX_WAIT_BITSET;
|
|
if (clockid == CLOCK_REALTIME || clockid == CLOCK_REALTIME_COARSE)
|
|
op |= FUTEX_CLOCK_REALTIME;
|
|
} else {
|
|
op = FUTEX_WAIT;
|
|
}
|
|
return futex(userspace_address, op, value, abstime, NULL, FUTEX_BITSET_MATCH_ANY);
|
|
}
|
|
|
|
static ALWAYS_INLINE int futex_wake(uint32_t* userspace_address, uint32_t count)
|
|
{
|
|
return futex(userspace_address, FUTEX_WAKE, count, NULL, NULL, 0);
|
|
}
|
|
|
|
#ifdef ALWAYS_INLINE_SERENITY_H
|
|
# undef ALWAYS_INLINE
|
|
#endif
|
|
|
|
int purge(int mode);
|
|
|
|
int perf_event(int type, uintptr_t arg1, uintptr_t arg2);
|
|
int perf_register_string(char const* string, size_t string_length);
|
|
|
|
int get_stack_bounds(uintptr_t* user_stack_base, size_t* user_stack_size);
|
|
|
|
int anon_create(size_t size, int options);
|
|
|
|
int serenity_readlink(const char* path, size_t path_length, char* buffer, size_t buffer_size);
|
|
|
|
int getkeymap(char* name_buffer, size_t name_buffer_size, uint32_t* map, uint32_t* shift_map, uint32_t* alt_map, uint32_t* altgr_map, uint32_t* shift_altgr_map);
|
|
int setkeymap(const char* name, const uint32_t* map, uint32_t* const shift_map, const uint32_t* alt_map, const uint32_t* altgr_map, const uint32_t* shift_altgr_map);
|
|
|
|
uint16_t internet_checksum(const void* ptr, size_t count);
|
|
|
|
int emuctl(uintptr_t command, uintptr_t arg0, uintptr_t arg1);
|
|
|
|
int serenity_open(char const* path, size_t path_length, int options, ...);
|
|
|
|
__END_DECLS
|