Skip to content

Commit ba63d05

Browse files
committed
Uses virtio-console instead of serial for better performance (and auto resize in the future)
1 parent a41b280 commit ba63d05

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

src/vm/commandQueue.service.ts

+11-8
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,17 @@ export class CommandQueueService {
7373
public constructor(public emulator: EmulatorService) {
7474
//It's called from window.setTimeout so this is window otherwise
7575
this.tickQueue = this.tickQueue.bind(this);
76-
emulator.receivedOutputController.subscribe((chr) => {
77-
try {
78-
this.receiveChr(chr);
79-
} catch (error) {
80-
const errorMsg = `The command queue has encountered an error. Please report the following message and reload the page: ${error}`;
81-
console.log(errorMsg, error);
82-
alert(errorMsg);
83-
this.suspendQueue();
76+
emulator.receivedOutputController.subscribe((data) => {
77+
for (const chr of data) {
78+
//TODO: Rewrite the receive function to receive chunks instead of character by character
79+
try {
80+
this.receiveChr(chr);
81+
} catch (error) {
82+
const errorMsg = `The command queue has encountered an error. Please report the following message and reload the page: ${error}`;
83+
console.log(errorMsg, error);
84+
alert(errorMsg);
85+
this.suspendQueue();
86+
}
8487
}
8588
});
8689
}

src/vm/emulator.worker.ts

+23-18
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ export type WorkerEventResponseMsg =
7171
data: void;
7272
};
7373

74+
const decoder = new TextDecoder();
7475
const parameters = new URLSearchParams(location.search);
7576
const emulator = new V86({
7677
//Emulator binaries
@@ -148,24 +149,31 @@ const emulator = new V86({
148149
//Loads bzimage and initrd from 9p filesystem
149150
bzimage_initrd_from_filesystem: false,
150151
autostart: true,
152+
virtio_console: true,
151153
});
152154

155+
//@ts-ignore
156+
self.emulator = emulator;
157+
153158
let resetting = false;
154159

155160
function sendTerminal(message: string) {
156-
for (let i = 0; i < message.length; i++) {
157-
emulator.bus.send('serial0-input', message.charCodeAt(i));
158-
}
161+
emulator.bus.send(
162+
'virtio-console0-input-bytes',
163+
[...message].map((x) => x.charCodeAt(0)),
164+
);
159165
}
160166
function sendScreen(message: string) {
161-
for (let i = 0; i < message.length; i++) {
162-
emulator.bus.send('serial1-input', message.charCodeAt(i));
163-
}
167+
emulator.bus.send(
168+
'virtio-console1-input-bytes',
169+
[...message].map((x) => x.charCodeAt(0)),
170+
);
164171
}
165172
function sendController(message: string) {
166-
for (let i = 0; i < message.length; i++) {
167-
emulator.bus.send('serial2-input', message.charCodeAt(i));
168-
}
173+
emulator.bus.send(
174+
'virtio-console2-input-bytes',
175+
[...message].map((x) => x.charCodeAt(0)),
176+
);
169177
}
170178
onmessage = ({ data: e }: MessageEvent<WorkerMsg>) => {
171179
switch (e.command) {
@@ -230,24 +238,21 @@ onmessage = ({ data: e }: MessageEvent<WorkerMsg>) => {
230238
}
231239
};
232240

233-
emulator.add_listener('serial0-output-byte', (byte: number) => {
234-
if (byte == 255) return;
241+
emulator.add_listener('virtio-console0-output-bytes', (bytes: Uint8Array) => {
235242
postMessage({
236243
event: 'receivedOutputConsole',
237-
data: [String.fromCharCode(byte)],
244+
data: [decoder.decode(bytes)],
238245
});
239246
});
240-
emulator.add_listener('serial1-output-byte', (byte: number) => {
241-
if (byte == 255) return;
247+
emulator.add_listener('virtio-console1-output-bytes', (bytes: Uint8Array) => {
242248
postMessage({
243249
event: 'receivedOutputScreen',
244-
data: [String.fromCharCode(byte)],
250+
data: [decoder.decode(bytes)],
245251
});
246252
});
247-
emulator.add_listener('serial2-output-byte', (byte: number) => {
248-
if (byte == 255) return;
253+
emulator.add_listener('virtio-console2-output-bytes', (bytes: Uint8Array) => {
249254
postMessage({
250255
event: 'receivedOutputController',
251-
data: [String.fromCharCode(byte)],
256+
data: [decoder.decode(bytes)],
252257
});
253258
});

0 commit comments

Comments
 (0)