rem: free(orec);
add: wfree(orec);
context: WMRemoveNotificationObserverWithName(void *observer, char *name, void *object){    NotificationObserver *orec, *tmp, *rec;    NotificationObserver *newList = NULL;    /* get the list of actions the observer is doing */    orec = WMHashGet(notificationCenter->observerTable, observer);    WMHashRemove(notificationCenter->observerTable, observer);    /* rebuild the list of actions for the observer */    while (orec) {	tmp = orec->nextAction;	if (orec->name == name && orec->object == object) {	    if (!name && !object) {		if (notificationCenter->nilList == orec)		    notificationCenter->nilList = orec->next;	    } else if (!name) {		rec = WMHashGet(notificationCenter->objectTable, orec->object);		if (rec==orec) {		    assert(rec->prev==NULL);		    /* replace table entry */		    if (orec->next) {			WMHashInsert(notificationCenter->objectTable, 				     orec->object, orec->next);		    } else {			WMHashRemove(notificationCenter->objectTable, 				     orec->object);		    }		}	    } else {		rec = WMHashGet(notificationCenter->nameTable, orec->name);		if (rec==orec) {		    assert(rec->prev==NULL);		    /* replace table entry */		    if (orec->next) {			WMHashInsert(notificationCenter->nameTable,				     orec->name, orec->next);		    } else {			WMHashRemove(notificationCenter->nameTable, 				     orec->name);		    }		}	    }	    if (orec->prev)		orec->prev->next = orec->next;	    if (orec->next)		orec->next->prev = orec->prev;	    free(orec);        } else {	    /* append this action in the new action list */	    orec->nextAction = NULL;	    if (!newList) {		newList = orec;	    } else {		NotificationObserver *p;		p = newList;		while (p->nextAction) {		    p = p->nextAction;		}		p->nextAction = orec;	    }	}	orec = tmp;    }    /* reinsert the list to the table */    if (newList) {	WMHashInsert(notificationCenter->observerTable, observer, newList);    }}