diff options
Diffstat (limited to 'src/mds-registry/reexec.c')
-rw-r--r-- | src/mds-registry/reexec.c | 296 |
1 files changed, 150 insertions, 146 deletions
diff --git a/src/mds-registry/reexec.c b/src/mds-registry/reexec.c index bd70381..e7280af 100644 --- a/src/mds-registry/reexec.c +++ b/src/mds-registry/reexec.c @@ -40,31 +40,34 @@ * * @return The number of bytes that will be stored by `marshal_server` */ -size_t marshal_server_size(void) +size_t +marshal_server_size(void) { - size_t i, rc = 2 * sizeof(int) + sizeof(uint32_t) + 4 * sizeof(size_t); - hash_entry_t* entry; - ssize_t node; - - rc += mds_message_marshal_size(&received); - rc += linked_list_marshal_size(&slave_list); - - foreach_hash_table_entry (reg_table, i, entry) - { - char* command = (char*)(void*)(entry->key); - size_t len = strlen(command) + 1; - client_list_t* list = (client_list_t*)(void*)(entry->value); - - rc += len + sizeof(size_t) + client_list_marshal_size(list); - } - - foreach_linked_list_node (slave_list, node) - { - slave_t* slave = (slave_t*)(void*)slave_list.values[node]; - rc += slave_marshal_size(slave); - } - - return rc; + size_t i, rc = 2 * sizeof(int) + sizeof(uint32_t) + 4 * sizeof(size_t); + hash_entry_t *entry; + ssize_t node; + char *command; + size_t len; + client_list_t *list; + slave_t *slave; + + rc += mds_message_marshal_size(&received); + rc += linked_list_marshal_size(&slave_list); + + foreach_hash_table_entry (reg_table, i, entry) { + command = (void *)entry->key; + len = strlen(command) + 1; + list = (void *)entry->value; + + rc += len + sizeof(size_t) + client_list_marshal_size(list); + } + + foreach_linked_list_node (slave_list, node) { + slave = (void *)slave_list.values[node]; + rc += slave_marshal_size(slave); + } + + return rc; } @@ -74,52 +77,55 @@ size_t marshal_server_size(void) * @param state_buf The buffer for the marshalled data * @return Non-zero on error */ -int marshal_server(char* state_buf) +int +marshal_server(char *state_buf) { - size_t i, n = mds_message_marshal_size(&received); - hash_entry_t* entry; - ssize_t node; - - buf_set_next(state_buf, int, MDS_REGISTRY_VARS_VERSION); - buf_set_next(state_buf, int, connected); - buf_set_next(state_buf, uint32_t, message_id); - buf_set_next(state_buf, size_t, n); - mds_message_marshal(&received, state_buf); - state_buf += n / sizeof(char); - - buf_set_next(state_buf, size_t, reg_table.capacity); - buf_set_next(state_buf, size_t, reg_table.size); - foreach_hash_table_entry (reg_table, i, entry) - { - char* command = (char*)(void*)(entry->key); - size_t len = strlen(command) + 1; - client_list_t* list = (client_list_t*)(void*)(entry->value); - - memcpy(state_buf, command, len * sizeof(char)); - state_buf += len; - - n = client_list_marshal_size(list); - buf_set_next(state_buf, size_t, n); - client_list_marshal(list, state_buf); - state_buf += n / sizeof(char); - } - - n = linked_list_marshal_size(&slave_list); - buf_set_next(state_buf, size_t, n); - linked_list_marshal(&slave_list, state_buf); - state_buf += n / sizeof(char); - - foreach_linked_list_node (slave_list, node) - { - slave_t* slave = (slave_t*)(void*)(slave_list.values[node]); - state_buf += slave_marshal(slave, state_buf) / sizeof(char); - slave_destroy(slave); - } - - hash_table_destroy(®_table, (free_func*)reg_table_free_key, (free_func*)reg_table_free_value); - mds_message_destroy(&received); - linked_list_destroy(&slave_list); - return 0; + size_t i, n = mds_message_marshal_size(&received); + hash_entry_t *entry; + ssize_t node; + char *command; + size_t len; + client_list_t *list; + slave_t *slave; + + buf_set_next(state_buf, int, MDS_REGISTRY_VARS_VERSION); + buf_set_next(state_buf, int, connected); + buf_set_next(state_buf, uint32_t, message_id); + buf_set_next(state_buf, size_t, n); + mds_message_marshal(&received, state_buf); + state_buf += n / sizeof(char); + + buf_set_next(state_buf, size_t, reg_table.capacity); + buf_set_next(state_buf, size_t, reg_table.size); + foreach_hash_table_entry (reg_table, i, entry) { + command = (void *)(entry->key); + len = strlen(command) + 1; + list = (void *)(entry->value); + + memcpy(state_buf, command, len * sizeof(char)); + state_buf += len; + + n = client_list_marshal_size(list); + buf_set_next(state_buf, size_t, n); + client_list_marshal(list, state_buf); + state_buf += n / sizeof(char); + } + + n = linked_list_marshal_size(&slave_list); + buf_set_next(state_buf, size_t, n); + linked_list_marshal(&slave_list, state_buf); + state_buf += n / sizeof(char); + + foreach_linked_list_node (slave_list, node) { + slave = (void *)(slave_list.values[node]); + state_buf += slave_marshal(slave, state_buf) / sizeof(char); + slave_destroy(slave); + } + + hash_table_destroy(®_table, (free_func *)reg_table_free_key, (free_func *)reg_table_free_value); + mds_message_destroy(&received); + linked_list_destroy(&slave_list); + return 0; } @@ -133,81 +139,79 @@ int marshal_server(char* state_buf) * @param state_buf The marshalled data that as not been read already * @return Non-zero on error */ -int unmarshal_server(char* state_buf) +int +unmarshal_server(char *state_buf) { - char* command; - client_list_t* list; - slave_t* slave; - size_t i, n, m; - ssize_t node; - int stage = 0; - - /* buf_get_next(state_buf, int, MDS_REGISTRY_VARS_VERSION); */ - buf_next(state_buf, int, 1); - buf_get_next(state_buf, int, connected); - buf_get_next(state_buf, uint32_t, message_id); - buf_get_next(state_buf, size_t, n); - fail_if (mds_message_unmarshal(&received, state_buf)); - state_buf += n / sizeof(char); - stage = 1; - - buf_get_next(state_buf, size_t, n); - fail_if (hash_table_create_tuned(®_table, n)); - buf_get_next(state_buf, size_t, n); - for (i = 0; i < n; i++) - { - stage = 1; - fail_if (xstrdup(command, state_buf)); - state_buf += strlen(command) + 1; - - stage = 2; - fail_if (xmalloc(list, 1, client_list_t)); - buf_get_next(state_buf, size_t, m); - stage = 3; - fail_if (client_list_unmarshal(list, state_buf)); - state_buf += m / sizeof(char); - - hash_table_put(®_table, (size_t)(void*)command, (size_t)(void*)list); - fail_if (errno); - } - command = NULL; - stage = 4; - - reg_table.key_comparator = (compare_func*)string_comparator; - reg_table.hasher = (hash_func*)string_hash; - - buf_get_next(state_buf, size_t, n); - fail_if (linked_list_unmarshal(&slave_list, state_buf)); - state_buf += n / sizeof(char); - - foreach_linked_list_node (slave_list, node) - { - stage = 5; - fail_if (xmalloc(slave, 1, slave_t)); - stage = 6; - fail_if ((n = slave_unmarshal(slave, state_buf)) == 0); - state_buf += n / sizeof(char); - slave_list.values[node] = (size_t)(void*)slave; - } - - foreach_linked_list_node (slave_list, node) - { - slave = (slave_t*)(void*)(slave_list.values[node]); - fail_if (start_created_slave(slave)); - } - - return 0; - fail: - xperror(*argv); - mds_message_destroy(&received); - if (stage >= 1) - hash_table_destroy(®_table, (free_func*)reg_table_free_key, (free_func*)reg_table_free_value); - if (stage >= 2) free(command); - if (stage >= 3) client_list_destroy(list), free(list); - if (stage >= 5) linked_list_destroy(&slave_list); - if (stage >= 6) slave_destroy(slave), free(slave); - abort(); - return -1; + char *command; + client_list_t *list; + slave_t *slave; + size_t i, n, m; + ssize_t node; + int stage = 0; + + /* buf_get_next(state_buf, int, MDS_REGISTRY_VARS_VERSION); */ + buf_next(state_buf, int, 1); + buf_get_next(state_buf, int, connected); + buf_get_next(state_buf, uint32_t, message_id); + buf_get_next(state_buf, size_t, n); + fail_if (mds_message_unmarshal(&received, state_buf)); + state_buf += n / sizeof(char); + stage = 1; + + buf_get_next(state_buf, size_t, n); + fail_if (hash_table_create_tuned(®_table, n)); + buf_get_next(state_buf, size_t, n); + for (i = 0; i < n; i++) { + stage = 1; + fail_if (xstrdup(command, state_buf)); + state_buf += strlen(command) + 1; + + stage = 2; + fail_if (xmalloc(list, 1, client_list_t)); + buf_get_next(state_buf, size_t, m); + stage = 3; + fail_if (client_list_unmarshal(list, state_buf)); + state_buf += m / sizeof(char); + + hash_table_put(®_table, (size_t)(void *)command, (size_t)(void *)list); + fail_if (errno); + } + command = NULL; + stage = 4; + + reg_table.key_comparator = (compare_func*)string_comparator; + reg_table.hasher = (hash_func*)string_hash; + + buf_get_next(state_buf, size_t, n); + fail_if (linked_list_unmarshal(&slave_list, state_buf)); + state_buf += n / sizeof(char); + + foreach_linked_list_node (slave_list, node) { + stage = 5; + fail_if (xmalloc(slave, 1, slave_t)); + stage = 6; + fail_if ((n = slave_unmarshal(slave, state_buf)) == 0); + state_buf += n / sizeof(char); + slave_list.values[node] = (size_t)(void *)slave; + } + + foreach_linked_list_node (slave_list, node) { + slave = (slave_t *)(void *)(slave_list.values[node]); + fail_if (start_created_slave(slave)); + } + + return 0; +fail: + xperror(*argv); + mds_message_destroy(&received); + if (stage >= 1) + hash_table_destroy(®_table, (free_func *)reg_table_free_key, (free_func *)reg_table_free_value); + if (stage >= 2) free(command); + if (stage >= 3) client_list_destroy(list), free(list); + if (stage >= 5) linked_list_destroy(&slave_list); + if (stage >= 6) slave_destroy(slave), free(slave); + abort(); + return -1; } @@ -217,8 +221,8 @@ int unmarshal_server(char* state_buf) * * @return Non-zero on error */ -int __attribute__((const)) reexec_failure_recover(void) +int __attribute__((const)) +reexec_failure_recover(void) { - return -1; + return -1; } - |