Navigation


Changeset 1215:65c6460f60f2 in freeDiameter for libfdcore


Ignore:
Timestamp:
Jun 19, 2013, 11:20:47 AM (11 years ago)
Author:
Sebastien Decugis <sdecugis@freediameter.net>
Branch:
default
Phase:
public
Message:

Ensure the hooks lock is released when a thread is canceled. Optimize the default hook behavior to avoid too many mallocs/free

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libfdcore/hooks.c

    r1202 r1215  
    281281}
    282282
     283static pthread_mutex_t hook_default_mtx = PTHREAD_MUTEX_INITIALIZER;
     284static char * hook_default_buf = NULL;
     285static size_t hook_default_len = 0;
     286
    283287/* The function that does the work of calling the extension's callbacks and also managing the permessagedata structures */
    284288void   fd_hook_call(enum fd_hook_type type, struct msg * msg, struct fd_peer * peer, void * other, struct fd_msg_pmdl * pmdl)
     
    290294        /* lock the list of hooks for this type */
    291295        CHECK_POSIX_DO( pthread_rwlock_rdlock(&HS_array[type].rwlock), );
     296       
     297        pthread_cleanup_push( fd_cleanup_rwlock, &HS_array[type].rwlock );
    292298       
    293299        if (FD_IS_LIST_EMPTY(&HS_array[type].sentinel)) {
     
    309315        }
    310316       
     317        pthread_cleanup_pop(0);
     318       
    311319        /* done */
    312320        CHECK_POSIX_DO( pthread_rwlock_unlock(&HS_array[type].rwlock), );
    313321       
    314322        if (call_default) {
    315                 char * buf = NULL;
    316                 size_t len = 0;
     323                CHECK_POSIX_DO( pthread_mutex_lock(&hook_default_mtx), );
     324               
     325                pthread_cleanup_push( fd_cleanup_mutex, &hook_default_mtx );
    317326       
    318327                /* There was no registered handler, default behavior for this hook */
     
    325334                       
    326335                        case HOOK_MESSAGE_RECEIVED: {
    327                                 CHECK_MALLOC_DO(fd_msg_dump_summary(&buf, &len, NULL, msg, NULL, 0, 1), break);
    328                                 LOG_D("RCV from '%s': %s", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", buf);
     336                                CHECK_MALLOC_DO(fd_msg_dump_summary(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
     337                                LOG_D("RCV from '%s': %s", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", hook_default_buf);
    329338                                break;
    330339                        }
    331340                       
    332341                        case HOOK_MESSAGE_LOCAL: {
    333                                 CHECK_MALLOC_DO(fd_msg_dump_full(&buf, &len, NULL, msg, NULL, 0, 1), break);
    334                                 LOG_A("Handled to framework for sending: %s", buf);
     342                                CHECK_MALLOC_DO(fd_msg_dump_full(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
     343                                LOG_A("Handled to framework for sending: %s", hook_default_buf);
    335344                                break;
    336345                        }
    337346                       
    338347                        case HOOK_MESSAGE_SENT: {
    339                                 CHECK_MALLOC_DO(fd_msg_dump_summary(&buf, &len, NULL, msg, NULL, 0, 1), break);
    340                                 LOG_D("SENT to '%s': %s", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", buf);
     348                                CHECK_MALLOC_DO(fd_msg_dump_summary(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
     349                                LOG_D("SENT to '%s': %s", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", hook_default_buf);
    341350                                break;
    342351                        }
    343352                       
    344353                        case HOOK_MESSAGE_FAILOVER: {
    345                                 CHECK_MALLOC_DO(fd_msg_dump_summary(&buf, &len, NULL, msg, NULL, 0, 1), break);
    346                                 LOG_D("Failing over message sent to '%s': %s", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", buf);
     354                                CHECK_MALLOC_DO(fd_msg_dump_summary(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
     355                                LOG_D("Failing over message sent to '%s': %s", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", hook_default_buf);
    347356                                break;
    348357                        }
     
    357366                                                id = (DiamId_t)"<local>";
    358367                                       
    359                                         CHECK_MALLOC_DO(fd_msg_dump_treeview(&buf, &len, NULL, msg, NULL, 0, 1), break);
     368                                        CHECK_MALLOC_DO(fd_msg_dump_treeview(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
    360369                                       
    361370                                        LOG_E("Parsing error: '%s' for the following message received from '%s':", (char *)other, (char *)id);
    362                                         LOG_SPLIT(FD_LOG_ERROR, "   ", buf?:"<error dumping message>", NULL);
     371                                        LOG_SPLIT(FD_LOG_ERROR, "   ", hook_default_buf, NULL);
    363372                                } else {
    364373                                        struct fd_cnx_rcvdata *rcv_data = other;
    365                                         CHECK_MALLOC_DO(fd_dump_extend_hexdump(&buf, &len, NULL, rcv_data->buffer, rcv_data->length, 0, 0), break);
    366                                         LOG_E("Parsing error: cannot parse %zdB buffer from '%s': %s",  rcv_data->length, peer ? peer->p_hdr.info.pi_diamid : "<unknown>", buf);
     374                                        CHECK_MALLOC_DO(fd_dump_extend_hexdump(&hook_default_buf, &hook_default_len, NULL, rcv_data->buffer, rcv_data->length, 0, 0), break);
     375                                        LOG_E("Parsing error: cannot parse %zdB buffer from '%s': %s",  rcv_data->length, peer ? peer->p_hdr.info.pi_diamid : "<unknown>", hook_default_buf);
    367376                                }
    368377                                break;
     
    370379                       
    371380                        case HOOK_MESSAGE_ROUTING_ERROR: {
    372                                 CHECK_MALLOC_DO(fd_msg_dump_treeview(&buf, &len, NULL, msg, NULL, 0, 1), break);
     381                                CHECK_MALLOC_DO(fd_msg_dump_treeview(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
    373382                                LOG_E("Routing error: '%s' for the following message:", (char *)other);
    374                                 LOG_SPLIT(FD_LOG_ERROR, "   ", buf?:"<error dumping message>", NULL);
     383                                LOG_SPLIT(FD_LOG_ERROR, "   ", hook_default_buf, NULL);
    375384                                break;
    376385                        }
    377386                       
    378387                        case HOOK_MESSAGE_ROUTING_FORWARD: {
    379                                 CHECK_MALLOC_DO(fd_msg_dump_summary(&buf, &len, NULL, msg, NULL, 0, 1), break);
    380                                 LOG_D("FORWARDING: %s", buf);
     388                                CHECK_MALLOC_DO(fd_msg_dump_summary(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
     389                                LOG_D("FORWARDING: %s", hook_default_buf);
    381390                                break;
    382391                        }
    383392                       
    384393                        case HOOK_MESSAGE_ROUTING_LOCAL: {
    385                                 CHECK_MALLOC_DO(fd_msg_dump_summary(&buf, &len, NULL, msg, NULL, 0, 1), break);
    386                                 LOG_D("DISPATCHING: %s", buf);
     394                                CHECK_MALLOC_DO(fd_msg_dump_summary(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
     395                                LOG_D("DISPATCHING: %s", hook_default_buf);
    387396                                break;
    388397                        }
    389398                       
    390399                        case HOOK_MESSAGE_DROPPED: {
    391                                 CHECK_MALLOC_DO(fd_msg_dump_treeview(&buf, &len, NULL, msg, NULL, 0, 1), break);
     400                                CHECK_MALLOC_DO(fd_msg_dump_treeview(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
    392401                                LOG_E("Message discarded ('%s'):", (char *)other);
    393                                 LOG_SPLIT(FD_LOG_ERROR, "   ", buf?:"<error dumping message>", NULL);
     402                                LOG_SPLIT(FD_LOG_ERROR, "   ", hook_default_buf, NULL);
    394403                                break;
    395404                        }
     
    397406                        case HOOK_PEER_CONNECT_FAILED: {
    398407                                if (msg) {
    399                                         CHECK_MALLOC_DO(fd_msg_dump_treeview(&buf, &len, NULL, msg, NULL, 0, 1), break);
     408                                        CHECK_MALLOC_DO(fd_msg_dump_treeview(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
    400409                                        LOG_N("Connection to '%s' failed: '%s'; CER/CEA dump:", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", (char *)other);
    401                                         LOG_SPLIT(FD_LOG_NOTICE, "   ", buf?:"<error dumping message>", NULL);
     410                                        LOG_SPLIT(FD_LOG_NOTICE, "   ", hook_default_buf, NULL);
    402411                                } else {
    403412                                        LOG_D("Connection to '%s' failed: %s", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", (char *)other);
     
    411420                                        fd_msg_answ_getq(msg, &msg); /* We dump the CER in that case */
    412421                                }
    413                                 CHECK_MALLOC_DO(fd_msg_dump_treeview(&buf, &len, NULL, msg, NULL, 0, 1), break);
     422                                CHECK_MALLOC_DO(fd_msg_dump_treeview(&hook_default_buf, &hook_default_len, NULL, msg, NULL, 0, 1), break);
    414423                                char protobuf[40];
    415424                                if (peer) {
     
    420429                                }
    421430                                LOG_N("Connected to '%s' (%s), remote capabilities: ", peer ? peer->p_hdr.info.pi_diamid : "<unknown>", protobuf);
    422                                 LOG_SPLIT(FD_LOG_NOTICE, "   ", buf?:"<error dumping message>", NULL);
     431                                LOG_SPLIT(FD_LOG_NOTICE, "   ", hook_default_buf, NULL);
    423432                                break;
    424433                        }
     
    426435                }
    427436               
    428                 free(buf);
    429         }
    430 }
     437                pthread_cleanup_pop(0);
     438               
     439                CHECK_POSIX_DO( pthread_mutex_unlock(&hook_default_mtx), );
     440        }
     441}
Note: See TracChangeset for help on using the changeset viewer.