Ejemplo n.º 1
0
Archivo: papi.c Proyecto: DundalkIT/pcp
static int
check_papi_state()
{
    int state = 0;
    int sts;

    sts = PAPI_state(EventSet, &state);
    if (sts != PAPI_OK)
	return sts;
    return state;
}
Ejemplo n.º 2
0
void HWCBE_PAPI_CleanUp (unsigned nthreads)
{
	UNREFERENCED_PARAMETER(nthreads);

	if (PAPI_is_initialized())
	{
		int state;
		int i;
		unsigned t;

		if (PAPI_state (HWCEVTSET(THREADID), &state) == PAPI_OK)
		{
			if (state & PAPI_RUNNING)
			{
				long long tmp[MAX_HWC];
				PAPI_stop (HWCEVTSET(THREADID), tmp);
			}
		}

		for (i = 0; i < HWC_num_sets; i++)
		{
			for (t = 0; t < nthreads; t++)
			{
				/* Remove all events in the eventset and destroy the eventset */
				PAPI_cleanup_eventset(HWC_sets[i].eventsets[t]);
				PAPI_destroy_eventset(&HWC_sets[i].eventsets[t]);
			}
			xfree (HWC_sets[i].eventsets);
		}

#if defined(PAPI_SAMPLING_SUPPORT)
		for (i = 0; i < HWC_num_sets; i++)
		{
			/* Free extra allocated memory */
			if (HWC_sets[i].NumOverflows > 0)
			{
				xfree (HWC_sets[i].OverflowValue);
				xfree (HWC_sets[i].OverflowCounter);
			}
		}
#endif
		xfree (HWC_sets); 

		PAPI_shutdown();
	}
}
Ejemplo n.º 3
0
Archivo: papi.c Proyecto: DundalkIT/pcp
static int
papi_fetchCallBack(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom)
{
    __pmID_int *idp = (__pmID_int *)&(mdesc->m_desc.pmid);
    int sts;
    int i;
    int state;
    char local_string[PAPI_HUGE_STR_LEN+12];
    static char status_string[4096];
    int first_metric = 0;
    time_t now;

    now = time(NULL);

    switch (idp->cluster) {
    case CLUSTER_PAPI:
	if (idp->item >= 0 && idp->item <= number_of_events) {
	    // the 'case' && 'idp->item' value we get is the pmns_position
	    if (papi_info[idp->item].position >= 0) { // live counter?
		atom->ll = papi_info[idp->item].prev_value + values[papi_info[idp->item].position];
		return PMDA_FETCH_STATIC;
	    }
	    else { // inactive counter?
                if (papi_info[idp->item].metric_enabled) { // but requested?
                    papi_info[idp->item].metric_enabled = 0; // give up
                    return PM_ERR_VALUE; // i.e., expect no values ever
                }
                return PMDA_FETCH_NOVALUES;
            }
	}

	return PM_ERR_PMID;

    case CLUSTER_CONTROL:
	switch (idp->item) {
	case CONTROL_ENABLE:
	    atom->cp = "";
	    return PMDA_FETCH_STATIC;

	case CONTROL_RESET:
	    atom->cp = "";
	    return PMDA_FETCH_STATIC;

	case CONTROL_DISABLE:
	    atom->cp = "";
	    if ((sts = check_papi_state()) & PAPI_RUNNING)
		return PMDA_FETCH_STATIC;
	    return 0;

	case CONTROL_STATUS:
	    sts = PAPI_state(EventSet, &state);
	    if (sts != PAPI_OK)
		return PM_ERR_VALUE;
	    strcpy(status_string, "Papi ");
	    if(state & PAPI_STOPPED)
		strcat(status_string, "is stopped, ");
	    if (state & PAPI_RUNNING)
		strcat(status_string, "is running, ");
	    if (state & PAPI_PAUSED)
		strcat(status_string,"is paused, ");
	    if (state & PAPI_NOT_INIT)
		strcat(status_string, "is defined but not initialized, ");
	    if (state & PAPI_OVERFLOWING)
		strcat(status_string, "has overflowing enabled, ");
	    if (state & PAPI_PROFILING)
		strcat(status_string, "eventset has profiling enabled, ");
	    if (state & PAPI_MULTIPLEXING)
		strcat(status_string,"has multiplexing enabled, ");
	    if (state & PAPI_ATTACHED)
		strcat(status_string, "is attached to another process/thread, ");
	    if (state & PAPI_CPU_ATTACHED)
		strcat(status_string, "is attached to a specific CPU, ");

	    first_metric = 1;
	    for(i = 0; i < number_of_events; i++){
		if(papi_info[i].position < 0)
		    continue;
		sprintf(local_string, "%s%s(%d): %lld",
			(first_metric ? "" : ", "),
			papi_info[i].papi_string_code,
			(papi_info[i].metric_enabled == METRIC_ENABLED_FOREVER ? -1 :
			 (int)(papi_info[i].metric_enabled - now)), // number of seconds left
			(papi_info[i].prev_value + values[papi_info[i].position]));
		first_metric = 0;
		if ((strlen(status_string) + strlen(local_string) + 1) < sizeof(status_string))
		    strcat(status_string, local_string);
	    }
	    atom->cp = status_string;
	    return PMDA_FETCH_STATIC;

	case CONTROL_AUTO_ENABLE:
	    atom->ul = auto_enable_time;
	    return PMDA_FETCH_STATIC;

	case CONTROL_MULTIPLEX:
	    atom->ul = enable_multiplexing;
	    return PMDA_FETCH_STATIC;

	default:
	    return PM_ERR_PMID;
	}
	break;

    case CLUSTER_AVAILABLE:
	if (idp->item == AVAILABLE_NUM_COUNTERS) {
	    atom->ul = number_of_counters;
	    return PMDA_FETCH_STATIC;
	}
	if (idp->item == AVAILABLE_VERSION) {
	    atom->cp = papi_version;
	    return PMDA_FETCH_STATIC;
	}
	return PM_ERR_PMID;

    default:
	return PM_ERR_PMID;
    }

    return PMDA_FETCH_NOVALUES;
}