public SyncVar GetSyncVarFromUIntPtr(UIntPtr o) { SyncVar ret; if (!uintptr_to_syncvar.TryGetValue(o.ToUInt64(), out ret)) { ret = (SyncVar)MChessChess.GetNextSyncVar(); Conversions.NewVar(ret); uintptr_to_syncvar.Add(o.ToUInt64(), ret); } return(ret); }
public SyncVar GetSyncVarFromGCAddress(GCAddress gca) { SyncVar ret; if (!gca_to_syncvar.TryGetValue(gca, out ret)) { // NOTE: we are ignoring the (highly weird) case where the object might be a Thread ret = (SyncVar)MChessChess.GetNextSyncVar(); Conversions.NewVar(ret); gca.AddRef(); // VERY IMPORTANT: must ref count to keep unmanaged cell alive gca_to_syncvar.Add(gca, ret); } return(ret); }
public SyncVar GetSyncVarFromNativeHandle(System.IntPtr handle) { lock (this) { SyncVar ret; if (handleToSyncVar.TryGetValue(handle, out ret)) { return(ret); } ret = (SyncVar)MChessChess.GetNextSyncVar(); Conversions.NewVar(ret); handleToSyncVar[handle] = ret; return(ret); } }
public SyncVar GetSyncVarFromObject(object o) { SyncVar ret; WeakReference w = new WeakReference(o); if (o.GetType() == typeof(System.Threading.Thread)) { // in this case, the SyncVar value is the ChessTask id ret = tid_to_ctid[(o as System.Threading.Thread).ManagedThreadId]; return(ret); } else if (!obj_to_syncvar.TryGetValue(w, out ret)) { ret = (SyncVar)MChessChess.GetNextSyncVar(); Conversions.NewVar(ret); obj_to_syncvar.Add(w, ret); } return(ret); }