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;
}
{
if (id >= objd_table.len)
return NULL;
+ if (!objd_table.array[id].u.s.f_count)
+ return NULL;
return &objd_table.array[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;
}
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
if (!obj)
return -EINVAL;
- if (!(--obj->u.s.f_count)) {
+ 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);
-
+
if (ops->release)
ops->release(id);
objd_free(id);
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);
}
{
ssize_t len;
- len = lttcomm_send_unix_sock(sock, &lur, sizeof(lur));
+ len = lttcomm_send_unix_sock(sock, lur, sizeof(*lur));
switch (len) {
- case sizeof(lur):
+ case sizeof(*lur):
DBG("message successfully sent");
return 0;
case -1: