Changeset 47


Ignore:
Timestamp:
Aug 22, 2005 9:07:04 AM (16 years ago)
Author:
dkearney
Message:

fixed python interface memory problem with py_decref() where i was decreffing a python object before i was finished using it.
this is a fix for shaikh's dgfet code not printing large amounts of data to the run.xml file.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/cee/rappture_interface.h

    r21 r47  
    2626
    2727PyObject*   rpRemove    (PyObject* lib, const char* path);
    28 const char* rpXml       (PyObject* lib);
     28char* rpXml       (PyObject* lib);
    2929
    3030/*
  • trunk/src/cee/rappture_interface.c

    r28 r47  
    722722 *          NULL will be returned.
    723723 *
    724  * Returns pointer (const char*) to the c style string representing the
     724 * Returns pointer (char*) to the c style string representing the
    725725 *          xml text of the Rappture object if successful, or
    726726 *          NULL if something goes wrong.
    727727 *
    728  *          The return value's contents should not be changed because
    729  *          it is a pointer being borrowed from python's buffer space
    730  *          (hence the _const_)
    731  */
    732 
    733 
    734 const char* rpXml(PyObject* lib)
     728 *          return value no longer needs to be const because i copy it
     729 *          to tmp space but it will need to be free'd now
     730 */
     731
     732
     733char* rpXml(PyObject* lib)
    735734{
    736735    PyObject* mbr_fxn   = NULL;      /* pointer to fxn of class lib */
    737736    PyObject* rslt      = NULL;      /* results from fxn call */
     737    char* tmpretVal     = NULL;      /* return value */
    738738    char* retVal        = NULL;      /* return value */
    739739
     
    750750                if (rslt) {
    751751                    // convert the result to c style strings
    752                     retVal = PyString_AsString(rslt);
     752                    tmpretVal = PyString_AsString(rslt);
     753                    retVal = (char*) calloc(strlen(tmpretVal),sizeof(char));
     754                    strcpy(retVal,tmpretVal);
    753755                    Py_DECREF(rslt);
    754756                }
     
    762764    }
    763765
    764     return (const char*) retVal;
     766    return retVal;
    765767   
    766768}
  • trunk/src/fortran/rappture_fortran.c

    r29 r47  
    11761176{
    11771177    int length = -1;
    1178     const char* xmlText = NULL;
     1178    char* xmlText = NULL;
    11791179
    11801180    PyObject* lib = NULL;
     
    11901190                if (xmlText) {
    11911191                    length = strlen(xmlText) + 1;
     1192                    free(xmlText);
    11921193                    // printf("len = :%d:\n",length);
    11931194                }
     
    12031204    int length_out = 0;
    12041205    int i = 0;
    1205     const char* xmlText = NULL;
     1206    char* xmlText = NULL;
    12061207
    12071208    PyObject* lib = NULL;
     
    12141215                xmlText = rpXml(lib);
    12151216               
    1216                 length_in = strlen(xmlText);
    1217                 length_out = retText_len;
    1218 
    1219                 strncpy(retText, xmlText, length_out);
    1220 
    1221                 // fortran-ify the string
    1222                 if (length_in < length_out) {
    1223                       for (i = length_in; i < length_out; i++) {
    1224                           retText[i] = ' ';
    1225                       }
     1217                if (xmlText) {
     1218                    length_in = strlen(xmlText);
     1219                    length_out = retText_len;
     1220
     1221                    strncpy(retText, xmlText, length_out);
     1222
     1223                    // fortran-ify the string
     1224                    if (length_in < length_out) {
     1225                          for (i = length_in; i < length_out; i++) {
     1226                              retText[i] = ' ';
     1227                          }
     1228                    }
     1229                    *(retText+length_out-1) = ' ';
     1230
     1231                    free(xmlText);
    12261232                }
    1227                 *(retText+length_out-1) = ' ';
     1233               
    12281234            }
    12291235        }
     
    12331239int rp_lib_write_xml(int* handle, char* outFile, int outFile_len)
    12341240{
    1235     int retVal = 0;
     1241    int retVal = -1;
    12361242    PyObject* lib = NULL;
    12371243    FILE* outFH = NULL;
    12381244    char* inOutFile = NULL;
    1239     const char* xmlText = NULL;
     1245    char* xmlText = NULL;
    12401246
    12411247    inOutFile = null_terminate(outFile, outFile_len);
     
    12511257            if (lib) {
    12521258                xmlText = rpXml(lib);
    1253                 retVal = fputs(xmlText,outFH);
     1259                if (xmlText) {
     1260                    retVal = fputs(xmlText,outFH);
     1261                    free(xmlText);
     1262                }
    12541263            }
    12551264        }
Note: See TracChangeset for help on using the changeset viewer.