int mono_counters_sample (MonoCounter *counter, void *buffer, int buffer_size) { int cb = counter->type & MONO_COUNTER_CALLBACK; int size = -1; switch (mono_counter_get_type (counter)) { case MONO_COUNTER_INT: COPY_COUNTER (int, IntFunc); break; case MONO_COUNTER_UINT: COPY_COUNTER (guint, UIntFunc); break; case MONO_COUNTER_LONG: case MONO_COUNTER_TIME_INTERVAL: COPY_COUNTER (gint64, LongFunc); break; case MONO_COUNTER_ULONG: COPY_COUNTER (guint64, ULongFunc); break; case MONO_COUNTER_WORD: COPY_COUNTER (gssize, PtrFunc); break; case MONO_COUNTER_DOUBLE: COPY_COUNTER (double, DoubleFunc); break; case MONO_COUNTER_STRING: // FIXME : add support for string sampling break; } return size; }
/* lockless */ static int sample_internal (MonoCounter *counter, void *buffer, int buffer_size) { int cb = counter->type & MONO_COUNTER_CALLBACK; int size = -1; char *strval; switch (mono_counter_get_type (counter)) { case MONO_COUNTER_INT: COPY_COUNTER (int, IntFunc); break; case MONO_COUNTER_UINT: COPY_COUNTER (guint, UIntFunc); break; case MONO_COUNTER_LONG: case MONO_COUNTER_TIME_INTERVAL: COPY_COUNTER (gint64, LongFunc); break; case MONO_COUNTER_ULONG: COPY_COUNTER (guint64, ULongFunc); break; case MONO_COUNTER_WORD: COPY_COUNTER (gssize, PtrFunc); break; case MONO_COUNTER_DOUBLE: COPY_COUNTER (double, DoubleFunc); break; case MONO_COUNTER_STRING: if (buffer_size < counter->size) { size = -1; } else if (counter->size == 0) { size = 0; } else { strval = cb ? ((StrFunc)counter->addr) () : (char*)counter->addr; if (!strval) { size = 0; } else { size = counter->size; strncpy ((char *) buffer, strval, size - 1); ((char*)buffer)[size - 1] = '\0'; } } } return size; }
size_t mono_counter_get_size (MonoCounter *counter) { switch (mono_counter_get_type (counter)) { case MONO_COUNTER_INT: return sizeof (int); case MONO_COUNTER_UINT: return sizeof (guint); case MONO_COUNTER_LONG: case MONO_COUNTER_TIME_INTERVAL: return sizeof (gint64); case MONO_COUNTER_ULONG: return sizeof (guint64); case MONO_COUNTER_WORD: return sizeof (gssize); case MONO_COUNTER_DOUBLE: return sizeof (double); case MONO_COUNTER_STRING: return -1; // FIXME default: g_assert_not_reached (); } }