+#include <lttng/event-internal.h>
+#include <lttng/event.h>
+#include <lttng/lttng-error.h>
+#include <lttng/userspace-probe-internal.h>
+
+struct lttng_event *lttng_event_create(void)
+{
+ struct lttng_event *event;
+ struct lttng_event_extended *event_extended;
+
+ event = zmalloc(sizeof(*event));
+ if (!event) {
+ PERROR("Error allocating event structure");
+ goto end;
+ }
+
+ event_extended = zmalloc(sizeof(*event_extended));
+ if (!event_extended) {
+ PERROR("Error allocating event extended structure");
+ goto error;
+ }
+ event->extended.ptr = event_extended;
+end:
+ return event;
+error:
+ free(event);
+ goto end;
+}
+
+struct lttng_event *lttng_event_copy(const struct lttng_event *event)
+{
+ struct lttng_event *new_event;
+ struct lttng_event_extended *new_event_extended;
+
+ new_event = zmalloc(sizeof(*event));
+ if (!event) {
+ PERROR("Error allocating event structure");
+ goto end;
+ }
+
+ /* Copy the content of the old event. */
+ memcpy(new_event, event, sizeof(*event));
+
+ /*
+ * We need to create a new extended since the previous pointer is now
+ * invalid.
+ */
+ new_event_extended = zmalloc(sizeof(*new_event_extended));
+ if (!new_event_extended) {
+ PERROR("Error allocating event extended structure");
+ goto error;
+ }
+
+ new_event->extended.ptr = new_event_extended;
+end:
+ return new_event;
+error:
+ free(event);
+ goto end;
+}
+
+void lttng_event_destroy(struct lttng_event *event)
+{
+ struct lttng_event_extended *event_extended;
+
+ if (!event) {
+ return;
+ }
+
+ event_extended = (struct lttng_event_extended *) event->extended.ptr;
+
+ if (event_extended) {
+ if (event_extended->probe_location) {
+ lttng_userspace_probe_location_destroy(
+ event_extended->probe_location);
+ }
+ free(event_extended);
+ }
+ free(event);
+}