Beispiel #1
0
/* XXX: free idents too */
void css_free_style_sheet(CSSStyleSheet *s)
{
    CSSStyleSheetEntry *e, *e1;
    CSSProperty *p, *p1;
    CSSSimpleSelector *ss, *ss1;

    for (e = s->first_entry; e != NULL; e = e1) {
        e1 = e->next;

        for (ss = e->sel.next; ss != NULL; ss = ss1) {
            ss1 = ss->next;
            free_selector(ss);
            free(ss);
        }
        free_selector(&e->sel);

        for (p = e->props; p != NULL; p = p1) {
            p1 = p->next;
            free(p);
        }
        free(e);
    }

    free(s);
}
Beispiel #2
0
/* XXX: free idents too */
void css_free_style_sheet(CSSStyleSheet **sp)
{
    if (*sp) {
        CSSStyleSheet *s = *sp;

        while (s->first_entry) {
            CSSStyleSheetEntry *e = s->first_entry;
            s->first_entry = e->next;

            while (e->sel.next) {
                CSSSimpleSelector *ss = e->sel.next;
                e->sel.next = ss->next;
                free_selector(ss);
                qe_free(&ss);
            }
            free_selector(&e->sel);

            while (e->props) {
                CSSProperty *p = e->props;
                e->props = p->next;
                qe_free(&p);
            }
            qe_free(&e);
        }
        qe_free(sp);
    }
}
Beispiel #3
0
static ERL_NIF_TERM
read_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
	ks_returner_t	*ret;
	ERL_NIF_TERM	term, statistics;
	ks_handle_t	*handle;
	ks_instance_t	*ksi;
	ks_nvpair_t	*nvpair;
	char		*ks_number;
	ks_selector_t	*selector;
	int		matched;

	ret = new_returner(env);

	if (argc < 1 || argc > 6) {
		return EKSTAT_RETURN(enif_make_badarg(ret->env));
	}

	if (!enif_get_resource(env, argv[0], kstat_handle, (void **)(&handle))) {
		return EKSTAT_RETURN(enif_make_badarg(ret->env));
	}

	selector = new_selector(ret);

	if (ret->ready == B_TRUE) {
		if ((void *)(selector) != NULL) {
			free_selector(selector);
		}
		return EKSTAT_RETURN(ret->term);
	}

	switch (argc) {
	case 2:
		(void) ks_selector_arg(ret, &selector->ks_class, argv[1]);
		break;
	case 3:
		(void) ks_selector_arg(ret, &selector->ks_class, argv[1]);
		(void) ks_selector_arg(ret, &selector->ks_module, argv[2]);
		break;
	case 4:
		(void) ks_selector_arg(ret, &selector->ks_class, argv[1]);
		(void) ks_selector_arg(ret, &selector->ks_module, argv[2]);
		(void) ks_selector_arg(ret, &selector->ks_instance, argv[3]);
		break;
	case 5:
		(void) ks_selector_arg(ret, &selector->ks_class, argv[1]);
		(void) ks_selector_arg(ret, &selector->ks_module, argv[2]);
		(void) ks_selector_arg(ret, &selector->ks_instance, argv[3]);
		(void) ks_selector_arg(ret, &selector->ks_name, argv[4]);
		break;
	case 6:
		(void) ks_selector_arg(ret, &selector->ks_class, argv[1]);
		(void) ks_selector_arg(ret, &selector->ks_module, argv[2]);
		(void) ks_selector_arg(ret, &selector->ks_instance, argv[3]);
		(void) ks_selector_arg(ret, &selector->ks_name, argv[4]);
		(void) ks_selector_arg(ret, &selector->ks_statistic, argv[5]);
		break;
	default:
		break;
	}

	if (ret->ready == B_TRUE) {
		free_selector(selector);
		return EKSTAT_RETURN(ret->term);
	}

	term = enif_make_list(env, 0);

	/* Iterate over each instance */
	for (ksi = list_head(&handle->instances_list); ksi != NULL; ksi = list_next(&handle->instances_list, ksi)) {
		matched = 0;
		statistics = (ERL_NIF_TERM)(NULL);

		(void) asprintf(&ks_number, "%d", ksi->ks_instance);
		if (
			!(ks_match(ret, ksi->ks_module, &selector->ks_module) &&
			ks_match(ret, ksi->ks_name, &selector->ks_name) &&
			ks_match(ret, ks_number, &selector->ks_instance) &&
			ks_match(ret, ksi->ks_class, &selector->ks_class))
		) {
			free(ks_number);
			if (ret->ready == B_TRUE) {
				free_selector(selector);
				return EKSTAT_RETURN(ret->term);
			}
			continue;
		}

		free(ks_number);

		/* Finally iterate over each statistic */
		for (nvpair = list_head(&ksi->ks_nvlist); nvpair != NULL; nvpair = list_next(&ksi->ks_nvlist, nvpair)) {
			if (!ks_match(ret, nvpair->name, &selector->ks_statistic)) {
				if (ret->ready == B_TRUE) {
					free_selector(selector);
					return EKSTAT_RETURN(ret->term);
				}
				continue;
			}

			if ((void *)(statistics) == NULL) {
				statistics = enif_make_list(env, 0);
			}

			matched = 1;
			statistics = enif_make_list_cell(env, ks_nvpair_term(ret, nvpair), statistics);
		}

		if (matched == 1) {
			term = enif_make_list_cell(env, ks_instance_term(ret, ksi, statistics), term);
		}
	}

	free_selector(selector);

	return EKSTAT_RETURN(term);
}