projects
/
lttng-ust.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Prefix all field names with underscores
[lttng-ust.git]
/
libust
/
lttng-ust-abi.c
diff --git
a/libust/lttng-ust-abi.c
b/libust/lttng-ust-abi.c
index fee3d0750022becad801f34979a62e11224bcf0c..ccaa17fa9ba56bbf3a9cf8a81b0d134ca27fe1bb 100644
(file)
--- a/
libust/lttng-ust-abi.c
+++ b/
libust/lttng-ust-abi.c
@@
-37,13
+37,6
@@
* by the caller.
*/
* by the caller.
*/
-struct obj;
-
-struct objd_ops {
- long (*cmd)(int objd, unsigned int cmd, unsigned long arg);
- int (*release)(int objd);
-};
-
struct obj {
union {
struct {
struct obj {
union {
struct {
@@
-100,7
+93,8
@@
int objd_alloc(void *private_data, const struct objd_ops *ops)
end:
obj->u.s.private_data = private_data;
obj->u.s.ops = ops;
end:
obj->u.s.private_data = private_data;
obj->u.s.ops = ops;
- obj->u.s.f_count = 1;
+ obj->u.s.f_count = 2; /* count == 1 : object is allocated */
+ /* count == 2 : allocated + hold ref */
return obj - objd_table.array;
}
return obj - objd_table.array;
}
@@
-109,6
+103,8
@@
struct obj *_objd_get(int id)
{
if (id >= objd_table.len)
return NULL;
{
if (id >= objd_table.len)
return NULL;
+ if (!objd_table.array[id].u.s.f_count)
+ return NULL;
return &objd_table.array[id];
}
return &objd_table.array[id];
}
@@
-128,11
+124,12
@@
void objd_set_private(int id, void *private_data)
obj->u.s.private_data = private_data;
}
obj->u.s.private_data = private_data;
}
-static
const struct objd_ops *objd_ops(int id)
{
struct obj *obj = _objd_get(id);
const struct objd_ops *objd_ops(int id)
{
struct obj *obj = _objd_get(id);
- assert(obj);
+
+ if (!obj)
+ return NULL;
return obj->u.s.ops;
}
return obj->u.s.ops;
}
@@
-144,6
+141,8
@@
void objd_free(int id)
assert(obj);
obj->u.freelist_next = objd_table.freelist_head;
objd_table.freelist_head = obj - objd_table.array;
assert(obj);
obj->u.freelist_next = objd_table.freelist_head;
objd_table.freelist_head = obj - objd_table.array;
+ assert(obj->u.s.f_count == 1);
+ obj->u.s.f_count = 0; /* deallocated */
}
static
}
static
@@
-153,24
+152,46
@@
void objd_ref(int id)
obj->u.s.f_count++;
}
obj->u.s.f_count++;
}
-static
-void objd_unref(int id)
+int objd_unref(int id)
{
struct obj *obj = _objd_get(id);
{
struct obj *obj = _objd_get(id);
- if (!(--obj->u.s.f_count)) {
+ if (!obj)
+ return -EINVAL;
+ if (obj->u.s.f_count == 1) {
+ ERR("Reference counting error\n");
+ return -EINVAL;
+ }
+ if ((--obj->u.s.f_count) == 1) {
const struct objd_ops *ops = objd_ops(id);
const struct objd_ops *ops = objd_ops(id);
-
+
if (ops->release)
ops->release(id);
objd_free(id);
}
if (ops->release)
ops->release(id);
objd_free(id);
}
+ return 0;
}
static
void objd_table_destroy(void)
{
}
static
void objd_table_destroy(void)
{
+ int i;
+
+ for (i = 0; i < objd_table.allocated_len; i++) {
+ struct obj *obj = _objd_get(i);
+ const struct objd_ops *ops;
+
+ if (!obj)
+ continue;
+ ops = obj->u.s.ops;
+ if (ops->release)
+ ops->release(i);
+ }
free(objd_table.array);
free(objd_table.array);
+ objd_table.array = NULL;
+ objd_table.len = 0;
+ objd_table.allocated_len = 0;
+ objd_table.freelist_head = -1;
}
/*
}
/*
@@
-189,6
+210,15
@@
enum channel_type {
METADATA_CHANNEL,
};
METADATA_CHANNEL,
};
+int lttng_abi_create_root_handle(void)
+{
+ int root_handle;
+
+ root_handle = objd_alloc(NULL, <tng_ops);
+ assert(root_handle == 0);
+ return root_handle;
+}
+
static
int lttng_abi_create_session(void)
{
static
int lttng_abi_create_session(void)
{
@@
-332,7
+362,6
@@
create_error:
return; /* not allowed to return error */
}
return; /* not allowed to return error */
}
-static
int lttng_abi_create_channel(int session_objd,
struct lttng_ust_channel *chan_param,
enum channel_type channel_type)
int lttng_abi_create_channel(int session_objd,
struct lttng_ust_channel *chan_param,
enum channel_type channel_type)
@@
-396,7
+425,12
@@
int lttng_abi_create_channel(int session_objd,
return chan_objd;
chan_error:
return chan_objd;
chan_error:
- objd_unref(chan_objd);
+ {
+ int err;
+
+ err = objd_unref(chan_objd);
+ assert(!err);
+ }
objd_error:
return ret;
}
objd_error:
return ret;
}
@@
-454,17
+488,20
@@
long lttng_session_cmd(int objd, unsigned int cmd, unsigned long arg)
* individual file is released).
*/
static
* individual file is released).
*/
static
-int lttng_
session_release
(int objd)
+int lttng_
release_session
(int objd)
{
struct ltt_session *session = objd_private(objd);
{
struct ltt_session *session = objd_private(objd);
- if (session)
+ if (session)
{
ltt_session_destroy(session);
ltt_session_destroy(session);
- return 0;
+ return 0;
+ } else {
+ return -EINVAL;
+ }
}
static const struct objd_ops lttng_session_ops = {
}
static const struct objd_ops lttng_session_ops = {
- .release = lttng_
session_release
,
+ .release = lttng_
release_session
,
.cmd = lttng_session_cmd,
};
.cmd = lttng_session_cmd,
};
@@
-527,7
+564,12
@@
int lttng_abi_create_event(int channel_objd,
return event_objd;
event_error:
return event_objd;
event_error:
- objd_unref(event_objd);
+ {
+ int err;
+
+ err = objd_unref(event_objd);
+ assert(!err);
+ }
objd_error:
return ret;
}
objd_error:
return ret;
}
@@
-639,7
+681,7
@@
int lttng_channel_release(int objd)
struct ltt_channel *channel = objd_private(objd);
if (channel)
struct ltt_channel *channel = objd_private(objd);
if (channel)
- objd_unref(channel->session->objd);
+
return
objd_unref(channel->session->objd);
return 0;
}
return 0;
}
@@
-694,7
+736,7
@@
int lttng_event_release(int objd)
struct ltt_event *event = objd_private(objd);
if (event)
struct ltt_event *event = objd_private(objd);
if (event)
- objd_unref(event->chan->objd);
+
return
objd_unref(event->chan->objd);
return 0;
}
return 0;
}
@@
-706,6
+748,5
@@
static const struct objd_ops lttng_event_ops = {
void lttng_ust_abi_exit(void)
{
void lttng_ust_abi_exit(void)
{
- /* TODO: teardown socket */
objd_table_destroy();
}
objd_table_destroy();
}
This page took
0.032108 seconds
and
4
git commands to generate.