static void CallExtensionSelector( Widget widget, ExtSelectRec* rec, Boolean forceCall) { XtEventRec* p; XtPointer* data; int* types; Cardinal i, count = 0; for (p = widget->core.event_table; p != NULL; p = p->next) if (p->has_type_specifier && EXT_TYPE(p) >= rec->min && EXT_TYPE(p) <= rec->max) count += p->mask; if (count == 0 && !forceCall) return; data = (XtPointer *) ALLOCATE_LOCAL(count * sizeof (XtPointer)); types = (int *) ALLOCATE_LOCAL(count * sizeof (int)); count = 0; for (p = widget->core.event_table; p != NULL; p = p->next) if (p->has_type_specifier && EXT_TYPE(p) >= rec->min && EXT_TYPE(p) <= rec->max) for (i =0; i < p->mask; i++) { types[count] = EXT_TYPE(p); data[count++] = EXT_SELECT_DATA(p, i); } (*rec->proc)(widget, types, data, count, rec->client_data); DEALLOCATE_LOCAL((char*) types); DEALLOCATE_LOCAL((char*) data); }
EventMask XtBuildEventMask( Widget widget) { XtEventTable ev; EventMask mask = 0L; WIDGET_TO_APPCON(widget); LOCK_APP(app); for (ev = widget->core.event_table; ev != NULL; ev = ev->next) if (ev->select) { if (!ev->has_type_specifier) mask |= ev->mask; else { if (EXT_TYPE(ev) < LASTEvent) { Cardinal i; for (i = 0; i < ev->mask; i++) if (EXT_SELECT_DATA(ev, i)) mask |= *(EventMask*)EXT_SELECT_DATA(ev, i); } } } LOCK_PROCESS; if (widget->core.widget_class->core_class.expose != NULL) mask |= ExposureMask; if (widget->core.widget_class->core_class.visible_interest) mask |= VisibilityChangeMask; UNLOCK_PROCESS; if (widget->core.tm.translations) mask |= widget->core.tm.translations->eventMask; mask = mask & ~NonMaskableMask; UNLOCK_APP(app); return mask; }
DO_EXT (ext, em) { if (EXT_FREE == EXT_TYPE (ext)) { memset (ext, 0, sizeof (extent_t)); ext->ext_flags = type; return ext; } }
dp_addr_t em_free_count (extent_map_t * em, int type) { dp_addr_t n = 0; DO_EXT (ext, em) { if (type != EXT_TYPE (ext)) continue; n += ext_free_count (ext); } END_DO_EXT; return n; }
void dbs_extent_free (dbe_storage_t * dbs, dp_addr_t ext_dp, int must_be_in_em) { extent_map_t * em; extent_t * ext; int word, bit; uint32 * arr, page_no; ASSERT_IN_DBS (dbs); dbs_locate_ext_bit (dbs, ext_dp, &arr, &page_no, &word, &bit); if (0 == (arr[word] & 1 << bit)) GPF_T1 ("double free in ext set"); page_set_update_checksum (arr, word, bit); arr[word] &= ~(1 << bit); em = DBS_DP_TO_EM (dbs, ext_dp); if (em) { ASSERT_IN_MTX (em->em_mtx); ext = EM_DP_TO_EXT (em, ext_dp); if (ext) { remhash (DP_ADDR2VOID (ext_dp), em->em_dp_to_ext); switch (EXT_TYPE (ext)) { case EXT_INDEX: em->em_n_pages -= EXTENT_SZ; em->em_n_free_pages -= EXTENT_SZ; break; case EXT_REMAP: em->em_n_remap_pages -= EXTENT_SZ; em->em_n_free_remap_pages -= EXTENT_SZ; break; case EXT_BLOB: em->em_n_blob_pages -= EXTENT_SZ; em->em_n_free_blob_pages -= EXTENT_SZ; break; } ext->ext_flags = EXT_FREE; } if (ext == em->em_last_remap_ext) em->em_last_remap_ext = NULL; if (ext == em->em_last_blob_ext) em->em_last_blob_ext = NULL; remhash (DP_ADDR2VOID (ext_dp), dbs->dbs_dp_to_extent_map); } else if (must_be_in_em) GPF_T1 ("cannot free ext that is not part of any em"); }
static void AddEventHandler( Widget widget, XtPointer select_data, int type, Boolean has_type_specifier, Boolean other, XtEventHandler proc, XtPointer closure, XtListPosition position, Boolean force_new_position, Boolean raw) { register XtEventRec *p, **pp; EventMask oldMask = 0, eventMask = 0; if (!has_type_specifier) { eventMask = *(EventMask*)select_data & ~NonMaskableMask; if (other) eventMask |= NonMaskableMask; if (!eventMask) return; } else if (!type) return; if (XtIsRealized(widget) && !raw) oldMask = XtBuildEventMask(widget); if (raw) raw = 1; pp = &widget->core.event_table; while ((p = *pp) && (p->proc != proc || p->closure != closure || p->select == raw || has_type_specifier != p->has_type_specifier || (has_type_specifier && EXT_TYPE(p) != type))) pp = &p->next; if (!p) { /* New proc to add to list */ if (has_type_specifier) { p = (XtEventRec*) __XtMalloc(sizeof(XtEventRec) + sizeof(XtEventRecExt)); EXT_TYPE(p) = type; EXT_SELECT_DATA(p,0) = select_data; p->mask = 1; p->has_type_specifier = True; } else { p = (XtEventRec*) __XtMalloc(sizeof(XtEventRec)); p->mask = eventMask; p->has_type_specifier = False; } p->proc = proc; p->closure = closure; p->select = ! raw; if (position == XtListHead) { p->next = widget->core.event_table; widget->core.event_table = p; pp = &widget->core.event_table; } else { *pp = p; p->next = NULL; } } else { if (force_new_position) { *pp = p->next; if (position == XtListHead) { p->next = widget->core.event_table; widget->core.event_table = p; } else { /* * Find the last element in the list. */ while (*pp) pp = &(*pp)->next; *pp = p; p->next = NULL; } } if (!has_type_specifier) p->mask |= eventMask; else { Cardinal i; /* p->mask specifies count of EXT_SELECT_DATA(p,i) */ for (i = 0; i < p->mask && select_data != EXT_SELECT_DATA(p,i); ) i++; if (i == p->mask) { p = (XtEventRec*) XtRealloc((char*)p, sizeof(XtEventRec) + sizeof(XtEventRecExt) + p->mask * sizeof(XtPointer)); EXT_SELECT_DATA(p,i) = select_data; p->mask++; *pp = p; } } } if (XtIsRealized(widget) && !raw) { EventMask mask = XtBuildEventMask(widget); Display* dpy = XtDisplay (widget); if (oldMask != mask) XSelectInput(dpy, XtWindow(widget), mask); if (has_type_specifier) { XtPerDisplay pd = _XtGetPerDisplay (dpy); int i; for (i = 0; i < pd->ext_select_count; i++) { if (type >= pd->ext_select_list[i].min && type <= pd->ext_select_list[i].max) { CallExtensionSelector(widget, pd->ext_select_list+i, FALSE); break; } if (type < pd->ext_select_list[i].min) break; } } } }
static void RemoveEventHandler( Widget widget, XtPointer select_data, int type, Boolean has_type_specifier, Boolean other, XtEventHandler proc, XtPointer closure, Boolean raw) { XtEventRec *p, **pp; EventMask eventMask, oldMask = XtBuildEventMask(widget); if (raw) raw = 1; pp = &widget->core.event_table; while ((p = *pp) && (p->proc != proc || p->closure != closure || p->select == raw || has_type_specifier != p->has_type_specifier || (has_type_specifier && EXT_TYPE(p) != type))) pp = &p->next; if (!p) return; /* un-register it */ if (!has_type_specifier) { eventMask = *(EventMask*)select_data; eventMask &= ~NonMaskableMask; if (other) eventMask |= NonMaskableMask; p->mask &= ~eventMask; } else { Cardinal i; /* p->mask specifies count of EXT_SELECT_DATA(p,i) * search through the list of selection data, if not found * dont remove this handler */ for (i = 0; i < p->mask && select_data != EXT_SELECT_DATA(p,i);) i++; if (i == p->mask) return; if (p->mask == 1) p->mask = 0; else { p->mask--; while (i < p->mask) { EXT_SELECT_DATA(p,i) = EXT_SELECT_DATA(p, i+1); i++; } } } if (!p->mask) { /* delete it entirely */ *pp = p->next; XtFree((char *)p); } /* Reset select mask if realized and not raw. */ if ( !raw && XtIsRealized(widget) && !widget->core.being_destroyed) { EventMask mask = XtBuildEventMask(widget); Display* dpy = XtDisplay (widget); if (oldMask != mask) XSelectInput(dpy, XtWindow(widget), mask); if (has_type_specifier) { XtPerDisplay pd = _XtGetPerDisplay(dpy); int i; for (i = 0; i < pd->ext_select_count; i++) { if (type >= pd->ext_select_list[i].min && type <= pd->ext_select_list[i].max) { CallExtensionSelector(widget, pd->ext_select_list+i, TRUE); break; } if (type < pd->ext_select_list[i].min) break; } } } }