Commit 1490a781 authored by David Hendriks's avatar David Hendriks
Browse files

fixed the functions for the persistent data memory adresss

parent f96c7d41
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
int run_system(char * argstring,
               long int custom_logging_func_memaddr,
               long int store_memaddr,
               long int persistent_data_memaddr,
               int write_logfile, 
               int population,
               char ** const buffer,
+87 −5
Original line number Diff line number Diff line
@@ -221,21 +221,25 @@ static PyObject* binary_c_function_prototype(PyObject *self, PyObject *args)
static PyObject* binary_c_run_system(PyObject *self, PyObject *args, PyObject *kwargs)
{

    static char* keywords[] = {"argstring", "custom_logging_func_memaddr", "store_memaddr", "write_logfile", "population", NULL};
    static char* keywords[] = {"argstring", "custom_logging_func_memaddr", "store_memaddr", "persistent_data_memaddr", "write_logfile", "population", NULL};

    /* set vars and default values for some*/
    char *argstring;
    long int custom_logging_func_memaddr = -1;
    long int store_memaddr = -1;
    long int persistent_data_memaddr = -1;
    int write_logfile = 0;
    int population = 0;

    // By using the keywords argument it scans over the given set of kwargs, but if they are not given then the default value is used
    /* Parse the input tuple */
    if(!PyArg_ParseTupleAndKeywords(args, kwargs, "s|llii", keywords, &argstring, &custom_logging_func_memaddr, &store_memaddr, &write_logfile, &population))
    if(!PyArg_ParseTupleAndKeywords(args, kwargs, "s|lllii", keywords, &argstring, &custom_logging_func_memaddr, &store_memaddr, &persistent_data_memaddr, &write_logfile, &population))
    {
        return NULL;
    }

    printf("Input persistent_Data_memaddr: %lu", persistent_data_memaddr);

    /* Call c-function */
    char * buffer;
    char * error_buffer;
@@ -243,6 +247,7 @@ static PyObject* binary_c_run_system(PyObject *self, PyObject *args, PyObject *k
    int out MAYBE_UNUSED = run_system(argstring,                    // the argstring
                                      custom_logging_func_memaddr,  // memory adress for the function for custom logging
                                      store_memaddr,                // memory adress for the store object
                                      persistent_data_memaddr,      // memory adress for the persistent data
                                      write_logfile,                // boolean for whether to write the logfile
                                      population,                   // boolean for whether this is part of a population.
                                      &buffer,
@@ -415,7 +420,7 @@ static PyObject* binary_c_return_store_memaddr(PyObject *self, PyObject *args)
    PyObject * return_error_string MAYBE_UNUSED = Py_BuildValue("s", error_buffer);

    PyObject * store_memaddr = Py_BuildValue("l", out);
    printf("store_memaddr: %ld\n", out);
    // printf("store_memaddr: %ld\n", out);

    if(error_buffer != NULL && strlen(error_buffer)>0)
    {
@@ -455,7 +460,7 @@ static PyObject* binary_c_return_persistent_data_memaddr(PyObject *self, PyObjec
    PyObject * return_error_string MAYBE_UNUSED = Py_BuildValue("s", error_buffer);

    PyObject * persistent_data_memaddr = Py_BuildValue("l", out);
    printf("persistent_data_memaddr: %ld\n", out);
    // printf("persistent_data_memaddr: %ld\n", out);

    if(error_buffer != NULL && strlen(error_buffer)>0)
    {
@@ -469,3 +474,80 @@ static PyObject* binary_c_return_persistent_data_memaddr(PyObject *self, PyObjec

    return persistent_data_memaddr;
}

/* Memory freeing functions */
// static PyObject* binary_c_free_store_memaddr(PyObject *self, PyObject *args)
// {
//     /* Python binding that calls the c function that free's the store memory */

//     /* Parse the input tuple */
//     char *store_memaddr;
    
//     if(!PyArg_ParseTuple(args, "l", &store_memaddr))
//     {
//         return NULL;
//     }

//     char * buffer;
//     char * error_buffer;
//     size_t nbytes;

//     long int out MAYBE_UNUSED = free_store_memaddr(store_memaddr,
//                                       &buffer,
//                                       &error_buffer,
//                                       &nbytes);

//     /* copy the buffer to a python string */
//     PyObject * return_string MAYBE_UNUSED = Py_BuildValue("s", buffer);
//     PyObject * return_error_string MAYBE_UNUSED = Py_BuildValue("s", error_buffer);

//     if(error_buffer != NULL && strlen(error_buffer)>0)
//     {
//         fprintf(stderr,
//                 "Error in binary_c run : %s\n",
//                 error_buffer);
//     }
    
//     Safe_free(buffer);
//     Safe_free(error_buffer);

//     return 0;
// }

// static PyObject* binary_c_free_persistent_data_memaddr(PyObject *self, PyObject *args)
// {
//     /* Python binding that calls the c function that free's the store memory */

//     /* Parse the input tuple */
//     char *persistent_data_memaddr;
    
//     if(!PyArg_ParseTuple(args, "l", &persistent_data_memaddr))
//     {
//         return NULL;
//     }

//     char * buffer;
//     char * error_buffer;
//     size_t nbytes;

//     long int out MAYBE_UNUSED = free_persistent_data_memaddr(persistent_data_memaddr,
//                                       &buffer,
//                                       &error_buffer,
//                                       &nbytes);

//     /* copy the buffer to a python string */
//     PyObject * return_string MAYBE_UNUSED = Py_BuildValue("s", buffer);
//     PyObject * return_error_string MAYBE_UNUSED = Py_BuildValue("s", error_buffer);

//     if(error_buffer != NULL && strlen(error_buffer)>0)
//     {
//         fprintf(stderr,
//                 "Error in binary_c run : %s\n",
//                 error_buffer);
//     }
    
//     Safe_free(buffer);
//     Safe_free(error_buffer);

//     return 0;
// }
+46 −12
Original line number Diff line number Diff line
@@ -41,12 +41,15 @@ int stdoutwas;
/* Functions to evolve systems                                         */
/* =================================================================== */

/* Function that runs a system. Has multiple input parameters:
/* 
Function that runs a system. Has multiple input parameters:
Big function. Takes several arguments. See binary_c_python.c docstring.
TODO: Describe each input
*/
int run_system(char * argstring,
               long int custom_logging_func_memaddr,
               long int store_memaddr,
               long int persistent_data_memaddr,
               int write_logfile,
               int population,
               char ** const buffer,
@@ -62,7 +65,6 @@ int run_system(char * argstring,
    if(store_memaddr != -1)
    {
        // load the store from the integer that has been passed
        // struct libbinary_c_store_t * store = (void*)store_memaddr;
        store = (void*)store_memaddr;
    }
    else
@@ -71,8 +73,17 @@ int run_system(char * argstring,
        store = NULL;
    }

    // persistent_data
    struct persistent_data_t * persistent_data = NULL;
    // persistent_data:
    struct libbinary_c_persistent_data_t *persistent_data;
    if(persistent_data_memaddr != -1)
    {
        // load the persistent data from the long int that has been passed
        persistent_data = (void*)persistent_data_memaddr;
    }
    else
    {
        persistent_data = NULL;
    }

    /* make new stardata */
    stardata = NULL;
@@ -80,7 +91,7 @@ int run_system(char * argstring,
                        NULL,               // previous_stardatas
                        NULL,               // preferences
                        &store,             // store
                        &persistent_data,               // persistent_data TODO: see if this use is correct
                        &persistent_data,   // persistent_data
                        &argstring,         // argv
                        -1                  // argc
    );
@@ -126,13 +137,20 @@ int run_system(char * argstring,
        Boolean free_store = TRUE;
    }

    /* Determine whether to free the persistent data memory adress*/
    Boolean free_persistent_data = FALSE;
    if (persistent_data_memaddr == -1)
    {
        Boolean free_persistent_data = TRUE;
    }

    /* free stardata (except the buffer) */
    binary_c_free_memory(&stardata, // Stardata
        TRUE,                       // free_preferences
        TRUE,                       // free_stardata
        free_store,                 // free_store
        FALSE,                      // free_raw_buffer
        TRUE                        // free_persistent TODO: check if this is correct here
        free_persistent_data        // free_persistent TODO: check if this is correct here
    );

    return 0;
@@ -382,8 +400,8 @@ long int return_store_memaddr(char * argstring,

    /* convert the pointer */ 
    uintptr_t store_memaddr_int = (uintptr_t)store; // C Version converting ptr to int
    printf("store is at address: %p\n", (void*)&store);
    printf("store_memaddr_int: %ld\n", store_memaddr_int);
    // printf("store is at address: %p\n", (void*)&store);
    // printf("store_memaddr_int: %ld\n", store_memaddr_int);

    /* Return the memaddr as an int */
    return store_memaddr_int;
@@ -420,9 +438,8 @@ long int return_persistent_data_memaddr(char * argstring,
        
    /* convert the pointer */
    uintptr_t persistent_data_memaddr_int = (uintptr_t)stardata->persistent_data; // C Version converting ptr to int
    printf("persistent_data is at address: %p\n", (void*)stardata->persistent_data);
    printf("persistent_data_memaddr_int: %lu\n", persistent_data_memaddr_int);

    // printf("persistent_data is at address: %p\n", (void*)stardata->persistent_data);
    // printf("persistent_data_memaddr_int: %lu\n", persistent_data_memaddr_int);
    
    /* free stardata (except the buffer) */
    binary_c_free_memory(&stardata, // Stardata
@@ -436,3 +453,20 @@ long int return_persistent_data_memaddr(char * argstring,
    /* Return the memaddr as an int */
    return persistent_data_memaddr_int;
}

// /* Memory freeing functions */
// int free_store_memaddr(long int * store_memaddr,
//                char ** const buffer,
//                char ** const error_buffer,
//                size_t * const nbytes)
// {



//     return 0;
// }

// int free_persistent_data_memaddr
// {

// }
+31 −2
Original line number Diff line number Diff line
import binary_c_python_api


import textwrap


@@ -12,6 +10,37 @@ def test_return_persistent_data_memaddr():
    print("Binary_c output:")
    print(textwrap.indent(str(output), "\t"))

    return output

def test_passing_persistent_data_to_run_system():
    m1 = 15.0  # Msun
    m2 = 14.0  # Msun
    separation = 0  # 0 = ignored, use period
    orbital_period = 4530.0  # days
    eccentricity = 0.0
    metallicity = 0.02
    max_evolution_time = 15000
    argstring = "binary_c M_1 {0:g} M_2 {1:g} separation {2:g} orbital_period {3:g} eccentricity {4:g} metallicity {5:g} max_evolution_time {6:g}  ".format(
        m1,
        m2,
        separation,
        orbital_period,
        eccentricity,
        metallicity,
        max_evolution_time,
    )

    persistent_data_memaddr = test_return_persistent_data_memaddr()
    print(persistent_data_memaddr)
    output = binary_c_python_api.run_system(argstring=argstring, persistent_data_memaddr=persistent_data_memaddr)

    print("function: test_run_system")
    print("Binary_c output:")
    print(textwrap.indent(output, "\t"))



####
if __name__ == "__main__":
    test_return_persistent_data_memaddr()
    test_passing_persistent_data_to_run_system()
 No newline at end of file