diff --git a/build_odin.sh b/build_odin.sh index 93d6a979c..9b90a80e2 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -135,7 +135,14 @@ build_odin() { EXTRAFLAGS="-O3" ;; release-native) - EXTRAFLAGS="-O3 -march=native" + local ARCH=$(uname -m) + if [ "${ARCH}" == "arm64" ]; then + # Use preferred flag for Arm (ie arm64 / aarch64 / etc) + EXTRAFLAGS="-O3 -mcpu=native" + else + # Use preferred flag for x86 / amd64 + EXTRAFLAGS="-O3 -march=native" + fi ;; nightly) EXTRAFLAGS="-DNIGHTLY -O3" diff --git a/core/net/socket_darwin.odin b/core/net/socket_darwin.odin index 0d8503cfd..f00be9915 100644 --- a/core/net/socket_darwin.odin +++ b/core/net/socket_darwin.odin @@ -303,8 +303,25 @@ _set_option :: proc(s: Any_Socket, option: Socket_Option, value: any, loc := #ca @(private) _set_blocking :: proc(socket: Any_Socket, should_block: bool) -> (err: Network_Error) { - // TODO: Implement - unimplemented() + socket := any_socket_to_socket(socket) + + flags, getfl_err := os.fcntl(int(socket), os.F_GETFL, 0) + if getfl_err != os.ERROR_NONE { + return Set_Blocking_Error(getfl_err) + } + + if should_block { + flags &= ~int(os.O_NONBLOCK) + } else { + flags |= int(os.O_NONBLOCK) + } + + _, setfl_err := os.fcntl(int(socket), os.F_SETFL, flags) + if setfl_err != os.ERROR_NONE { + return Set_Blocking_Error(setfl_err) + } + + return nil } @private diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index 8999e867b..d2c887b6b 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -267,6 +267,8 @@ SHUT_RD :: 0 SHUT_WR :: 1 SHUT_RDWR :: 2 +F_GETFL: int : 3 /* Get file flags */ +F_SETFL: int : 4 /* Set file flags */ // "Argv" arguments converted to Odin strings args := _alloc_command_line_arguments() @@ -438,7 +440,7 @@ foreign libc { @(link_name="closedir") _unix_closedir :: proc(dirp: Dir) -> c.int --- @(link_name="rewinddir") _unix_rewinddir :: proc(dirp: Dir) --- - @(link_name="__fcntl") _unix__fcntl :: proc(fd: Handle, cmd: c.int, buf: ^byte) -> c.int --- + @(link_name="__fcntl") _unix__fcntl :: proc(fd: Handle, cmd: c.int, #c_vararg args: ..any) -> c.int --- @(link_name="rename") _unix_rename :: proc(old: cstring, new: cstring) -> c.int --- @(link_name="remove") _unix_remove :: proc(path: cstring) -> c.int --- @@ -464,6 +466,7 @@ foreign libc { @(link_name="connect") _unix_connect :: proc(socket: int, addr: rawptr, addr_len: socklen_t) -> int --- @(link_name="bind") _unix_bind :: proc(socket: int, addr: rawptr, addr_len: socklen_t) -> int --- @(link_name="setsockopt") _unix_setsockopt :: proc(socket: int, level: int, opt_name: int, opt_val: rawptr, opt_len: socklen_t) -> int --- + @(link_name="getsockopt") _unix_getsockopt :: proc(socket: int, level: int, opt_name: int, opt_val: rawptr, opt_len: socklen_t) -> int --- @(link_name="recvfrom") _unix_recvfrom :: proc(socket: int, buffer: rawptr, buffer_len: c.size_t, flags: int, addr: rawptr, addr_len: ^socklen_t) -> c.ssize_t --- @(link_name="recv") _unix_recv :: proc(socket: int, buffer: rawptr, buffer_len: c.size_t, flags: int) -> c.ssize_t --- @(link_name="sendto") _unix_sendto :: proc(socket: int, buffer: rawptr, buffer_len: c.size_t, flags: int, addr: rawptr, addr_len: socklen_t) -> c.ssize_t --- @@ -1016,6 +1019,14 @@ setsockopt :: proc(sd: Socket, level: int, optname: int, optval: rawptr, optlen: return ERROR_NONE } +getsockopt :: proc(sd: Socket, level: int, optname: int, optval: rawptr, optlen: socklen_t) -> Errno { + result := _unix_getsockopt(int(sd), level, optname, optval, optlen) + if result < 0 { + return Errno(get_last_error()) + } + return ERROR_NONE +} + recvfrom :: proc(sd: Socket, data: []byte, flags: int, addr: ^SOCKADDR, addr_size: ^socklen_t) -> (u32, Errno) { result := _unix_recvfrom(int(sd), raw_data(data), len(data), flags, addr, addr_size) if result < 0 { @@ -1055,3 +1066,11 @@ shutdown :: proc(sd: Socket, how: int) -> (Errno) { } return ERROR_NONE } + +fcntl :: proc(fd: int, cmd: int, arg: int) -> (int, Errno) { + result := _unix__fcntl(Handle(fd), c.int(cmd), c.int(arg)) + if result < 0 { + return 0, Errno(get_last_error()) + } + return int(result), ERROR_NONE +}