diff options
| author | gingerBill <gingerBill@users.noreply.github.com> | 2019-12-01 11:33:23 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-12-01 11:33:23 +0000 |
| commit | 3fd5c3cd851d8f4dfd441141ca7e96889f069933 (patch) | |
| tree | 67f47e79f5c5bb80a3ed1b1e9d79a61c08c0a29d /core/os/os_linux.odin | |
| parent | 0c0c83ee295fe8787a4bdc8b826a5432abba2ca9 (diff) | |
| parent | 99121d6ff2b02f3d16b791eb103bb9f9e8b96475 (diff) | |
Merge pull request #458 from Tetralux/linux-threads
Implement core:thread and core:sync on Unix using pthreads
Diffstat (limited to 'core/os/os_linux.odin')
| -rw-r--r-- | core/os/os_linux.odin | 213 |
1 files changed, 143 insertions, 70 deletions
diff --git a/core/os/os_linux.odin b/core/os/os_linux.odin index dc3cdde93..cf03dac71 100644 --- a/core/os/os_linux.odin +++ b/core/os/os_linux.odin @@ -15,37 +15,138 @@ Syscall :: distinct int; INVALID_HANDLE :: ~Handle(0); -ERROR_NONE: Errno : 0; -EPERM: Errno : 1; -ENOENT: Errno : 2; -EINTR: Errno : 4; -EIO: Errno : 5; -ENXIO: Errno : 6; -EBADF: Errno : 9; -EAGAIN: Errno : 11; -EWOULDBLOCK: Errno : EAGAIN; -ENOMEM: Errno : 12; -EACCES: Errno : 13; -EFAULT: Errno : 14; -EEXIST: Errno : 17; -ENODEV: Errno : 19; -ENOTDIR: Errno : 20; -EISDIR: Errno : 21; -EINVAL: Errno : 22; -ENFILE: Errno : 23; -EMFILE: Errno : 24; -ETXTBSY: Errno : 26; -EFBIG: Errno : 27; -ENOSPC: Errno : 28; -ESPIPE: Errno : 29; -EROFS: Errno : 30; -EPIPE: Errno : 32; -ENAMETOOLONG: Errno : 36; -ELOOP: Errno : 40; -EOVERFLOW: Errno : 75; -EDESTADDRREQ: Errno : 89; -EOPNOTSUPP: Errno : 95; -EDQUOT: Errno : 122; +ERROR_NONE: Errno : 0; +EPERM: Errno : 1; +ENOENT: Errno : 2; +ESRCH: Errno : 3; +EINTR: Errno : 4; +EIO: Errno : 5; +ENXIO: Errno : 6; +EBADF: Errno : 9; +EAGAIN: Errno : 11; +ENOMEM: Errno : 12; +EACCES: Errno : 13; +EFAULT: Errno : 14; +EEXIST: Errno : 17; +ENODEV: Errno : 19; +ENOTDIR: Errno : 20; +EISDIR: Errno : 21; +EINVAL: Errno : 22; +ENFILE: Errno : 23; +EMFILE: Errno : 24; +ETXTBSY: Errno : 26; +EFBIG: Errno : 27; +ENOSPC: Errno : 28; +ESPIPE: Errno : 29; +EROFS: Errno : 30; +EPIPE: Errno : 32; + +EDEADLK: Errno : 35; /* Resource deadlock would occur */ +ENAMETOOLONG: Errno : 36; /* File name too long */ +ENOLCK: Errno : 37; /* No record locks available */ + +ENOSYS: Errno : 38; /* Invalid system call number */ + +ENOTEMPTY: Errno : 39; /* Directory not empty */ +ELOOP: Errno : 40; /* Too many symbolic links encountered */ +EWOULDBLOCK: Errno : EAGAIN; /* Operation would block */ +ENOMSG: Errno : 42; /* No message of desired type */ +EIDRM: Errno : 43; /* Identifier removed */ +ECHRNG: Errno : 44; /* Channel number out of range */ +EL2NSYNC: Errno : 45; /* Level 2 not synchronized */ +EL3HLT: Errno : 46; /* Level 3 halted */ +EL3RST: Errno : 47; /* Level 3 reset */ +ELNRNG: Errno : 48; /* Link number out of range */ +EUNATCH: Errno : 49; /* Protocol driver not attached */ +ENOCSI: Errno : 50; /* No CSI structure available */ +EL2HLT: Errno : 51; /* Level 2 halted */ +EBADE: Errno : 52; /* Invalid exchange */ +EBADR: Errno : 53; /* Invalid request descriptor */ +EXFULL: Errno : 54; /* Exchange full */ +ENOANO: Errno : 55; /* No anode */ +EBADRQC: Errno : 56; /* Invalid request code */ +EBADSLT: Errno : 57; /* Invalid slot */ +EDEADLOCK: Errno : EDEADLK; +EBFONT: Errno : 59; /* Bad font file format */ +ENOSTR: Errno : 60; /* Device not a stream */ +ENODATA: Errno : 61; /* No data available */ +ETIME: Errno : 62; /* Timer expired */ +ENOSR: Errno : 63; /* Out of streams resources */ +ENONET: Errno : 64; /* Machine is not on the network */ +ENOPKG: Errno : 65; /* Package not installed */ +EREMOTE: Errno : 66; /* Object is remote */ +ENOLINK: Errno : 67; /* Link has been severed */ +EADV: Errno : 68; /* Advertise error */ +ESRMNT: Errno : 69; /* Srmount error */ +ECOMM: Errno : 70; /* Communication error on send */ +EPROTO: Errno : 71; /* Protocol error */ +EMULTIHOP: Errno : 72; /* Multihop attempted */ +EDOTDOT: Errno : 73; /* RFS specific error */ +EBADMSG: Errno : 74; /* Not a data message */ +EOVERFLOW: Errno : 75; /* Value too large for defined data type */ +ENOTUNIQ: Errno : 76; /* Name not unique on network */ +EBADFD: Errno : 77; /* File descriptor in bad state */ +EREMCHG: Errno : 78; /* Remote address changed */ +ELIBACC: Errno : 79; /* Can not access a needed shared library */ +ELIBBAD: Errno : 80; /* Accessing a corrupted shared library */ +ELIBSCN: Errno : 81; /* .lib section in a.out corrupted */ +ELIBMAX: Errno : 82; /* Attempting to link in too many shared libraries */ +ELIBEXEC: Errno : 83; /* Cannot exec a shared library directly */ +EILSEQ: Errno : 84; /* Illegal byte sequence */ +ERESTART: Errno : 85; /* Interrupted system call should be restarted */ +ESTRPIPE: Errno : 86; /* Streams pipe error */ +EUSERS: Errno : 87; /* Too many users */ +ENOTSOCK: Errno : 88; /* Socket operation on non-socket */ +EDESTADDRREQ: Errno : 89; /* Destination address required */ +EMSGSIZE: Errno : 90; /* Message too long */ +EPROTOTYPE: Errno : 91; /* Protocol wrong type for socket */ +ENOPROTOOPT: Errno : 92; /* Protocol not available */ +EPROTONOSUPPORT: Errno : 93; /* Protocol not supported */ +ESOCKTNOSUPPORT: Errno : 94; /* Socket type not supported */ +EOPNOTSUPP: Errno : 95; /* Operation not supported on transport endpoint */ +EPFNOSUPPORT: Errno : 96; /* Protocol family not supported */ +EAFNOSUPPORT: Errno : 97; /* Address family not supported by protocol */ +EADDRINUSE: Errno : 98; /* Address already in use */ +EADDRNOTAVAIL: Errno : 99; /* Cannot assign requested address */ +ENETDOWN: Errno : 100; /* Network is down */ +ENETUNREACH: Errno : 101; /* Network is unreachable */ +ENETRESET: Errno : 102; /* Network dropped connection because of reset */ +ECONNABORTED: Errno : 103; /* Software caused connection abort */ +ECONNRESET: Errno : 104; /* Connection reset by peer */ +ENOBUFS: Errno : 105; /* No buffer space available */ +EISCONN: Errno : 106; /* Transport endpoint is already connected */ +ENOTCONN: Errno : 107; /* Transport endpoint is not connected */ +ESHUTDOWN: Errno : 108; /* Cannot send after transport endpoint shutdown */ +ETOOMANYREFS: Errno : 109; /* Too many references: cannot splice */ +ETIMEDOUT: Errno : 110; /* Connection timed out */ +ECONNREFUSED: Errno : 111; /* Connection refused */ +EHOSTDOWN: Errno : 112; /* Host is down */ +EHOSTUNREACH: Errno : 113; /* No route to host */ +EALREADY: Errno : 114; /* Operation already in progress */ +EINPROGRESS: Errno : 115; /* Operation now in progress */ +ESTALE: Errno : 116; /* Stale file handle */ +EUCLEAN: Errno : 117; /* Structure needs cleaning */ +ENOTNAM: Errno : 118; /* Not a XENIX named type file */ +ENAVAIL: Errno : 119; /* No XENIX semaphores available */ +EISNAM: Errno : 120; /* Is a named type file */ +EREMOTEIO: Errno : 121; /* Remote I/O error */ +EDQUOT: Errno : 122; /* Quota exceeded */ + +ENOMEDIUM: Errno : 123; /* No medium found */ +EMEDIUMTYPE: Errno : 124; /* Wrong medium type */ +ECANCELED: Errno : 125; /* Operation Canceled */ +ENOKEY: Errno : 126; /* Required key not available */ +EKEYEXPIRED: Errno : 127; /* Key has expired */ +EKEYREVOKED: Errno : 128; /* Key has been revoked */ +EKEYREJECTED: Errno : 129; /* Key was rejected by service */ + +/* for robust mutexes */ +EOWNERDEAD: Errno : 130; /* Owner died */ +ENOTRECOVERABLE: Errno : 131; /* State not recoverable */ + +ERFKILL: Errno : 132; /* Operation not possible due to RF-kill */ + +EHWPOISON: Errno : 133; /* Memory page has hardware error */ O_RDONLY :: 0x00000; O_WRONLY :: 0x00001; @@ -152,22 +253,6 @@ X_OK :: 1; // Test for execute permission W_OK :: 2; // Test for write permission R_OK :: 4; // Test for read permission -TimeSpec :: struct { - tv_sec : i64, /* seconds */ - tv_nsec : i64, /* nanoseconds */ -}; - -CLOCK_REALTIME :: 0; -CLOCK_MONOTONIC :: 1; -CLOCK_PROCESS_CPUTIME_ID :: 2; -CLOCK_THREAD_CPUTIME_ID :: 3; -CLOCK_MONOTONIC_RAW :: 4; -CLOCK_REALTIME_COARSE :: 5; -CLOCK_MONOTONIC_COARSE :: 6; -CLOCK_BOOTTIME :: 7; -CLOCK_REALTIME_ALARM :: 8; -CLOCK_BOOTTIME_ALARM :: 9; - SYS_GETTID: Syscall : 186; foreign libc { @@ -180,6 +265,7 @@ foreign libc { @(link_name="write") _unix_write :: proc(fd: Handle, buf: rawptr, size: int) -> int ---; @(link_name="lseek64") _unix_seek :: proc(fd: Handle, offset: i64, whence: i32) -> i64 ---; @(link_name="gettid") _unix_gettid :: proc() -> u64 ---; + @(link_name="getpagesize") _unix_getpagesize :: proc() -> i32 ---; @(link_name="stat") _unix_stat :: proc(path: cstring, stat: ^Stat) -> int ---; @(link_name="fstat") _unix_fstat :: proc(fd: Handle, stat: ^Stat) -> int ---; @(link_name="access") _unix_access :: proc(path: cstring, mask: int) -> int ---; @@ -190,10 +276,6 @@ foreign libc { @(link_name="realloc") _unix_realloc :: proc(ptr: rawptr, size: int) -> rawptr ---; @(link_name="getenv") _unix_getenv :: proc(cstring) -> cstring ---; - @(link_name="clock_gettime") _unix_clock_gettime :: proc(clock_id: u64, timespec: ^TimeSpec) ---; - @(link_name="nanosleep") _unix_nanosleep :: proc(requested: ^TimeSpec, remaining: ^TimeSpec) -> int ---; - @(link_name="sleep") _unix_sleep :: proc(seconds: u64) -> int ---; - @(link_name="exit") _unix_exit :: proc(status: int) -> ! ---; } foreign dl { @@ -349,25 +431,6 @@ exit :: proc(code: int) -> ! { _unix_exit(code); } -clock_gettime :: proc(clock_id: u64) -> TimeSpec { - ts : TimeSpec; - _unix_clock_gettime(clock_id, &ts); - return ts; -} - -sleep :: proc(seconds: u64) -> int { - - return _unix_sleep(seconds); -} - -nanosleep :: proc(nanoseconds: i64) -> int { - assert(nanoseconds <= 999999999); - requested, remaining : TimeSpec; - requested = TimeSpec{tv_nsec = nanoseconds}; - - return _unix_nanosleep(&requested, &remaining); -} - current_thread_id :: proc "contextless" () -> int { return syscall(SYS_GETTID); } @@ -393,6 +456,16 @@ dlerror :: proc() -> string { return string(_unix_dlerror()); } +get_page_size :: proc() -> int { + // NOTE(tetra): The page size never changes, so why do anything complicated + // if we don't have to. + @static page_size := -1; + if page_size != -1 do return page_size; + + page_size = int(_unix_getpagesize()); + return page_size; +} + _alloc_command_line_arguments :: proc() -> []string { res := make([]string, len(runtime.args__)); |