On Tue, Jun 02, 2009 at 05:58:46PM +0200, Jan Friesse wrote:
> Main problem is,
> that sometimes message_handler_req_lib_lck_resourcelock(async) ask to
> deleted handle. So this patch test result of hdb_get... and if it is not
> 0, it should return error to caller -> ipc send. So from my point of
> view, it's just easier to introduce more universal function (and call it
> in old function) to send IPC reply.

OK. But I think we can work out this error condition without
introducing a new routine to send a response. We have a function that
does that. Let me work through a few other bugs and I'll dig into this
issue afterwards.


> Ryan O'Hara wrote:
> > NACK. What is the purpose of introducing a new function?
> > 
> > On Tue, Jun 02, 2009 at 05:34:07PM +0200, Jan Friesse wrote:
> >> This patch also split lck_resourcelock_response_send to two
> >> functions, because it looks like easy way how to avoid
> >> code duplication.
> >> ---
> >>  trunk/services/lck.c |   56 
> >> ++++++++++++++++++++++++++++++++++---------------
> >>  1 files changed, 39 insertions(+), 17 deletions(-)
> >>
> >> diff --git a/trunk/services/lck.c b/trunk/services/lck.c
> >> index 383e862..055c8ad 100644
> >> --- a/trunk/services/lck.c
> >> +++ b/trunk/services/lck.c
> >> @@ -1572,32 +1572,43 @@ static struct resource_lock 
> >> *lck_resource_lock_find (
> >>    return (0);
> >>  }
> >>  
> >> +static void lck_resourcelock_response_send_int(
> >> +  void *conn,
> >> +  mar_uint32_t lock_status,
> >> +  SaAisErrorT error)
> >> +{
> >> +  struct res_lib_lck_resourcelock res_lib_lck_resourcelock;
> >> +
> >> +  res_lib_lck_resourcelock.header.size =
> >> +          sizeof (struct res_lib_lck_resourcelock);
> >> +  res_lib_lck_resourcelock.header.id =
> >> +          MESSAGE_RES_LCK_RESOURCELOCK;
> >> +  res_lib_lck_resourcelock.header.error = error;
> >> +  res_lib_lck_resourcelock.lock_status =
> >> +          lock_status;
> >> +
> >> +  api->ipc_response_send (
> >> +          conn,
> >> +          &res_lib_lck_resourcelock,
> >> +          sizeof (struct res_lib_lck_resourcelock));
> >> +}
> >> +
> >>  static void lck_resourcelock_response_send (
> >>    struct resource_lock *resource_lock,
> >>    SaAisErrorT error)
> >>  {
> >> -  struct res_lib_lck_resourcelock res_lib_lck_resourcelock;
> >>  
> >>    /* DEBUG */
> >>    log_printf (LOGSYS_LEVEL_DEBUG, "[DEBUG]: 
> >> lck_resourcelock_response_send\n");
> >>  
> >> +  assert (resource_lock != NULL);
> >> +
> >>    if (api->ipc_source_is_local (&resource_lock->response_source))
> >>    {
> >> -          res_lib_lck_resourcelock.header.size =
> >> -                  sizeof (struct res_lib_lck_resourcelock);
> >> -          res_lib_lck_resourcelock.header.id =
> >> -                  MESSAGE_RES_LCK_RESOURCELOCK;
> >> -          res_lib_lck_resourcelock.header.error = error;
> >> -
> >> -          if (resource_lock != NULL) {
> >> -                  res_lib_lck_resourcelock.lock_status =
> >> -                          resource_lock->lock_status;
> >> -          }
> >> -
> >> -          api->ipc_response_send (
> >> +          lck_resourcelock_response_send_int(
> >>                    resource_lock->response_source.conn,
> >> -                  &res_lib_lck_resourcelock,
> >> -                  sizeof (struct res_lib_lck_resourcelock));
> >> +                  resource_lock->lock_status,
> >> +                  error);
> >>    }
> >>  }
> >>  
> >> @@ -2045,6 +2056,7 @@ error_exit:
> >>                            sizeof (*resource_instance), &resource_id);
> >>                    hdb_handle_get (&resource_hdb,
> >>                            resource_id, (void *)&resource_instance);
> >> +                  fprintf(stderr,"Resource id = %lld\n",resource_id);
> >>                    memcpy (&resource_instance->source,
> >>                            &req_exec_lck_resourceopen->source,
> >>                            sizeof (mar_message_source_t));
> >> @@ -2997,6 +3009,7 @@ static void message_handler_req_lib_lck_resourcelock 
> >> (
> >>    struct req_exec_lck_resourcelock req_exec_lck_resourcelock;
> >>    struct resource_instance *resource_instance;
> >>    struct iovec iovec;
> >> +  int res;
> >>  
> >>    /* DEBUG */
> >>    log_printf (LOGSYS_LEVEL_DEBUG, "LIB request: saLckResourceLock\n");
> >> @@ -3027,8 +3040,12 @@ static void 
> >> message_handler_req_lib_lck_resourcelock (
> >>    req_exec_lck_resourcelock.timeout =
> >>            req_lib_lck_resourcelock->timeout;
> >>  
> >> -  hdb_handle_get (&resource_hdb, req_lib_lck_resourcelock->resource_id,
> >> +  res = hdb_handle_get (&resource_hdb, 
> >> req_lib_lck_resourcelock->resource_id,
> >>            (void *)&resource_instance);
> >> +  if (res != 0) {
> >> +          lck_resourcelock_response_send_int(conn, 0, 
> >> SA_AIS_ERR_BAD_HANDLE);
> >> +          return ;
> >> +  }
> >>  
> >>    memcpy (&req_exec_lck_resourcelock.callback_source,
> >>            &resource_instance->source, sizeof (mar_message_source_t));
> >> @@ -3049,6 +3066,7 @@ static void 
> >> message_handler_req_lib_lck_resourcelockasync (
> >>    struct req_exec_lck_resourcelockasync req_exec_lck_resourcelockasync;
> >>    struct resource_instance *resource_instance;
> >>    struct iovec iovec;
> >> +  int res;
> >>  
> >>    /* DEBUG */
> >>    log_printf (LOGSYS_LEVEL_DEBUG, "LIB request: 
> >> saLckResourceLockAsync\n");
> >> @@ -3079,8 +3097,12 @@ static void 
> >> message_handler_req_lib_lck_resourcelockasync (
> >>    req_exec_lck_resourcelockasync.invocation =
> >>            req_lib_lck_resourcelockasync->invocation;
> >>  
> >> -  hdb_handle_get (&resource_hdb, 
> >> req_lib_lck_resourcelockasync->resource_id,
> >> +  res = hdb_handle_get (&resource_hdb, 
> >> req_lib_lck_resourcelockasync->resource_id,
> >>            (void *)&resource_instance);
> >> +  if (res != 0) {
> >> +          lck_resourcelock_response_send_int(conn, 0, 
> >> SA_AIS_ERR_BAD_HANDLE);
> >> +          return ;
> >> +  }
> >>  
> >>    memcpy (&req_exec_lck_resourcelockasync.callback_source,
> >>            &resource_instance->source, sizeof (mar_message_source_t));
> >> -- 
> >> 1.5.5.6
> >>
> >> _______________________________________________
> >> Openais mailing list
> >> [email protected]
> >> https://lists.linux-foundation.org/mailman/listinfo/openais
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to