* Fixing race condition.
* Completely avoid race condition as @lewing suggested.
* keeping old name
* Addressing @radical comments
* Addressing @lewing comments.
* fix unrelated change
* Addressing @lewing comment offline.
mono_wasm_send_dbg_command_with_parms (int id, MdbgProtCommandSet command_set, int command, guint8* data, unsigned int size, int valtype, char* newvalue)
{
if (!debugger_enabled) {
- EM_ASM ({
- MONO.mono_wasm_add_dbg_command_received ($0, $1, $2, $3);
- }, 0, id, 0, 0);
+ mono_wasm_add_dbg_command_received (0, id, 0, 0);
return TRUE;
}
MdbgProtBuffer bufWithParms;
mono_wasm_send_dbg_command (int id, MdbgProtCommandSet command_set, int command, guint8* data, unsigned int size)
{
if (!debugger_enabled) {
- EM_ASM ({
- MONO.mono_wasm_add_dbg_command_received ($0, $1, $2, $3);
- }, 0, id, 0, 0);
+ mono_wasm_add_dbg_command_received(0, id, 0, 0);
return TRUE;
}
ss_calculate_framecount (NULL, NULL, TRUE, NULL, NULL);
else
error = mono_process_dbg_packet (id, command_set, command, &no_reply, data, data + size, &buf);
- mono_wasm_add_dbg_command_received(error == MDBGPROT_ERR_NONE, id, buf.buf, buf.p-buf.buf);
+ mono_wasm_add_dbg_command_received (error == MDBGPROT_ERR_NONE, id, buf.buf, buf.p-buf.buf);
buffer_free (&buf);
return TRUE;
static gboolean
receive_debugger_agent_message (void *data, int len)
{
- mono_wasm_add_dbg_command_received(1, -1, data, len);
+ mono_wasm_add_dbg_command_received(1, 0, data, len);
mono_wasm_save_thread_context();
mono_wasm_fire_debugger_agent_message ();
return FALSE;
internal class MonoSDBHelper
{
private static int debuggerObjectId;
- private static int cmdId;
- private static int GetId() {return cmdId++;}
+ private static int cmdId = 1; //cmdId == 0 is used by events which come from runtime
+ private static int GetNewId() {return cmdId++;}
private static int MINOR_VERSION = 61;
private static int MAJOR_VERSION = 2;
}
internal async Task<MonoBinaryReader> SendDebuggerAgentCommand<T>(T command, MonoBinaryWriter arguments, CancellationToken token) =>
- MonoBinaryReader.From (await proxy.SendMonoCommand(sessionId, MonoCommands.SendDebuggerAgentCommand(proxy.RuntimeId, GetId(), (int)GetCommandSetForCommand(command), (int)(object)command, arguments?.ToBase64().data ?? string.Empty), token));
+ MonoBinaryReader.From (await proxy.SendMonoCommand(sessionId, MonoCommands.SendDebuggerAgentCommand(proxy.RuntimeId, GetNewId(), (int)GetCommandSetForCommand(command), (int)(object)command, arguments?.ToBase64().data ?? string.Empty), token));
internal CommandSet GetCommandSetForCommand<T>(T command) =>
command switch {
};
internal async Task<MonoBinaryReader> SendDebuggerAgentCommandWithParms<T>(T command, (string data, int length) encoded, int type, string extraParm, CancellationToken token) =>
- MonoBinaryReader.From(await proxy.SendMonoCommand(sessionId, MonoCommands.SendDebuggerAgentCommandWithParms(proxy.RuntimeId, GetId(), (int)GetCommandSetForCommand(command), (int)(object)command, encoded.data, encoded.length, type, extraParm), token));
+ MonoBinaryReader.From(await proxy.SendMonoCommand(sessionId, MonoCommands.SendDebuggerAgentCommandWithParms(proxy.RuntimeId, GetNewId(), (int)GetCommandSetForCommand(command), (int)(object)command, encoded.data, encoded.length, type, extraParm), token));
public async Task<int> CreateString(string value, CancellationToken token)
{
command = CmdVM.InvokeMethod,
buffer = data,
length = length,
+ id = GetNewId()
}),
name = propertyNameStr
}));
command = CmdObject.RefSetValues,
buffer = data,
valtype,
- length = length
+ length,
+ id = GetNewId()
}));
}
if (!isRootHidden)
command = CmdVM.InvokeMethod,
buffer = data,
valtype = attr["set"]["valtype"],
- length = length
+ length,
+ id = GetNewId()
});
}
continue;
commandSet = CommandSet.Vm,
command = CmdVM.InvokeMethod,
buffer = data,
- length = length
+ length = length,
+ id = GetNewId()
}),
name = propertyNameStr
}));
import cwraps from "./cwraps";
import { VoidPtr, CharPtr } from "./types/emscripten";
-let commands_received: CommandResponse;
+const commands_received : any = new Map<number, CommandResponse>();
+commands_received.remove = function (key: number) : CommandResponse { const value = this.get(key); this.delete(key); return value;};
let _call_function_res_cache: any = {};
let _next_call_function_res_id = 0;
let _debugger_buffer_len = -1;
value: base64String
}
};
- commands_received = buffer_obj;
+ if (commands_received.has(id))
+ console.warn("Addind an id that already exists in commands_received");
+ commands_received.set(id, buffer_obj);
}
function mono_wasm_malloc_and_set_debug_buffer(command_parameters: string) {
mono_wasm_malloc_and_set_debug_buffer(command_parameters);
cwraps.mono_wasm_send_dbg_command_with_parms(id, command_set, command, _debugger_buffer, length, valtype, newvalue.toString());
- const { res_ok, res } = commands_received;
+ const { res_ok, res } = commands_received.remove(id);
if (!res_ok)
throw new Error("Failed on mono_wasm_invoke_method_debugger_agent_with_parms");
return res;
mono_wasm_malloc_and_set_debug_buffer(command_parameters);
cwraps.mono_wasm_send_dbg_command(id, command_set, command, _debugger_buffer, command_parameters.length);
- const { res_ok, res } = commands_received;
+ const { res_ok, res } = commands_received.remove(id);
+
if (!res_ok)
throw new Error("Failed on mono_wasm_send_dbg_command");
return res;
}
export function mono_wasm_get_dbg_command_info(): CommandResponseResult {
- const { res_ok, res } = commands_received;
+ const { res_ok, res } = commands_received.remove(0);
+
if (!res_ok)
throw new Error("Failed on mono_wasm_get_dbg_command_info");
return res;
prop.name,
{
get() {
- return mono_wasm_send_dbg_command(-1, prop.get.commandSet, prop.get.command, prop.get.buffer);
+ return mono_wasm_send_dbg_command(prop.get.id, prop.get.commandSet, prop.get.command, prop.get.buffer);
},
set: function (newValue) {
- mono_wasm_send_dbg_command_with_parms(-1, prop.set.commandSet, prop.set.command, prop.set.buffer, prop.set.length, prop.set.valtype, newValue); return commands_received.res_ok;
+ mono_wasm_send_dbg_command_with_parms(prop.set.id, prop.set.commandSet, prop.set.command, prop.set.buffer, prop.set.length, prop.set.valtype, newValue); return true;
}
}
);
return prop.value;
},
set: function (newValue) {
- mono_wasm_send_dbg_command_with_parms(-1, prop.set.commandSet, prop.set.command, prop.set.buffer, prop.set.length, prop.set.valtype, newValue); return commands_received.res_ok;
+ mono_wasm_send_dbg_command_with_parms(prop.set.id, prop.set.commandSet, prop.set.command, prop.set.buffer, prop.set.length, prop.set.valtype, newValue); return true;
}
}
);