ORBit memory leak fix



Hi Elliot,

this patch fixes a serious memory leaks. The problem was that the TypeCode for CORBA_any
is always initialized with -1, sot that it never get released.
I have also implemented NameValuePair sequences, which are needed by the DynAny interface for structures (the new dynany code is not included in this patch).

May I commit?

Index: src/orb/corba_any.c
===================================================================
RCS file: /cvs/gnome/ORBit/src/orb/corba_any.c,v
retrieving revision 1.32.4.2
diff -u -r1.32.4.2 corba_any.c
--- src/orb/corba_any.c 2001/01/08 21:50:41     1.32.4.2
+++ src/orb/corba_any.c 2001/02/28 07:59:34
@@ -353,7 +353,6 @@
 ORBit_marshal_any(GIOPSendBuffer *buf, const CORBA_any *val)
 {
     ORBit_marshal_value_info mi;
-
     gpointer mval = val->_value;
 
     ORBit_encode_CORBA_TypeCode(val->_type, buf);
@@ -458,7 +457,7 @@
 /* to allocate a block, we need to know of any important data
    contained in it.
 */
-static gpointer
+gpointer
 ORBit_demarshal_allocate_mem(CORBA_TypeCode tc, gint nelements)
 {
     size_t block_size;
@@ -474,7 +473,11 @@
                               GINT_TO_POINTER(nelements),
                               sizeof(CORBA_TypeCode));
 
-       *(CORBA_TypeCode *)((char *)retval-sizeof(ORBit_mem_info)-sizeof(CORBA_TypeCode)) = (CORBA_TypeCode)CORBA_Object_duplicate((CORBA_Object)tc, NULL);
+       if (ORBIT_ROOT_OBJECT(tc)->refs >= 0) 
+           ORBIT_ROOT_OBJECT(tc)->refs += nelements;
+       
+       *(CORBA_TypeCode *)((char *)retval-sizeof(ORBit_mem_info)-sizeof(CORBA_TypeCode)) = tc;
+       
     }
 
     return retval;
@@ -700,7 +703,6 @@
     CORBA_any_set_release(retval, CORBA_TRUE);
 
     ORBit_decode_CORBA_TypeCode(&retval->_type, buf);
-    CORBA_Object_duplicate((CORBA_Object)retval->_type, NULL);
 
     val = retval->_value = ORBit_demarshal_allocate_mem(retval->_type, 1);
     ORBit_demarshal_value(buf, &val, retval->_type, dup_strings, orb);
Index: src/orb/corba_any.h
===================================================================
RCS file: /cvs/gnome/ORBit/src/orb/corba_any.h,v
retrieving revision 1.11
diff -u -r1.11 corba_any.h
--- src/orb/corba_any.h 1999/11/07 01:12:30     1.11
+++ src/orb/corba_any.h 2001/02/28 07:59:34
@@ -42,4 +42,6 @@
 
 void CORBA_any__copy(CORBA_any *out, CORBA_any *in);
 
+gpointer ORBit_demarshal_allocate_mem(CORBA_TypeCode tc, gint nelements);
+
 #endif /* !_ORBIT_CORBA_ANY_H_ */
Index: src/orb/corba_sequences.h
===================================================================
RCS file: /cvs/gnome/ORBit/src/orb/corba_sequences.h,v
retrieving revision 1.10
diff -u -r1.10 corba_sequences.h
--- src/orb/corba_sequences.h   1999/09/20 15:42:27     1.10
+++ src/orb/corba_sequences.h   2001/02/28 07:59:34
@@ -42,7 +42,7 @@
 typedef struct CORBA_sequence_ORB_ObjectId CORBA_ORB_ObjectIdList;
 
 #define _CORBA_sequence_NameValuePair_defined
-typedef struct CORBA_sequence_NameValuePair CORBA_NameValuePairSeq;
+typedef struct CORBA_sequence_NameValuePair CORBA_sequence_NameValuePair;
 
 #define _CORBA_sequence_CORBA_any_defined
 typedef struct CORBA_sequence_CORBA_any_struct CORBA_AnySeq;
Index: src/orb/corba_typecode.h
===================================================================
RCS file: /cvs/gnome/ORBit/src/orb/corba_typecode.h,v
retrieving revision 1.10
diff -u -r1.10 corba_typecode.h
--- src/orb/corba_typecode.h    1999/10/12 02:31:53     1.10
+++ src/orb/corba_typecode.h    2001/02/28 07:59:34
@@ -110,6 +110,7 @@
 #define TC_string ((CORBA_TypeCode)&TC_string_struct)
 #define TC_wstring ((CORBA_TypeCode)&TC_wstring_struct)
 #define TC_CORBA_NamedValue ((CORBA_TypeCode)&TC_CORBA_NamedValue_struct)
+#define TC_CORBA_NameValuePair ((CORBA_TypeCode)&TC_CORBA_NameValuePair_struct)
 
 #define TC_CORBA_short_struct TC_short_struct
 #define TC_CORBA_long_struct TC_long_struct
@@ -158,6 +159,7 @@
 extern const struct CORBA_TypeCode_struct TC_string_struct;
 extern const struct CORBA_TypeCode_struct TC_wstring_struct;
 extern const struct CORBA_TypeCode_struct TC_CORBA_NamedValue_struct;
+extern const struct CORBA_TypeCode_struct TC_CORBA_NameValuePair_struct;
 
 
 #endif /* !_ORBIT_CORBA_TYPECODE_H_ */
Index: src/orb/orb.c
===================================================================
RCS file: /cvs/gnome/ORBit/src/orb/orb.c,v
retrieving revision 1.98.4.6
diff -u -r1.98.4.6 orb.c
--- src/orb/orb.c       2001/01/20 22:02:23     1.98.4.6
+++ src/orb/orb.c       2001/02/28 07:59:35
@@ -1054,7 +1054,7 @@
                                              &policies,
                                              ev);
                        CORBA_Object_duplicate(orb->root_poa, ev);
-                       CORBA_Object_release(policies._buffer[0],ev);
+                       CORBA_Object_release((CORBA_Object)policies._buffer[0],ev);
                }
 
                return CORBA_Object_duplicate(orb->root_poa, ev);
Index: src/orb/orbit_typecode.c
===================================================================
RCS file: /cvs/gnome/ORBit/src/orb/orbit_typecode.c,v
retrieving revision 1.24.4.2
diff -u -r1.24.4.2 orbit_typecode.c
--- src/orb/orbit_typecode.c    2001/01/28 22:17:50     1.24.4.2
+++ src/orb/orbit_typecode.c    2001/02/28 07:59:35
@@ -160,7 +160,7 @@
        ctx.prior_tcs=NULL;
        tc_dec(t, codec, &ctx);
        for(l=ctx.prior_tcs;l;l=l->next)
-               g_free(l->data);
+         g_free(l->data);
        g_slist_free(ctx.prior_tcs);
        buf->cur = ((guchar *)buf->cur) + codec->rptr;
 }
@@ -292,7 +292,7 @@
                        node=l->data;
                        /* NOTE: below, -4 is b/c we already read offset */
                        if(node->index==ctx->current_idx+c->rptr+offset-4){
-                               *t=node->tc;
+                               *t=CORBA_Object_duplicate ((CORBA_Object)node->tc, NULL);
                                return;
                        }
                }
@@ -311,7 +311,6 @@
        info=&tk_info[kind];
        
        tc=g_new0(struct CORBA_TypeCode_struct, 1);
-
        /* Passing in NULL for CORBA_Environment is patently dangerous. */
        ORBit_pseudo_object_init((ORBit_PseudoObject)tc,
                                 ORBIT_PSEUDO_TYPECODE, NULL);
@@ -320,7 +319,8 @@
                                       NULL);
 
        tc->kind=kind;
-       ((ORBit_RootObject)tc)->refs=-1;   /* negative so that it doesn't get freed by CORBA_Object_release() */
+       ((ORBit_RootObject)tc)->refs= 1; 
+
        switch(info->type){
                guint tmp_index;
                CORBA_octet o;
@@ -375,7 +375,6 @@
        t->subtypes=g_new(CORBA_TypeCode, 1);
        tc_dec(&t->subtypes[0], c, ctx);
        t->sub_parts=1;
-       CORBA_Object_duplicate((CORBA_Object)t->subtypes[0], NULL);
        CDR_get_ulong(c, &t->length);
 }
 
@@ -412,7 +411,6 @@
        for(i=0;i<t->sub_parts;i++){
                CDR_get_string(c, (char **)&t->subnames[i]);
                tc_dec(&t->subtypes[i], c, ctx);
-               CORBA_Object_duplicate((CORBA_Object)t->subtypes[i], NULL);
        }
 }      
 
@@ -465,7 +463,6 @@
        CDR_get_string(c, (char **)&t->repo_id);
        CDR_get_string(c, (char **)&t->name);
        tc_dec(&t->discriminator, c, ctx);
-       CORBA_Object_duplicate((CORBA_Object)t->discriminator, NULL);
        CDR_get_ulong(c, &t->default_index);
        CDR_get_ulong(c, &t->sub_parts);
 
@@ -483,7 +480,6 @@
            CDR_get_##getname(c, t->sublabels[i]._value); \
            CDR_get_string(c, (char **)&t->subnames[i]); \
            tc_dec(&t->subtypes[i], c, ctx); \
-           CORBA_Object_duplicate((CORBA_Object)t->subtypes[i], NULL); \
        } \
        break
 
@@ -530,7 +526,6 @@
        t->subtypes=g_new(CORBA_TypeCode, 1);
        t->sub_parts=1;
        tc_dec(t->subtypes, c, ctx);
-       CORBA_Object_duplicate((CORBA_Object)t->subtypes[0], NULL);
 }
 
 
@@ -557,7 +552,6 @@
        for(i=0;i<t->sub_parts;i++){
                CDR_get_string(c, (char **)&t->subnames[i]);
                tc_dec(&t->subtypes[i], c, ctx);
-               CORBA_Object_duplicate((CORBA_Object)t->subtypes[i], NULL);
        }
 }
 
@@ -571,7 +565,6 @@
 {
        t->subtypes=g_new(CORBA_TypeCode, 1);
        tc_dec(t->subtypes, c, ctx);
-       CORBA_Object_duplicate((CORBA_Object)t->subtypes[0], NULL);
        CDR_get_ulong(c, &t->length);
        t->sub_parts=1;
 }
Index: src/orb/sequences.c
===================================================================
RCS file: /cvs/gnome/ORBit/src/orb/sequences.c,v
retrieving revision 1.8
diff -u -r1.8 sequences.c
--- src/orb/sequences.c 1999/07/06 20:00:30     1.8
+++ src/orb/sequences.c 2001/02/28 07:59:35
@@ -1,5 +1,52 @@
 #include "orbit.h"
 #include "sequences.h"
+#include "corba_typecode.h"
+
+static const CORBA_TypeCode
+CORBA_sequence_NameValuePair_subtypes_array [] = {
+       TC_CORBA_NameValuePair
+};
+
+static struct CORBA_TypeCode_struct
+TC_CORBA_sequence_NameValuePair_struct = {
+       {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
+        ORBIT_PSEUDO_TYPECODE},
+
+       CORBA_tk_sequence, NULL, NULL,
+       0, 1,
+       NULL,
+       (CORBA_TypeCode *) CORBA_sequence_NameValuePair_subtypes_array,
+       NULL,
+       CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+
+CORBA_sequence_NameValuePair *
+CORBA_sequence_NameValuePair__alloc (void)
+{
+       CORBA_sequence_NameValuePair *retval;
+
+       retval = ORBit_demarshal_allocate_mem (
+               &TC_CORBA_sequence_NameValuePair_struct, 1);
+       
+       retval->_maximum = 0;
+       retval->_length = 0;
+       retval->_buffer = NULL;
+       retval->_release = CORBA_FALSE;
+
+       return retval;
+}
+
+CORBA_NameValuePair *
+CORBA_sequence_NameValuePair_allocbuf (CORBA_unsigned_long len)
+{
+       CORBA_NameValuePair *retval;
+
+       retval = ORBit_demarshal_allocate_mem (TC_CORBA_NameValuePair, len);
+
+       memset (retval, '\0', sizeof (CORBA_NameValuePair) * len);
+
+       return retval;
+}
 
 gpointer CORBA_sequence_octet_free(gpointer mem,
                                   gpointer func_data)
Index: src/orb/sequences.h
===================================================================
RCS file: /cvs/gnome/ORBit/src/orb/sequences.h,v
retrieving revision 1.6
diff -u -r1.6 sequences.h
--- src/orb/sequences.h 1998/07/29 22:11:54     1.6
+++ src/orb/sequences.h 2001/02/28 07:59:35
@@ -28,8 +28,11 @@
 
 /* #include "corba_sequences_type.h" */
 #include "orbit_types.h"
+#include "corba_sequences.h"
 
 CORBA_octet *CORBA_octet_allocbuf(CORBA_unsigned_long len);
 CORBA_sequence_octet *CORBA_sequence_octet__alloc(void);
+CORBA_NameValuePair *CORBA_sequence_NameValuePair_allocbuf(CORBA_unsigned_long len);
+CORBA_sequence_NameValuePair *CORBA_sequence_NameValuePair__alloc(void);
 
 #endif /* !_ORBIT_SEQUENCES_H_ */
Index: src/orb/typecode.c
===================================================================
RCS file: /cvs/gnome/ORBit/src/orb/typecode.c,v
retrieving revision 1.14
diff -u -r1.14 typecode.c
--- src/orb/typecode.c  1999/10/27 20:02:46     1.14
+++ src/orb/typecode.c  2001/02/28 07:59:35
@@ -72,6 +72,26 @@
 const struct CORBA_TypeCode_struct TC_CORBA_NamedValue_struct=
        {{{(ORBit_RootObject_Interface *)&ORBit_TypeCode_epv, CORBA_FALSE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_struct, "CORBA NamedValue", "", 0, 0, NULL, NULL, NULL, NULL, -1, 0, 0, 0};
 
+static const char *anon_subnames_array8[] = { "id", "value" };
+
+static const CORBA_TypeCode anon_subtypes_array8[] =
+{(CORBA_TypeCode) & TC_CORBA_string_struct,
+(CORBA_TypeCode) & TC_CORBA_any_struct};
+
+const struct CORBA_TypeCode_struct
+TC_CORBA_NameValuePair_struct = {
+       {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1},
+        ORBIT_PSEUDO_TYPECODE},
+
+       CORBA_tk_struct, "NameValuePair", 
+       "IDL:omg.org/CORBA/NameValuePair:1.0",
+       0, 2,
+       (const char **) anon_subnames_array8,
+       (CORBA_TypeCode *) anon_subtypes_array8,
+       NULL,
+       CORBA_OBJECT_NIL, 0, -1, 0, 0
+};
+
 static const CORBA_TypeCode anon_subtypes_array7[] =
 {(CORBA_TypeCode) & TC_CORBA_string_struct};
 
Index: src/orbit-idl-compiler/backends/c/orbit-idl-c-skels.c
===================================================================
RCS file: /cvs/gnome/ORBit/src/orbit-idl-compiler/backends/c/orbit-idl-c-skels.c,v
retrieving revision 1.9.4.3
diff -u -r1.9.4.3 orbit-idl-c-skels.c
--- src/orbit-idl-compiler/backends/c/orbit-idl-c-skels.c       2001/01/28 22:17:50     1.9.4.3
+++ src/orbit-idl-compiler/backends/c/orbit-idl-c-skels.c       2001/02/28 07:59:35
@@ -350,6 +350,9 @@
   case IDLN_INTERFACE:
   case IDLN_FORWARD_DCL:
     fprintf(ci->fh, "if(ev->_major == CORBA_NO_EXCEPTION) CORBA_Object_release(_ORBIT_retval, ev);\n");
+    return;
+  case IDLN_TYPE_TYPECODE:
+         fprintf(ci->fh, "if(ev->_major == CORBA_NO_EXCEPTION) CORBA_Object_release((CORBA_Object)_ORBIT_retval, ev);\n");
   default:
     return;
   }
@@ -411,7 +414,7 @@
     case IDLN_TYPE_STRUCT:
     case IDLN_TYPE_ARRAY:
     case IDLN_TYPE_ANY:
-      cbe_skel_param_subfree(tree, ci, FALSE);
+      cbe_skel_param_subfree(tree, ci, TRUE);
       break;
     case IDLN_TYPE_OBJECT:
     case IDLN_INTERFACE:
@@ -430,9 +433,9 @@
     fprintf(ci->fh, "if(ev->_major == CORBA_NO_EXCEPTION)");
     switch(IDL_NODE_TYPE(ts)) {
     case IDLN_TYPE_OBJECT:
-       case IDLN_FORWARD_DCL:
+    case IDLN_FORWARD_DCL:
     case IDLN_INTERFACE:
-       case IDLN_TYPE_TYPECODE:
+    case IDLN_TYPE_TYPECODE:
       fprintf(ci->fh, "CORBA_Object_release((CORBA_Object)%s, ev);\n",
              IDL_IDENT(IDL_PARAM_DCL(tree).simple_declarator).str);
       break;
@@ -447,7 +450,7 @@
     switch(IDL_NODE_TYPE(ts)) {
     case IDLN_TYPE_OBJECT:
     case IDLN_INTERFACE:
-       case IDLN_TYPE_TYPECODE:
+    case IDLN_TYPE_TYPECODE:
       fprintf(ci->fh, "CORBA_Object_release((CORBA_Object)%s, ev);\n",
              IDL_IDENT(IDL_PARAM_DCL(tree).simple_declarator).str);
       break;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]