Hi, i'm trying to use a binary that has a main node, and every leaf is also a node that has leaves. So i'm using a struct that's called node and this node has two nodes in it. i defined a struct like
typedef struct element{ int IP; int counter; }ELEMENT; typedef struct node { ELEMENT node_element; struct node *left; struct node *right; }NODE; (i attached my code to the mail) i want to add a new node into tree and i use shared memory to hold the entire tree. If the IP of new node is smaller, i put it to he left leaf. If IP of new node is greater, i put it into the right leaf. The right and left leaves are also nodes and they have right and left leaves. Anyway, my point is when i want to insert new nodes, i'm using the apr_shm_baseaddr_get function to get the address and try to insert ner node into it. But when i add another node as a leaf, it also changes the root node. the examle output of the attached code is like this (i'm printing the root node and the right leaf node) 193168221 193168221 they are same. what i'm expecting is 192168221 193168221 Do you have any advices? Oğuzhan TOPGÜL
#include<time.h> #include <stdio.h> #include <stdlib.h> #include <httpd.h> #include <http_protocol.h> #include <http_config.h> #include <apr_shm.h> #include <apr_global_mutex.h> #include "util_mutex.h" #include "http_log.h" //APLOG_MARK, APLOG_ERR #include "apr.h" #include "apr_strings.h" #include "http_core.h" #include "ap_config.h" //NODE and ELEMENT struct definitions typedef struct element{ int IP; int counter; }ELEMENT; typedef struct node { ELEMENT node_element; struct node *left; struct node *right; }NODE; //Shared memory and global variable definitions apr_shm_t *my_shm; /* Pointer to shared memory block */ /* Shared memory structure */ struct node *newNode(int IP, struct node *node, apr_shm_t *shm) { node=(NODE*)apr_shm_baseaddr_get(shm); node->node_element.IP=IP; node->node_element.counter=1; node->left = NULL; node->right = NULL; return(node); } struct node *insert(struct node *tree, int IP, apr_shm_t *shm) { // 1. If the tree is empty, return a new, single node if (tree == NULL){ return(newNode(IP, tree, shm)); } else { // 2. Otherwise, recur down the tree if (IP < tree->node_element.IP) tree->left = insert(tree->left, IP, shm); else if (IP > tree->node_element.IP) tree->right = insert(tree->right, IP, shm); else { if (tree->node_element.IP==IP) return NULL; } return(tree); // return the (unchanged) node pointer } } ///////////////////////Binary Tree ve Fonksiyonlar Bitti/////////////////// static int my_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s){ apr_status_t rs; //Shared Memory segment rs = apr_shm_create(&my_shm, sizeof(NODE), NULL, pconf); apr_pool_cleanup_register(pconf, NULL, shm_cleanup_wrapper, apr_pool_cleanup_null); return OK; } static int my_handler(request_rec *r) { apr_status_t rs; if (strcmp(r->handler, "myhandler")) { return DECLINED; } binarytree=(NODE*)apr_shm_baseaddr_get(my_shm); binarytree=insert(binarytree,19216822,my_shm); binarytree=insert(binarytree,19316822,my_shm); ap_rprintf(r, "%i%i\n", binarytree->node_element.IP, binarytree->node_element.counter); ap_rprintf(r, "%i%i\n", binarytree->right->node_element.IP, binarytree->right->node_element.counter); return OK; } static void my_hooks(apr_pool_t *pool) { ap_hook_pre_config(my_pre_config, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_post_config(my_post_config, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_child_init(my_child_init, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_handler(my_handler, NULL, NULL, APR_HOOK_MIDDLE); } module AP_MODULE_DECLARE_DATA my_module = { STANDARD20_MODULE_STUFF, NULL, NULL, NULL, NULL, NULL, my_hooks };