Skip to content

Commit da2c5ab

Browse files
committed
Fix support for async API on WebGL platforms
1 parent 17d07e7 commit da2c5ab

File tree

5 files changed

+44
-6
lines changed

5 files changed

+44
-6
lines changed

Plugins/tools~/fix-library-path.sed

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,6 @@ s/class SQLite3/partial class SQLite3/
3434
# Add [RequiredMember] attribute to ColumnInfo.Name property
3535
# This fixes managed code stripping removing its setter method
3636
s/Column ("name")/Column ("name"), UnityEngine.Scripting.RequiredMember/
37+
38+
# Use main thread TaskScheduler in WebGL
39+
s/TaskScheduler\.Default/SQLiteAsyncExtensions.TaskScheduler/

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,4 @@ Third-party code:
114114
This is be useful for libraries making raw queries.
115115
- `SQLite3.SetDirectory` is only defined in Windows platforms.
116116
- Adds a `[RequiredMember]` attribute to `ColumnInfo.Name` property, fixing errors on columns when managed code stripping is enabled.
117+
- Changes the `TaskScheduler` used by the async API on WebGL to one that executes tasks on Unity's main thread.

Runtime/SQLiteAsyncExtensions.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System.Threading.Tasks;
2+
using UnityEngine;
3+
4+
namespace SQLite
5+
{
6+
public static class SQLiteAsyncExtensions
7+
{
8+
#if UNITY_WEBGL
9+
// WebGL builds cannot use background threads, so use a
10+
// TaskScheduler that executes tasks on Unity's main thread.
11+
public static TaskScheduler TaskScheduler { get; private set; }
12+
13+
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
14+
private static void InitializeTaskScheduler()
15+
{
16+
TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
17+
}
18+
#else
19+
// On all other platforms, use the default TaskScheduler
20+
public static TaskScheduler TaskScheduler => TaskScheduler.Default;
21+
#endif
22+
}
23+
}

Runtime/SQLiteAsyncExtensions.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Runtime/sqlite-net/SQLiteAsync.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ public Task CloseAsync ()
215215
{
216216
return Task.Factory.StartNew (() => {
217217
SQLiteConnectionPool.Shared.CloseConnection (_connectionString);
218-
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
218+
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, SQLiteAsyncExtensions.TaskScheduler);
219219
}
220220

221221
Task<T> ReadAsync<T> (Func<SQLiteConnectionWithLock, T> read)
@@ -225,7 +225,7 @@ Task<T> ReadAsync<T> (Func<SQLiteConnectionWithLock, T> read)
225225
using (conn.Lock ()) {
226226
return read (conn);
227227
}
228-
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
228+
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, SQLiteAsyncExtensions.TaskScheduler);
229229
}
230230

231231
Task<T> WriteAsync<T> (Func<SQLiteConnectionWithLock, T> write)
@@ -235,7 +235,7 @@ Task<T> WriteAsync<T> (Func<SQLiteConnectionWithLock, T> write)
235235
using (conn.Lock ()) {
236236
return write (conn);
237237
}
238-
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
238+
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, SQLiteAsyncExtensions.TaskScheduler);
239239
}
240240

241241
Task<T> TransactAsync<T> (Func<SQLiteConnectionWithLock, T> transact)
@@ -247,7 +247,7 @@ Task<T> TransactAsync<T> (Func<SQLiteConnectionWithLock, T> transact)
247247
return transact (conn);
248248
}
249249
}
250-
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
250+
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, SQLiteAsyncExtensions.TaskScheduler);
251251
}
252252

253253
/// <summary>
@@ -1201,7 +1201,7 @@ Task<U> ReadAsync<U> (Func<SQLiteConnectionWithLock, U> read)
12011201
using (conn.Lock ()) {
12021202
return read (conn);
12031203
}
1204-
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
1204+
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, SQLiteAsyncExtensions.TaskScheduler);
12051205
}
12061206

12071207
Task<U> WriteAsync<U> (Func<SQLiteConnectionWithLock, U> write)
@@ -1211,7 +1211,7 @@ Task<U> WriteAsync<U> (Func<SQLiteConnectionWithLock, U> write)
12111211
using (conn.Lock ()) {
12121212
return write (conn);
12131213
}
1214-
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
1214+
}, CancellationToken.None, TaskCreationOptions.DenyChildAttach, SQLiteAsyncExtensions.TaskScheduler);
12151215
}
12161216

12171217
/// <summary>

0 commit comments

Comments
 (0)