Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Playdate support #1

Draft
wants to merge 75 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
a15bd86
WIP Playdate support
kubukoz Jan 13, 2024
f09330d
Not using dynamic libraries so revert
kubukoz Jan 13, 2024
5d489f9
Revert this too
kubukoz Jan 13, 2024
7f8ce7e
Revert
kubukoz Jan 13, 2024
461b8ce
Remove atomic adds from the equation
kubukoz Jan 14, 2024
bffe195
well, apparently we can uncomment this now
kubukoz Jan 14, 2024
7b25bd2
Smaller chunk (for starters), uncomment unused code
kubukoz Jan 14, 2024
008b864
whitespace
kubukoz Jan 14, 2024
e166563
revert unused change
kubukoz Jan 14, 2024
9200613
Looks like we don't need continuations???
kubukoz Jan 14, 2024
55caa0c
Try to print exception message when catching
kubukoz Jan 14, 2024
b4dc8db
less diff good
kubukoz Jan 14, 2024
7db8ec9
memory tweaks
kubukoz Jan 14, 2024
39250b2
implement main thread
kubukoz Jan 14, 2024
b04d196
add nix shell
kubukoz Jan 18, 2024
5eb120b
definitely not Scana
kubukoz Jan 28, 2024
74d6ec6
Remove now unused log util
kubukoz Jan 28, 2024
4f75ab7
Proper OOM logging
kubukoz Jan 28, 2024
0f56cdd
Merge branch 'main' into playdate-support
kubukoz Jan 28, 2024
52587df
HACKS for immix
kubukoz Jan 28, 2024
97bbc2d
HACKS for any GC really
kubukoz Jan 28, 2024
0e5fb5b
Merge branch 'main' into playdate-support
kubukoz Jan 29, 2024
4b80769
Bump to 8 megs
kubukoz Jan 30, 2024
610b7c4
15 megs should do?
kubukoz Jan 30, 2024
1e88043
14 works!
kubukoz Jan 30, 2024
fe23ade
Merge branch 'main' into playdate-support
kubukoz Jan 30, 2024
f2f7ffe
Use multiline comment for Continuations.scala
kubukoz Jan 30, 2024
9ea00aa
Uncomment delimcc headers
kubukoz Jan 30, 2024
2215032
Reduce diff in delimcc.c
kubukoz Jan 30, 2024
f31b2bc
Merge branch 'main' into playdate-support
kubukoz Feb 4, 2024
46171cc
Remove remaining printf, add exits for explicit failure codes
kubukoz Feb 4, 2024
cf444aa
Improve logging, do more of it
kubukoz Feb 6, 2024
f05606a
update logs
kubukoz Feb 6, 2024
4499172
Merge branch 'main' into playdate-support
kubukoz Feb 6, 2024
b93500f
fix indent
kubukoz Feb 6, 2024
a2cd3f3
update assert
kubukoz Feb 6, 2024
c4bf105
Fix other immix asserts
kubukoz Feb 6, 2024
26a281a
Merge branch 'main' into playdate-support
kubukoz Feb 8, 2024
e986d1e
add more hints
kubukoz Feb 8, 2024
9f3ebb3
constant size heap, better logs, decrease memory to 10mb
kubukoz Feb 9, 2024
efea782
Wojtek's hacks
kubukoz Feb 9, 2024
9263407
Merge branch 'main' into playdate-support
kubukoz Feb 17, 2024
d83778c
print GC stats
kubukoz Feb 17, 2024
4bffc0e
Merge branch 'main' into playdate-support
kubukoz Mar 10, 2024
94e43ab
format lol
kubukoz Mar 10, 2024
727cdb8
formatting
kubukoz Mar 10, 2024
91e1c85
Remove debugging utils
kubukoz Mar 17, 2024
99c5057
Bring over the stubs for atomic/unwind
kubukoz Mar 17, 2024
4faff10
formatting
kubukoz Mar 17, 2024
8781d1e
Merge branch 'main' into playdate-support
kubukoz Apr 13, 2024
6e97ad9
dead import
kubukoz Apr 16, 2024
d8b4072
clangfmt
kubukoz Apr 16, 2024
5ef51e3
more fmt
kubukoz Apr 16, 2024
2cabe35
PlaydateThread is gone!
kubukoz Apr 16, 2024
7b416ba
stdatomic changes are gone!
kubukoz Apr 17, 2024
b6ccd41
stdatomic (scala) is gone!
kubukoz Apr 17, 2024
b186c52
unixIf changes are gone!
kubukoz Apr 17, 2024
29df39b
nl_types customizations are gone!
kubukoz Apr 17, 2024
009f819
netdb changes are gone!
kubukoz Apr 17, 2024
f224dae
pwd.c changes are gone!
kubukoz Apr 17, 2024
fc0b8f9
spawn.c is gone
kubukoz Apr 17, 2024
bca5cb1
more stuff is gone!
kubukoz Apr 17, 2024
0960bd4
langinfo changes gone
kubukoz Apr 17, 2024
cdf707c
if.c is gone
kubukoz Apr 17, 2024
7ea5604
wordexp changes are gone
kubukoz Apr 17, 2024
b29c87f
revert Thread.scala changes
kubukoz Apr 17, 2024
b7ee024
Revert GC=none change
kubukoz Apr 17, 2024
9a6d163
Remove no-op ifdef
kubukoz Apr 17, 2024
9d228cb
cleanup flake
kubukoz Apr 17, 2024
eefe595
ThreadUtil: don't use thread APIs if multithreading&commix aren't in use
kubukoz Apr 17, 2024
903d160
ThreadUtil: don't use thread APIs if multithreading&commix aren't in use
kubukoz Apr 17, 2024
f8cd84e
Merge branch 'threadutil-no-threads' into playdate-support
kubukoz Apr 17, 2024
bd702a0
Merge branch 'dead-code-removal' into playdate-support
kubukoz Apr 17, 2024
1c941d0
Reset DEFAULT_MIN_HEAP_SIZE
kubukoz Apr 17, 2024
3c7902a
Restore Continutations.scala
kubukoz Apr 17, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .envrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
use flake
7 changes: 4 additions & 3 deletions clib/src/main/resources/scala-native/stdatomic.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,17 +213,18 @@ unsigned long scalanative_atomic_fetch_xor_ulong(_Atomic(unsigned long)* atm, un
unsigned long scalanative_atomic_fetch_xor_explicit_ulong(_Atomic(unsigned long)* atm, unsigned long val, memory_order memoryOrder) { return atomic_fetch_xor_explicit(atm, val, memoryOrder);}

void scalanative_atomic_init_llong(_Atomic(long long)* atm, long long init_value) { atomic_init(atm, init_value);}
long long scalanative_atomic_load_llong(_Atomic(long long)* atm) { return atomic_load(atm);}
// long long scalanative_atomic_load_llong(_Atomic(long long)* atm) { return atomic_load(atm);}
long long scalanative_atomic_load_explicit_llong(_Atomic(long long)* atm, memory_order memoryOrder) { return atomic_load_explicit(atm, memoryOrder);}
void scalanative_atomic_store_llong(_Atomic(long long)* atm, long long val) {atomic_store(atm, val);}
void scalanative_atomic_store_explicit_llong(_Atomic(long long)* atm, long long val, memory_order memoryOrder) { atomic_store_explicit(atm, val, memoryOrder);}
long long scalanative_atomic_exchange_llong(_Atomic(long long)* atm, long long val) { return atomic_exchange(atm, val);}
long long scalanative_atomic_exchange_explicit_llong(_Atomic(long long)* atm, long long val, memory_order memoryOrder) { return atomic_exchange_explicit(atm, val, memoryOrder);}
bool scalanative_atomic_compare_exchange_strong_llong(_Atomic(long long)* atm, long long* expected, long long desired) { return atomic_compare_exchange_strong(atm, expected, desired);}
// bool scalanative_atomic_compare_exchange_strong_llong(_Atomic(long long)* atm, long long* expected, long long desired) { return atomic_compare_exchange_strong(atm, expected, desired);}
bool scalanative_atomic_compare_exchange_strong_explicit_llong(_Atomic(long long)* atm, long long* expected, long long desired, memory_order onSucc, memory_order onFail) { return atomic_compare_exchange_strong_explicit(atm, expected, desired, onSucc, onFail);}
bool scalanative_atomic_compare_exchange_weak_llong(_Atomic(long long)* atm, long long* expected, long long desired) { return atomic_compare_exchange_weak(atm, expected, desired);}
bool scalanative_atomic_compare_exchange_weak_explicit_llong(_Atomic(long long)* atm, long long* expected, long long desired, memory_order onSucc, memory_order onFail) { return atomic_compare_exchange_weak_explicit(atm, expected, desired, onSucc, onFail);}
long long scalanative_atomic_fetch_add_llong(_Atomic(long long)* atm, long long val) { return atomic_fetch_add(atm, val);}
// todo
// long long scalanative_atomic_fetch_add_llong(_Atomic(long long)* atm, long long val) { return atomic_fetch_add(atm, val);}
long long scalanative_atomic_fetch_add_explicit_llong(_Atomic(long long)* atm, long long val, memory_order memoryOrder) { return atomic_fetch_add_explicit(atm, val, memoryOrder);}
long long scalanative_atomic_fetch_sub_llong(_Atomic(long long)* atm, long long val) { return atomic_fetch_sub(atm, val);}
long long scalanative_atomic_fetch_sub_explicit_llong(_Atomic(long long)* atm, long long val, memory_order memoryOrder) { return atomic_fetch_sub_explicit(atm, val, memoryOrder);}
Expand Down
4 changes: 2 additions & 2 deletions clib/src/main/scala/scala/scalanative/libc/stdatomic.scala
Original file line number Diff line number Diff line change
Expand Up @@ -539,8 +539,8 @@ import scala.language.implicitConversions
@name("scalanative_atomic_compare_exchange_weak_explicit_llong")
def atomic_compare_exchange_weak_explicit(ptr: Ptr[atomic_llong], expected: Ptr[CLongLong], desired: CLongLong, memoryOrderOnSuccess: memory_order, memoryOrderOnFailure: memory_order): CBool = extern

@name("scalanative_atomic_fetch_add_llong")
def atomic_fetch_add(ptr: Ptr[atomic_llong], value: CLongLong): CLongLong = extern
// @name("scalanative_atomic_fetch_add_llong")
// def atomic_fetch_add(ptr: Ptr[atomic_llong], value: CLongLong): CLongLong = extern
@name("scalanative_atomic_fetch_add_explicit_llong")
def atomic_fetch_add_explicit(ptr: Ptr[atomic_llong], value: CLongLong, memoryOrder: memory_order): CLongLong = extern
@name("scalanative_atomic_fetch_sub_llong")
Expand Down
60 changes: 60 additions & 0 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions flake.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
inputs.nixpkgs.url = "github:nixos/nixpkgs";
inputs.flake-utils.url = "github:numtide/flake-utils";

outputs = { self, nixpkgs, flake-utils, ... }@inputs:
flake-utils.lib.eachDefaultSystem (
system:
let
pkgs = import nixpkgs {
inherit system;
};
in
{
devShells.default = pkgs.mkShell {
buildInputs = [ (pkgs.sbt.override { jre = pkgs.openjdk8; }) ];
};
}
);
}

2 changes: 1 addition & 1 deletion javalib/src/main/resources/scala-native/netinet/unixIf.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#if defined(_WIN32)
#if defined(_WIN32) || defined(TARGET_PLAYDATE)
// No Windows support. These are dummies for linking.
int scalanative_iff_loopback() { return 0; }
int scalanative_iff_multicast() { return 0; }
Expand Down
22 changes: 13 additions & 9 deletions javalib/src/main/scala/java/lang/System.scala
Original file line number Diff line number Diff line change
Expand Up @@ -161,9 +161,11 @@ private object SystemProperties {
Some(fromCWideString(buf, StandardCharsets.UTF_16LE))
else None
} else {
val buf: Ptr[scala.Byte] = stackalloc[scala.Byte](bufSize)
val cwd = unistd.getcwd(buf, bufSize)
Option(cwd).map(fromCString(_))
// val buf: Ptr[scala.Byte] = stackalloc[scala.Byte](bufSize)
// val cwd = unistd.getcwd(buf, bufSize)
// Option(cwd).map(fromCString(_))
// todo: implement stubs for the above so that it links fine without Scala changes
None
}
}

Expand All @@ -178,12 +180,14 @@ private object SystemProperties {
else None
}
} else {
val buf = stackalloc[pwd.passwd]()
val uid = unistd.getuid()
val res = pwd.getpwuid(uid, buf)
if (res == 0 && buf.pw_dir != null)
Some(fromCString(buf.pw_dir))
else None
// val buf = stackalloc[pwd.passwd]()
// val uid = unistd.getuid()
// val res = pwd.getpwuid(uid, buf)
// if (res == 0 && buf.pw_dir != null)
// Some(fromCString(buf.pw_dir))
// else None
// todo: implement stubs for the above so that it links fine without Scala changes
None
}
}

Expand Down
9 changes: 7 additions & 2 deletions javalib/src/main/scala/java/lang/Thread.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,17 @@ import scala.scalanative.libc.stdatomic.memory_order._
import scala.scalanative.runtime.UnsupportedFeature

import scala.scalanative.runtime.JoinNonDaemonThreads
import scala.scalanative.unsafe.extern
import scala.scalanative.unsafe.name
import scala.scalanative.unsafe.CQuote
import scala.scalanative.unsafe.CString

class Thread private[lang] (
@volatile private var name: String,
private[java] val platformCtx: PlatformThreadContext /* | Null */
) extends Runnable {
protected val tid = ThreadIdentifiers.next()
// this will be reset by MainThread afterwards, so we don't need to use the atomic counter.
protected val tid: scala.Long = -1 // ThreadIdentifiers.next()

@volatile private var interruptedState = false
@volatile private[java] var parkBlocker: Object = _
Expand Down Expand Up @@ -510,7 +515,7 @@ object Thread {

@alwaysinline private[lang] def nativeCompanion: NativeThread.Companion =
if (isWindows) WindowsThread
else PosixThread
else PlaydateThread // PosixThread

def activeCount(): Int = currentThread()
.getThreadGroup()
Expand Down
23 changes: 23 additions & 0 deletions javalib/src/main/scala/java/lang/impl/PlaydateThread.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package java.lang.impl

import scala.scalanative.runtime.NativeThread
import scala.scalanative.unsafe.CInt
import scala.scalanative.unsafe.CQuote

object PlaydateThread extends NativeThread.Companion {
type Impl = PlaydateThread

override def create(thread: Thread, stackSize: Long): Impl =
new PlaydateThread(thread, stackSize)

override def yieldThread(): Unit = System.exit(11)
}

class PlaydateThread(val thread: Thread, stackSize: Long) extends NativeThread {
override def interrupt(): Unit = System.exit(12)
def setPriority(priority: CInt): Unit = System.exit(13)
def sleep(millis: Long): Unit = System.exit(14)
def sleepNanos(nanos: Int): Unit = System.exit(15)
def unpark(): Unit = System.exit(16)
protected def park(time: Long, isAbsolute: Boolean): Unit = System.exit(17)
}