]> rtime.felk.cvut.cz Git - frescor/frsh.git/commitdiff
Memory leak in shared objects removed.
authorDario Faggioli <faggioli@gandalf.sssup.it>
Thu, 26 Feb 2009 17:39:26 +0000 (18:39 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Sun, 1 Mar 2009 19:07:39 +0000 (20:07 +0100)
The memory leak in write operation for protected critical sections has
been solved. Now the backup storage is an automatic variable for the
critical section invocation, and all the memory is allocated and freed
therein.

It is true that this cause much more overhead at each invocation, but
this is still better than undefinitely leaking memory, also because it
can be accounted for (if calculated) in blocking time (not implemented
yet).

fres/contract/fres_container.c
frsh_api/frsh_opaque_types.h
frsh_api/frsh_sharedobj.c

index 099b556567b13e3d21f319e44fbc133cf4792b58..66100285ecbc25bd160b08a0f3360a7dffe31065 100644 (file)
@@ -122,8 +122,6 @@ int fres_block_timing_reqs_to_string(char *dest, size_t size, enum fres_block_ty
 int fres_block_csects_to_string(char *dest, size_t size, enum fres_block_type type,
                                const void *block_data)
 {
-       const fres_block_csects *c = block_data;
-
        return snprintf(dest, size, "Coming Soon...\n");
 }
 
index 5c3ee8940b56d434169eae90e7e129667efbcfa0..e778e5ca2ada6aec98e10dc4934e54c6e3a62ec7 100644 (file)
@@ -127,12 +127,11 @@ typedef unsigned int FRSH_GROUP_ID_T_OPAQUE;
  **/
 #define FRSH_CSECT_T_OPAQUE struct {   \
   frsh_csect_op_kind_t op_kind;                \
-  frsh_sharedobj_handle_t obj_handle;  \
+  frsh_sharedobj_label_t obj_label;    \
   frsh_rel_time_t wcet;                        \
   frsh_rel_time_t blocking;            \
   frsh_csect_op_t op;                  \
   frsh_memory_areas_t areas;           \
-  frsh_memory_areas_t storage;         \
 }
 
 struct fna_endpoint_data;
index f000560e959f17bf64fcc6b9837a36fd65baeaa3..c3a4a4046070cd2071a156dc6ff53655daf47c06 100644 (file)
@@ -93,12 +93,13 @@ int frsh_csect_init
                return FRSH_ERR_BAD_ARGUMENT;
 
        csect->op_kind = FRSH_CSOK_UNCHECKED;
-       csect->obj_handle = obj_handle;
+       strncpy(csect->obj_label,
+               obj_handle->label,
+               sizeof(obj_handle->label));
        csect->wcet = wcet;
        csect->blocking = wcet;
        csect->op = NULL;
        csect->areas.size = 0;
-       csect->storage.size = 0;
 
        return 0;
 }
@@ -110,7 +111,7 @@ int frsh_csect_get_sharedobj_handle
        if (!obj_handle || !csect)
                return FRSH_ERR_BAD_ARGUMENT;
 
-       *obj_handle = csect->obj_handle;
+       *obj_handle = fres_sharedobj_get_label(csect->obj_label);
 
        return 0;
 }
@@ -209,7 +210,7 @@ int frsh_csect_register_write_op
    frsh_csect_op_t op,
    const frsh_memory_areas_t *areas)
 {
-       int i, j;
+       int i;
 
        if (!csect || !op)
                return FRSH_ERR_BAD_ARGUMENT;
@@ -222,39 +223,18 @@ int frsh_csect_register_write_op
         *  critical section not to be UNPROTECTED;
         */
 
-       csect->storage.size = areas->size;
        csect->areas.size = areas->size;
        csect->op_kind = FRSH_CSOK_WRITE;
        csect->op = op;
 
-       for (i = 0; i< areas->size; i++) {
-               csect->areas.memory_areas[i] =
-                       areas->memory_areas[i];
-
-               csect->storage.memory_areas[i].size =
-                       areas->memory_areas[i].size;
-
-               /*
-                * TODO:
-                *  Who is going to free() these mallocs? Maybe something
-                *  like frsh_csect_destroy is needed and missing?
-                */
-               csect->storage.memory_areas[i].area =
-                       malloc(areas->memory_areas[i].size);
-               if (!csect->storage.memory_areas[i].area)
-                       goto free_err;
-       }
+       for (i = 0; i< areas->size; i++)
+               csect->areas.memory_areas[i] = areas->memory_areas[i];
 
        /* Account for protection and rollback overheads: NOT IMPLEMENTED! */
        /* csect->blocking = fosa_rel_time_add(csect->wcet, ); */
        csect->blocking = csect->wcet;
 
        return 0;
-free_err:
-       for (j = i; j >= 0; j--)
-               free(csect->storage.memory_areas[j].area);
-
-       return FOSA_ENOMEM;
 }
 
 int frsh_csect_invoke
@@ -263,19 +243,23 @@ int frsh_csect_invoke
    void *output_arg)
 {
        int i, jumped, ret = 0;
-       fosa_signal_t signal;
-       fosa_signal_info_t siginfo;
-       fosa_clock_id_t clockid;
+       frsh_memory_areas_t storage = { .size = 0 };
        frsh_sharedobj_handle_t obj_handle;
        fosa_mutex_t *obj_mutex;
+       fosa_clock_id_t clockid;
+       fosa_signal_t signal;
+       fosa_signal_info_t siginfo;
 
        if (!csect) {
                ret = FRSH_ERR_BAD_ARGUMENT;
                goto out;
        }
 
-       obj_handle = csect->obj_handle;
-
+       obj_handle = fres_sharedobj_get_label(csect->obj_label);
+       if (!obj_handle) {
+               ret = errno;
+               goto out;
+       }
        ret = frsh_sharedobj_get_mutex(obj_handle, &obj_mutex);
        if (ret) goto out;
        ret = fosa_mutex_lock(obj_mutex);
@@ -299,13 +283,23 @@ int frsh_csect_invoke
 
        /* Backup memory areas. */
        if (csect->op_kind == FRSH_CSOK_WRITE) {
-               for (i = 0; i < csect->areas.size; i++)
-                       if (!memcpy(csect->storage.memory_areas[i].area,
+               for (i = 0; i < csect->areas.size; i++) {
+                       storage.memory_areas[i].size =
+                               csect->areas.memory_areas[i].size;
+                       storage.memory_areas[i].area =
+                               malloc(csect->areas.memory_areas[i].size);
+                       if (!storage.memory_areas[i].area) {
+                               ret = errno;
+                               goto out_disarm;
+                       }
+                       if (!memcpy(storage.memory_areas[i].area,
                                    csect->areas.memory_areas[i].area,
                                    csect->areas.memory_areas[i].size)) {
                                ret = errno;
                                goto out_disarm;
                        }
+                       storage.size++;
+               }
        }
 
        ret = fosa_long_jump_save_context(&obj_handle->context);
@@ -327,7 +321,7 @@ int frsh_csect_invoke
        if (csect->op_kind == FRSH_CSOK_WRITE) {
                for (i = 0; i < csect->areas.size; i++)
                        if (!memcpy(csect->areas.memory_areas[i].area,
-                                   csect->storage.memory_areas[i].area,
+                                   storage.memory_areas[i].area,
                                    csect->areas.memory_areas[i].size)) {
                                ret = errno;
                                goto out_unlock;
@@ -337,6 +331,11 @@ int frsh_csect_invoke
 out_disarm:
        fosa_timer_disarm(obj_handle->wcet_timer, NULL);
        fosa_timer_delete(obj_handle->wcet_timer);
+
+       for (i = 0; i < storage.size; i++)
+               if (storage.memory_areas[i].area)       /* Uneeded ? */
+                       free(storage.memory_areas[i].area);
+
 out_unlock:
        fosa_mutex_unlock(obj_mutex);
 out: