static gboolean is_match (gpointer ptr, int type, void *data) { switch (type) { case SGEN_PROTOCOL_COLLECTION: case SGEN_PROTOCOL_THREAD_SUSPEND: case SGEN_PROTOCOL_THREAD_RESTART: case SGEN_PROTOCOL_THREAD_REGISTER: case SGEN_PROTOCOL_THREAD_UNREGISTER: return TRUE; case SGEN_PROTOCOL_ALLOC: case SGEN_PROTOCOL_ALLOC_PINNED: case SGEN_PROTOCOL_ALLOC_DEGRADED: { SGenProtocolAlloc *entry = data; return matches_interval (ptr, entry->obj, entry->size); } case SGEN_PROTOCOL_COPY: { SGenProtocolCopy *entry = data; return matches_interval (ptr, entry->from, entry->size) || matches_interval (ptr, entry->to, entry->size); } case SGEN_PROTOCOL_PIN: { SGenProtocolPin *entry = data; return matches_interval (ptr, entry->obj, entry->size); } case SGEN_PROTOCOL_MARK: { SGenProtocolMark *entry = data; return matches_interval (ptr, entry->obj, entry->size); } case SGEN_PROTOCOL_WBARRIER: { SGenProtocolWBarrier *entry = data; return ptr == entry->ptr || ptr == entry->value; } case SGEN_PROTOCOL_GLOBAL_REMSET: { SGenProtocolGlobalRemset *entry = data; return ptr == entry->ptr || ptr == entry->value; } case SGEN_PROTOCOL_PTR_UPDATE: { SGenProtocolPtrUpdate *entry = data; return ptr == entry->ptr || matches_interval (ptr, entry->old_value, entry->size) || matches_interval (ptr, entry->new_value, entry->size); } case SGEN_PROTOCOL_CLEANUP: { SGenProtocolCleanup *entry = data; return matches_interval (ptr, entry->ptr, entry->size); } case SGEN_PROTOCOL_EMPTY: { SGenProtocolEmpty *entry = data; return matches_interval (ptr, entry->start, entry->size); } case SGEN_PROTOCOL_MISSING_REMSET: { SGenProtocolMissingRemset *entry = data; return ptr == entry->obj || ptr == entry->value || ptr == (char*)entry->obj + entry->offset; } default: assert (0); } }
static gboolean is_match (gpointer ptr, int type, void *data) { switch (TYPE (type)) { case SGEN_PROTOCOL_ALLOC: case SGEN_PROTOCOL_ALLOC_PINNED: case SGEN_PROTOCOL_ALLOC_DEGRADED: { SGenProtocolAlloc *entry = data; return matches_interval (ptr, entry->obj, entry->size); } case SGEN_PROTOCOL_COPY: { SGenProtocolCopy *entry = data; return matches_interval (ptr, entry->from, entry->size) || matches_interval (ptr, entry->to, entry->size); } case SGEN_PROTOCOL_PIN: { SGenProtocolPin *entry = data; return matches_interval (ptr, entry->obj, entry->size); } case SGEN_PROTOCOL_MARK: { SGenProtocolMark *entry = data; return matches_interval (ptr, entry->obj, entry->size); } case SGEN_PROTOCOL_SCAN_BEGIN: { SGenProtocolScanBegin *entry = data; return matches_interval (ptr, entry->obj, entry->size); } case SGEN_PROTOCOL_SCAN_VTYPE_BEGIN: { SGenProtocolScanVTypeBegin *entry = data; return matches_interval (ptr, entry->obj, entry->size); } case SGEN_PROTOCOL_WBARRIER: { SGenProtocolWBarrier *entry = data; return ptr == entry->ptr || ptr == entry->value; } case SGEN_PROTOCOL_GLOBAL_REMSET: { SGenProtocolGlobalRemset *entry = data; return ptr == entry->ptr || ptr == entry->value; } case SGEN_PROTOCOL_PTR_UPDATE: { SGenProtocolPtrUpdate *entry = data; return ptr == entry->ptr || matches_interval (ptr, entry->old_value, entry->size) || matches_interval (ptr, entry->new_value, entry->size); } case SGEN_PROTOCOL_CLEANUP: { SGenProtocolCleanup *entry = data; return matches_interval (ptr, entry->ptr, entry->size); } case SGEN_PROTOCOL_EMPTY: { SGenProtocolEmpty *entry = data; return matches_interval (ptr, entry->start, entry->size); } case SGEN_PROTOCOL_MISSING_REMSET: { SGenProtocolMissingRemset *entry = data; return ptr == entry->obj || ptr == entry->value || ptr == (char*)entry->obj + entry->offset; } case SGEN_PROTOCOL_CARD_SCAN: { SGenProtocolCardScan *entry = data; return matches_interval (ptr, entry->start, entry->size); } case SGEN_PROTOCOL_CEMENT: { SGenProtocolCement *entry = data; return matches_interval (ptr, entry->obj, entry->size); } case SGEN_PROTOCOL_DISLINK_UPDATE: { SGenProtocolDislinkUpdate *entry = data; return ptr == entry->obj || ptr == entry->link; } case SGEN_PROTOCOL_DISLINK_UPDATE_STAGED: { SGenProtocolDislinkUpdateStaged *entry = data; return ptr == entry->obj || ptr == entry->link; } case SGEN_PROTOCOL_DISLINK_PROCESS_STAGED: { SGenProtocolDislinkProcessStaged *entry = data; return ptr == entry->obj || ptr == entry->link; } default: if (is_always_match (type)) return TRUE; assert (0); } }