From: <ric...@us...> - 2009-02-11 22:49:37
|
Revision: 6951 http://openhpi.svn.sourceforge.net/openhpi/?rev=6951&view=rev Author: ricwhite Date: 2009-02-11 22:49:33 +0000 (Wed, 11 Feb 2009) Log Message: ----------- Feature request [ 2540102 ] Supporting the graceful shutdown for OA SOAP plugin. Modified Paths: -------------- openhpi/trunk/plugins/oa_soap/oa_soap.c openhpi/trunk/plugins/oa_soap/oa_soap.h openhpi/trunk/plugins/oa_soap/oa_soap_event.c openhpi/trunk/plugins/oa_soap/oa_soap_event.h openhpi/trunk/plugins/oa_soap/oa_soap_oa_event.c openhpi/trunk/plugins/oa_soap/oa_soap_re_discover.c openhpi/trunk/plugins/oa_soap/oa_soap_re_discover.h openhpi/trunk/plugins/oa_soap/oa_soap_utils.c openhpi/trunk/plugins/oa_soap/oa_soap_utils.h Modified: openhpi/trunk/plugins/oa_soap/oa_soap.c =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap.c 2009-02-10 23:35:50 UTC (rev 6950) +++ openhpi/trunk/plugins/oa_soap/oa_soap.c 2009-02-11 22:49:33 UTC (rev 6951) @@ -121,6 +121,7 @@ oa_handler->mutex = g_mutex_new(); oa_handler->oa_1 = NULL; oa_handler->oa_2 = NULL; + oa_handler->shutdown_event_thread = SAHPI_FALSE; /* Initialize the oa_info structure */ oa_handler->oa_1 = (struct oa_info *) @@ -144,6 +145,7 @@ oa_handler->oa_1->oa_status = OA_ABSENT; oa_handler->oa_1->hpi_con = NULL; oa_handler->oa_1->event_con = NULL; + oa_handler->oa_1->event_con2 = NULL; oa_handler->oa_1->thread_handler = NULL; oa_handler->oa_1->mutex = g_mutex_new(); memset(oa_handler->oa_1->server, 0, MAX_URL_LEN); @@ -152,6 +154,7 @@ oa_handler->oa_2->oa_status = OA_ABSENT; oa_handler->oa_2->hpi_con = NULL; oa_handler->oa_2->event_con = NULL; + oa_handler->oa_2->event_con2 = NULL; oa_handler->oa_2->thread_handler = NULL; oa_handler->oa_2->mutex = g_mutex_new(); memset(oa_handler->oa_1->server, 0, MAX_URL_LEN); @@ -304,6 +307,7 @@ return; } + dbg("Shutting down the OA SOAP plugin"); handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; @@ -311,39 +315,89 @@ if (oa_handler == NULL) return; + /* Check whether the oa_1 or oa_2 is NULL + * Ideally, if oa_handler is not NULL, oa_1 and oa_2 will not be NULL + */ + if (oa_handler->oa_1 == NULL || oa_handler->oa_2 == NULL) + return; + + /* Set the event thread shutdown status to TRUE */ + oa_handler->shutdown_event_thread = SAHPI_TRUE; + + /* Wait for the event threads to exit */ + if (oa_handler->oa_1->thread_handler != NULL) + g_thread_join(oa_handler->oa_1->thread_handler); + if (oa_handler->oa_2->thread_handler != NULL) + g_thread_join(oa_handler->oa_2->thread_handler); + dbg("Stopped the OA SOAP event threads"); + /* Cleanup the RPTable */ - cleanup_plugin_rptable(oh_handler); + cleanup_plugin_rptable(handler); + g_free(handler->rptcache); + dbg("Cleaned the OA SOAP RPTable"); - /* Release the resource presense and serial number array */ - release_oa_soap_resources(oa_handler); + /* Release the mutexes. Check whether the mutex is unlocked or not. If + * mutex is not unlocked by the event thread, then g_mutex_free will + * crash + */ + if (oa_handler->mutex != NULL) { + if (g_mutex_trylock(oa_handler->mutex) == FALSE) { + err("Mutex in OA handler is not unlocked by the event" + " thread"); + err("Mutex in OA handler is not released"); + } else { + g_mutex_unlock(oa_handler->mutex); + g_mutex_free(oa_handler->mutex); + } + } - /* Release the mutex */ - if (oa_handler->mutex != NULL) - g_mutex_free(oa_handler->mutex); - if (oa_handler->oa_1->mutex != NULL) - g_mutex_free(oa_handler->oa_1->mutex); - if (oa_handler->oa_2->mutex != NULL) - g_mutex_free(oa_handler->oa_2->mutex); + if (oa_handler->oa_1->mutex != NULL) { + if (g_mutex_trylock(oa_handler->oa_1->mutex) == FALSE) { + err("Mutex in oa_1 is not unlocked by the event" + " thread"); + err("Mutex in oa_1 is not released"); + } else { + g_mutex_unlock(oa_handler->oa_1->mutex); + g_mutex_free(oa_handler->oa_1->mutex); + } + } + if (oa_handler->oa_2->mutex != NULL) { + if (g_mutex_trylock(oa_handler->oa_2->mutex) == FALSE) { + err("Mutex in oa_2 is not unlocked by the event" + " thread"); + err("Mutex in oa_2 is not released"); + } else { + g_mutex_unlock(oa_handler->oa_2->mutex); + g_mutex_free(oa_handler->oa_2->mutex); + } + } + dbg("Released the OA SOAP handler mutexes"); + /* Cleanup the SOAP_CON */ if (oa_handler->oa_1->hpi_con != NULL) soap_close(oa_handler->oa_1->hpi_con); if (oa_handler->oa_1->event_con != NULL) - soap_close(oa_handler->oa_1->hpi_con); + soap_close(oa_handler->oa_1->event_con); + if (oa_handler->oa_1->event_con2 != NULL) + soap_close(oa_handler->oa_1->event_con2); if (oa_handler->oa_2->hpi_con != NULL) soap_close(oa_handler->oa_2->hpi_con); if (oa_handler->oa_2->event_con != NULL) - soap_close(oa_handler->oa_2->hpi_con); + soap_close(oa_handler->oa_2->event_con); + if (oa_handler->oa_2->event_con2 != NULL) + soap_close(oa_handler->oa_2->event_con2); + dbg("Released the SOAP CON structures from handler"); /* Release the oa info structure */ - if (oa_handler->oa_1 != NULL) - g_free(oa_handler->oa_1); - if (oa_handler->oa_2 != NULL) - g_free(oa_handler->oa_2); + g_free(oa_handler->oa_1); + g_free(oa_handler->oa_2); + dbg("Released the oa_info structures from handler"); /* Release the oa handler structure */ - if (oa_handler != NULL) - g_free(oh_handler); + g_free(oa_handler); + g_free(handler); + dbg("Released the OA SOAP handler"); return; } Modified: openhpi/trunk/plugins/oa_soap/oa_soap.h =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap.h 2009-02-10 23:35:50 UTC (rev 6950) +++ openhpi/trunk/plugins/oa_soap/oa_soap.h 2009-02-11 22:49:33 UTC (rev 6951) @@ -156,6 +156,7 @@ char server[MAX_URL_LEN]; SOAP_CON *hpi_con; SOAP_CON *event_con; + SOAP_CON *event_con2; SaHpiFloat64T fm_version; }; @@ -199,6 +200,7 @@ struct oa_info *oa_2; /* Type of the enclsoure */ SaHpiInt32T enc_type; + SaHpiBoolT shutdown_event_thread; GMutex *mutex; }; @@ -225,6 +227,24 @@ */ #define CISCO_MANUFACTURING_ID 9 +/* Checks for the shutdown request in event thread. On shutdown request, mutexes + * locked by event thread are unlocked and exits the thread. It is necessary to + * unlock the mutex, else g_free_mutex crahes on locked mutex + */ +#define OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, hnd_mutex, oa_mutex, timer) \ + { \ + if (oa_handler->shutdown_event_thread == SAHPI_TRUE) { \ + dbg("Shutting down the OA SOAP event thread"); \ + if (oa_mutex != NULL) \ + g_mutex_unlock(oa_mutex); \ + if (hnd_mutex != NULL) \ + g_mutex_unlock(hnd_mutex); \ + if (timer != NULL) \ + g_timer_destroy(timer); \ + g_thread_exit(NULL); \ + } \ + } + /* Function prototypes */ SaErrorT build_oa_soap_custom_handler(struct oh_handler_state *oh_handler); Modified: openhpi/trunk/plugins/oa_soap/oa_soap_event.c =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap_event.c 2009-02-10 23:35:50 UTC (rev 6950) +++ openhpi/trunk/plugins/oa_soap/oa_soap_event.c 2009-02-11 22:49:33 UTC (rev 6951) @@ -110,7 +110,6 @@ SaHpiBoolT is_plugin_initialized = SAHPI_FALSE; SaHpiBoolT is_discovery_completed = SAHPI_FALSE; SaHpiBoolT listen_for_events = SAHPI_TRUE; - SOAP_CON *con = NULL; char *user_name, *password, url[MAX_URL_LEN]; if (event_handler == NULL) { @@ -130,6 +129,7 @@ * If not, wait till plugin gets initialized */ while (is_plugin_initialized == SAHPI_FALSE) { + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); g_mutex_lock(oa_handler->mutex); if (oa_handler->status == PRE_DISCOVERY || oa_handler->status == DISCOVERY_COMPLETED) { @@ -147,6 +147,7 @@ * If not, wait till discovery gets completed */ while (is_discovery_completed == SAHPI_FALSE) { + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); g_mutex_lock(oa_handler->mutex); if (oa_handler->status == DISCOVERY_COMPLETED) { g_mutex_unlock(oa_handler->mutex); @@ -182,7 +183,7 @@ /* This call will not return until the OA connection is * established */ - create_oa_connection(oa, user_name, password); + create_oa_connection(oa_handler, oa, user_name, password); rv = create_event_session(oa); /* Sleep for a second, let OA stabilize * TODO: Remove this workaround, when OA has the fix @@ -196,9 +197,11 @@ memset(url, 0, MAX_URL_LEN); snprintf(url, strlen(oa->server) + strlen(PORT) + 1, "%s" PORT, oa->server); - while (con == NULL) { - con = soap_open(url, user_name, password, HPI_CALL_TIMEOUT); - if (con == NULL) + while (oa->event_con2 == NULL) { + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); + oa->event_con2 = soap_open(url, user_name, password, + HPI_CALL_TIMEOUT); + if (oa->event_con2 == NULL) sleep(2); } @@ -207,13 +210,9 @@ request.waitTilEventHappens = HPOA_TRUE; request.lcdEvents = HPOA_FALSE; - /* Listen for the events from OA - * - * Since graceful shutdown is not implemented in openhpi framework, - * this while loop is a infinite loop - * TODO: Do normal exit on implementation of graceful shutdown - */ + /* Listen for the events from OA */ while (listen_for_events == SAHPI_TRUE) { + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); rv = soap_getAllEvents(oa->event_con, &request, &response); if (rv == SOAP_OK) { retry_on_switchover = 0; @@ -223,7 +222,7 @@ if (response.eventInfoArray == NULL) { dbg("Ignoring empty event response"); } else - process_oa_events(handler, oa, con, &response); + process_oa_events(handler, oa, &response); } else { /* On switchover, the standby-turned-active OA stops * responding to SOAP calls to avoid the network loop. @@ -246,9 +245,9 @@ request.pid = oa->event_pid; /* Re-initialize the con */ - if (con != NULL) { - soap_close(con); - con = NULL; + if (oa->event_con2 != NULL) { + soap_close(oa->event_con2); + oa->event_con2 = NULL; } memset(url, 0, MAX_URL_LEN); snprintf(url, strlen(oa->server) + @@ -258,11 +257,15 @@ /* Ideally, the soap_open should pass in * 1st try. If not, try until soap_open succeeds */ - while (con == NULL) { - con = soap_open(url, user_name, - password, - HPI_CALL_TIMEOUT); - if (con == NULL) + while (oa->event_con2 == NULL) { + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, + NULL, NULL, + NULL); + oa->event_con2 = + soap_open(url, user_name, + password, + HPI_CALL_TIMEOUT); + if (oa->event_con2 == NULL) sleep(2); } } /* end of else (non-switchover error handling) */ @@ -314,7 +317,7 @@ password = (char *) g_hash_table_lookup(oh_handler->config, "OA_Password"); /* Create the OA connection */ - create_oa_connection(oa, user_name, password); + create_oa_connection(oa_handler, oa, user_name, password); /* OA session is established. Set the error_code to SOAP_OK * to skip the processing for OA out of access */ @@ -326,6 +329,7 @@ /* This loop ends when the OA is accessible */ while (is_oa_accessible == SAHPI_FALSE) { + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); /* Check whether the failure is not due to OA event session * expiry */ @@ -363,8 +367,9 @@ /* Re-discover the resources as there is a high chances * that we might have missed some events */ - rv = oa_soap_re_discover_resources(oh_handler, - oa->event_con); + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, + oa->mutex, NULL); + rv = oa_soap_re_discover_resources(oh_handler, oa); g_mutex_unlock(oa->mutex); g_mutex_unlock(oa_handler->mutex); if (rv != SA_OK) { @@ -429,11 +434,14 @@ /* This loop ends after OA is accessible */ while (is_oa_reachable == SAHPI_FALSE) { + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, timer); /* Check whether the OA is present. * If not, wait till the OA is inserted */ is_oa_present = SAHPI_FALSE; while (is_oa_present == SAHPI_FALSE) { + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, + timer); g_mutex_lock(oa->mutex); if (oa->oa_status != OA_ABSENT) { g_mutex_unlock(oa->mutex); @@ -504,7 +512,8 @@ */ if (oa_was_removed == SAHPI_TRUE) { /* Create the OA connection */ - create_oa_connection(oa, user_name, password); + create_oa_connection(oa_handler, oa, user_name, + password); is_oa_reachable = SAHPI_TRUE; } else { rv = check_oa_status(oa_handler, oa, oa->event_con); @@ -549,20 +558,22 @@ void process_oa_events(struct oh_handler_state *oh_handler, struct oa_info *oa, - SOAP_CON *con, struct getAllEventsResponse *response) { SaErrorT rv; struct eventInfo event; + struct oa_soap_handler *oa_handler = NULL; - if (response == NULL || oa == NULL || - con == NULL || oh_handler == NULL) { + if (response == NULL || oa == NULL || oh_handler == NULL) { err("Invalid parameter"); return; } + oa_handler = (struct oa_soap_handler *) oh_handler->data; + /* Extract the events from eventInfoArray */ while (response->eventInfoArray) { + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); /* Get the event from eventInfoArray */ soap_getEventInfo(response->eventInfoArray, &event); switch (event.event) { @@ -612,7 +623,8 @@ case EVENT_FAN_INSERTED: dbg("EVENT_FAN_INSERTED"); rv = process_fan_insertion_event(oh_handler, - con, &event); + oa->event_con2, + &event); break; case EVENT_FAN_REMOVED: @@ -645,7 +657,8 @@ case EVENT_PS_INSERTED: dbg("EVENT_PS_INSERTED"); rv = process_ps_insertion_event(oh_handler, - con, &event); + oa->event_con2, + &event); break; case EVENT_PS_REMOVED: @@ -696,7 +709,7 @@ case EVENT_INTERCONNECT_INSERTED: dbg("EVENT_INTERCONNECT_INSERTED"); rv = process_interconnect_insertion_event( - oh_handler, con, &event); + oh_handler, oa->event_con2, &event); break; case EVENT_INTERCONNECT_REMOVED: @@ -715,7 +728,7 @@ case EVENT_INTERCONNECT_THERMAL: dbg("EVENT_INTERCONNECT_THERMAL"); oa_soap_proc_interconnect_thermal(oh_handler, - con, &(event.eventData. + oa->event_con2, &(event.eventData. interconnectTrayStatus)); break; case EVENT_INTERCONNECT_CPUFAULT: @@ -748,7 +761,8 @@ break; case EVENT_BLADE_STATUS: dbg("EVENT_BLADE_STATUS"); - oa_soap_proc_server_status(oh_handler, con, + oa_soap_proc_server_status(oh_handler, + oa->event_con2, &(event.eventData.bladeStatus)); break; @@ -765,7 +779,8 @@ case EVENT_BLADE_POWER_STATE: dbg("EVENT_BLADE_POWER_STATE"); process_server_power_event(oh_handler, - con, &event); + oa->event_con2, + &event); break; case EVENT_BLADE_POWER_MGMT: @@ -776,12 +791,14 @@ break; case EVENT_BLADE_SHUTDOWN: dbg("EVENT_BLADE_SHUTDOWN"); - oa_soap_proc_server_status(oh_handler, con, + oa_soap_proc_server_status(oh_handler, + oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_BLADE_FAULT: dbg("EVENT_BLADE_FAULT"); - oa_soap_proc_server_status(oh_handler, con, + oa_soap_proc_server_status(oh_handler, + oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_BLADE_INFO: @@ -818,7 +835,8 @@ break; case EVENT_ILO_DEAD: dbg("EVENT_ILO_DEAD"); - oa_soap_proc_server_status(oh_handler, con, + oa_soap_proc_server_status(oh_handler, + oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_RACK_SERVICE_STARTED: @@ -831,7 +849,8 @@ break; case EVENT_ILO_ALIVE: dbg("EVENT_ILO_ALIVE"); - oa_soap_proc_server_status(oh_handler, con, + oa_soap_proc_server_status(oh_handler, + oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_PERSONALITY_CHECK: @@ -840,7 +859,8 @@ case EVENT_BLADE_POST_COMPLETE: dbg("EVENT_BLADE_POST_COMPLETE"); - oa_soap_serv_post_comp(oh_handler, con, + oa_soap_serv_post_comp(oh_handler, + oa->event_con2, event.numValue); break; @@ -899,7 +919,8 @@ case EVENT_OA_INFO: dbg("EVENT_OA_INFO"); rv = process_oa_info_event(oh_handler, - con, &event); + oa->event_con2, + &event); break; case EVENT_OA_FAILOVER: dbg("EVENT_OA_FAILOVER"); @@ -1156,8 +1177,8 @@ case EVENT_BLADE_INSERT_COMPLETED: dbg("EVENT_BLADE_INSERT_COMPLETED"); rv = process_server_insertion_event(oh_handler, - con, - &event); + oa->event_con2, + &event); break; case EVENT_EBIPA_INFO_CHANGED_EX: dbg("EVENT_EBIPA_INFO_CHANGED_EX " Modified: openhpi/trunk/plugins/oa_soap/oa_soap_event.h =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap_event.h 2009-02-10 23:35:50 UTC (rev 6950) +++ openhpi/trunk/plugins/oa_soap/oa_soap_event.h 2009-02-11 22:49:33 UTC (rev 6951) @@ -56,7 +56,6 @@ void process_oa_events(struct oh_handler_state *oh_handler, struct oa_info *oa, - SOAP_CON *con, struct getAllEventsResponse *oa_event); #endif Modified: openhpi/trunk/plugins/oa_soap/oa_soap_oa_event.c =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap_oa_event.c 2009-02-10 23:35:50 UTC (rev 6950) +++ openhpi/trunk/plugins/oa_soap/oa_soap_oa_event.c 2009-02-11 22:49:33 UTC (rev 6951) @@ -207,6 +207,8 @@ while (is_transition_complete != SAHPI_TRUE && time_elapsed < OA_STABILIZE_MAX_TIME) { + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, NULL, + timer); g_mutex_lock(oa->mutex); rv = soap_getAllEvents(oa->event_con, &request, &response); g_mutex_unlock(oa->mutex); @@ -241,14 +243,16 @@ /* Check for transition complete event */ while (response.eventInfoArray) { - soap_getEventInfo(response.eventInfoArray, &event); - if (event.event == EVENT_OA_TRANSITION_COMPLETE) { - is_transition_complete = SAHPI_TRUE; - break; - } - response.eventInfoArray = + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, + NULL, timer); + soap_getEventInfo(response.eventInfoArray, &event); + if (event.event == EVENT_OA_TRANSITION_COMPLETE) { + is_transition_complete = SAHPI_TRUE; + break; + } + response.eventInfoArray = soap_next_node(response.eventInfoArray); - } + } /* Get the time (in seconds) since the timer has been started */ time_elapsed = g_timer_elapsed(timer, µ_seconds); } @@ -266,6 +270,7 @@ if (sleep_time > 0) { sleep(sleep_time); } + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); /* Check the OA staus there may be change in OA state */ rv = check_oa_status(oa_handler, oa, oa->event_con); @@ -299,7 +304,9 @@ /* Re-discover the resources as there is a high chances * that we might have missed some events */ - rv = oa_soap_re_discover_resources(oh_handler, oa->event_con); + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, + NULL); + rv = oa_soap_re_discover_resources(oh_handler, oa); g_mutex_unlock(oa->mutex); g_mutex_unlock(oa_handler->mutex); Modified: openhpi/trunk/plugins/oa_soap/oa_soap_re_discover.c =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap_re_discover.c 2009-02-10 23:35:50 UTC (rev 6950) +++ openhpi/trunk/plugins/oa_soap/oa_soap_re_discover.c 2009-02-11 22:49:33 UTC (rev 6951) @@ -124,71 +124,99 @@ * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_re_discover_resources(struct oh_handler_state *oh_handler, - SOAP_CON *con) + struct oa_info *oa) { SaErrorT rv = SA_OK; + struct oa_soap_handler *oa_handler = NULL; - if (oh_handler == NULL || con == NULL) { + oa_handler = (struct oa_soap_handler *) oh_handler->data; + + if (oh_handler == NULL || oa == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } err("Re-discovery started"); - rv = re_discover_blade(oh_handler, con); + + /* Re-discovery is called by locking the OA handler mutex and oa_info + * mutex. Hence on getting request to shutdown, pass the locked mutexes + * for unlocking + */ + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, + NULL); + rv = re_discover_blade(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of server blade failed"); return rv; } - rv = re_discover_interconnect(oh_handler, con); + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, + NULL); + rv = re_discover_interconnect(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of interconnect failed"); return rv; } - rv = re_discover_fan(oh_handler, con); + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, + NULL); + rv = re_discover_fan(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of fan failed"); return rv; } - rv = re_discover_ps_unit(oh_handler, con); + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, + NULL); + rv = re_discover_ps_unit(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of power supply unit failed"); return rv; } - rv = re_discover_oa(oh_handler, con); + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, + NULL); + rv = re_discover_oa(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of OA failed"); return rv; } - rv = oa_soap_re_disc_enc_sen(oh_handler, con); + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, + NULL); + rv = oa_soap_re_disc_enc_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of enclosure failed"); return rv; } - rv = oa_soap_re_disc_ps_subsys_sen(oh_handler, con); + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, + NULL); + rv = oa_soap_re_disc_ps_subsys_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of power subsystem failed"); return rv; } - rv = oa_soap_re_disc_lcd_sen(oh_handler, con); + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, + NULL); + rv = oa_soap_re_disc_lcd_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of LCD failed"); return rv; } - rv = oa_soap_re_disc_fz_sen(oh_handler, con); + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, + NULL); + rv = oa_soap_re_disc_fz_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of fan zone failed"); return rv; } - rv = oa_soap_re_disc_therm_subsys_sen(oh_handler, con); + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, + NULL); + rv = oa_soap_re_disc_therm_subsys_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of thermal subsystem failed"); return rv; Modified: openhpi/trunk/plugins/oa_soap/oa_soap_re_discover.h =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap_re_discover.h 2009-02-10 23:35:50 UTC (rev 6950) +++ openhpi/trunk/plugins/oa_soap/oa_soap_re_discover.h 2009-02-11 22:49:33 UTC (rev 6951) @@ -45,7 +45,7 @@ #include "oa_soap_lcd_event.h" SaErrorT oa_soap_re_discover_resources(struct oh_handler_state *oh_handler, - SOAP_CON *con); + struct oa_info *oa); SaErrorT re_discover_oa(struct oh_handler_state *oh_handler, SOAP_CON *con); Modified: openhpi/trunk/plugins/oa_soap/oa_soap_utils.c =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap_utils.c 2009-02-10 23:35:50 UTC (rev 6950) +++ openhpi/trunk/plugins/oa_soap/oa_soap_utils.c 2009-02-11 22:49:33 UTC (rev 6951) @@ -1000,7 +1000,8 @@ * Return values: * NONE **/ -void create_oa_connection(struct oa_info *oa, +void create_oa_connection(struct oa_soap_handler *oa_handler, + struct oa_info *oa, char *user_name, char *password) { @@ -1014,11 +1015,13 @@ } while (is_oa_accessible == SAHPI_FALSE) { + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); /* Check whether the OA is present. * If not, wait till the OA is inserted */ is_oa_present = SAHPI_FALSE; while (is_oa_present == SAHPI_FALSE) { + OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); g_mutex_lock(oa->mutex); if (oa->oa_status != OA_ABSENT) { g_mutex_unlock(oa->mutex); @@ -1145,12 +1148,15 @@ rpt = oh_get_resource_next(oh_handler->rptcache, SAHPI_FIRST_ENTRY); while (rpt) { - /* Free the inventory info from inventory RDR */ - rv = free_inventory_info(oh_handler, rpt->ResourceId); - if (rv != SA_OK) { - err("Inventory cleanup failed for resource id %d", - rpt->ResourceId); + if (rpt->ResourceCapabilities + & SAHPI_CAPABILITY_INVENTORY_DATA) { + /* Free the inventory info from inventory RDR */ + rv = free_inventory_info(oh_handler, rpt->ResourceId); + if (rv != SA_OK) + err("Inventory cleanup failed for resource %d", + rpt->ResourceId); } + /* Get the next resource */ rpt = oh_get_resource_next(oh_handler->rptcache, rpt->ResourceId); } Modified: openhpi/trunk/plugins/oa_soap/oa_soap_utils.h =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap_utils.h 2009-02-10 23:35:50 UTC (rev 6950) +++ openhpi/trunk/plugins/oa_soap/oa_soap_utils.h 2009-02-11 22:49:33 UTC (rev 6951) @@ -81,7 +81,8 @@ SaErrorT create_event_session(struct oa_info *oa); -void create_oa_connection(struct oa_info *oa, +void create_oa_connection(struct oa_soap_handler *oa_handler, + struct oa_info *oa, char *user_name, char *password); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |