00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <stdio.h>
00038 #include <stdlib.h>
00039 #ifndef _WIN32
00040 #include <unistd.h>
00041 #include "config.h"
00042 #else
00043 #include "winconfig.h"
00044 #endif
00045 #include "include/mc_platform.h"
00046 #include "include/df.h"
00047
00048
00049 int
00050 df_Add(struct df_s* df, struct df_node_s* node)
00051 {
00052 int err;
00053 ListWRLock(df->service_list);
00054 err = ListAdd(df->service_list, (void*) node);
00055 if (err == MC_SUCCESS)
00056 df->num_entries++;
00057 ListWRUnlock(df->service_list);
00058 return err;
00059 }
00060
00061 int
00062 df_AddRequest(struct df_s* df, struct df_request_list_node_s* node)
00063 {
00064 int err;
00065
00066 ListWRLock(df->request_list);
00067 err = ListAdd(
00068 df->request_list,
00069 (void*)node );
00070 ListWRUnlock(df->request_list);
00071 return err;
00072 }
00073
00074 int
00075 df_Destroy(df_p df)
00076 {
00077 df_node_p df_node;
00078 MUTEX_LOCK(df->lock);
00079 ListWRLock(df->service_list);
00080 while ( (df_node = (df_node_p)ListPop(df->service_list)) != NULL) {
00081 df_node_Destroy(df_node);
00082 }
00083 ListWRUnlock(df->service_list);
00084 ListTerminate(df->service_list);
00085 df_request_list_Destroy(df->request_list);
00086 MUTEX_DESTROY(df->lock);
00087 COND_DESTROY(df->cond);
00088 free(df->lock);
00089 free(df->cond);
00090 free(df->waiting_lock);
00091 free(df->waiting_cond);
00092 free(df);
00093 return MC_SUCCESS;
00094 }
00095
00096 df_p
00097 df_Initialize(mc_platform_p mc_platform)
00098 {
00099 df_p df;
00100 df = (df_p)malloc(sizeof(df_t));
00101
00102 df->mc_platform = mc_platform;
00103
00104
00105 df->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00106 MUTEX_INIT(df->lock);
00107
00108
00109 df->cond = (COND_T*)malloc(sizeof(COND_T));
00110 COND_INIT(df->cond);
00111
00112
00113 df->service_list = ListInitialize();
00114
00115
00116 df->request_list = ListInitialize();
00117
00118 df->num_entries = 0;
00119 df->waiting = 0;
00120 df->waiting_lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00121 MUTEX_INIT(df->waiting_lock);
00122 df->waiting_cond = (COND_T*)malloc(sizeof(COND_T));
00123 COND_INIT(df->waiting_cond);
00124 return df;
00125 }
00126
00127 int
00128 df_ProcessRequest(
00129 struct mc_platform_s* global
00130 )
00131 {
00132 int return_code;
00133 int handler_code;
00134 enum df_request_list_index_e request_code;
00135 df_request_list_node_t *request;
00136 ListWRLock(global->df->request_list);
00137 if (
00138 (
00139 request = (df_request_list_node_t*)ListPop( global->df->request_list )
00140 ) == NULL
00141 )
00142 {
00143 ListWRUnlock(global->df->request_list);
00144 printf("Empty.\n");
00145 return MC_ERR_EMPTY;
00146 }
00147 ListWRUnlock(global->df->request_list);
00148
00149
00150 #define REQUEST(name, string, description) \
00151 if ( !strcmp(request->command, string ) ) { \
00152 return_code = MC_SUCCESS; \
00153 handler_code = request_handler_##name( \
00154 global, \
00155 request->data ); \
00156 request_code = REQUEST_##name; \
00157 } else
00158 #include "include/df_request.x.h"
00159 #undef REQUEST
00160 {
00161 fprintf(stderr, "No such register command: %s. %s:%d\n",
00162 request->command,
00163 __FILE__,
00164 __LINE__ );
00165 return MC_ERR_INVALID;
00166 }
00167
00168 return handler_code;
00169 }
00170
00171
00172
00173
00174
00175 int df_SearchForService(
00176 df_p df,
00177 const char* searchstring,
00178 char*** agent_names,
00179 char*** service_names,
00180 int** agent_ids,
00181 int* num_entries)
00182 {
00183 int i=0;
00184 int j=0;
00185 int found_entries=0;
00186 listNode_p list_node;
00187 df_node_p df_node;
00188
00189
00190 if(df->num_entries < 1) {
00191 *num_entries = 0;
00192 return MC_ERR_NOT_FOUND;
00193 }
00194
00195
00196 MUTEX_LOCK(df->lock);
00197
00198
00199
00200 list_node = df->service_list->listhead;
00201 while (list_node != NULL) {
00202
00203
00204 MUTEX_LOCK( ((df_node_p)(list_node->node_data))->lock );
00205 df_node = (df_node_p)list_node->node_data;
00206 for(i = 0; i < df_node->num_services; i++) {
00207 if ( strstr(df_node->service_names[i], searchstring) ) {
00208
00209 found_entries++;
00210 }
00211 }
00212 MUTEX_UNLOCK(df_node->lock);
00213 list_node = list_node->next;
00214 }
00215 if (found_entries == 0) {
00216
00217 MUTEX_UNLOCK(df->lock);
00218 *num_entries = 0;
00219 return MC_ERR_NOT_FOUND;
00220 }
00221
00222
00223 *agent_names = (char**)malloc(sizeof(char*) * found_entries);
00224 *service_names = (char**)malloc(sizeof(char*) * found_entries);
00225 *agent_ids = (int*)malloc(sizeof(int) * found_entries);
00226
00227 list_node = df->service_list->listhead;
00228 while (list_node != NULL) {
00229
00230
00231 MUTEX_LOCK( ((df_node_p)(list_node->node_data))->lock );
00232 df_node = (df_node_p)list_node->node_data;
00233 for(i = 0; i < df_node->num_services; i++) {
00234 if ( strstr(df_node->service_names[i], searchstring) ) {
00235
00236
00237 (*agent_names)[j] = (char*)malloc(
00238 sizeof(char) * (strlen(df_node->agent_name)+1)
00239 );
00240 strcpy((*agent_names)[j], df_node->agent_name);
00241
00242 (*service_names)[j] = (char*)malloc(
00243 sizeof(char) * (strlen((df_node->service_names)[i])+1)
00244 );
00245 strcpy((*service_names)[j], (df_node->service_names)[i]);
00246
00247 (*agent_ids)[j] = df_node->agent_id;
00248 j++;
00249 }
00250 }
00251 MUTEX_UNLOCK(df_node->lock);
00252 list_node = list_node->next;
00253 }
00254 MUTEX_UNLOCK(df->lock);
00255 *num_entries = found_entries;
00256 return MC_SUCCESS;
00257 }
00258
00259 void
00260 df_Start(mc_platform_p mc_platform)
00261 {
00262 #ifndef _WIN32
00263 pthread_attr_t attr;
00264 pthread_attr_init(&attr);
00265 if (mc_platform->stack_size[MC_THREAD_DF] != -1) {
00266 pthread_attr_setstacksize
00267 (
00268 &attr,
00269 mc_platform->stack_size[MC_THREAD_DF]
00270 );
00271 }
00272 #else
00273 int stack_size;
00274 if (mc_platform->stack_size[MC_THREAD_DF] < 1) {
00275
00276 stack_size = mc_platform->stack_size[MC_THREAD_DF]+1;
00277 } else {
00278 stack_size = mc_platform->stack_size[MC_THREAD_DF];
00279 }
00280 #endif
00281 THREAD_CREATE
00282 (
00283 &mc_platform->df->thread,
00284 df_Thread,
00285 mc_platform
00286 );
00287 }
00288
00289
00290 int
00291 df_request_list_node_Destroy(df_request_list_node_p node)
00292 {
00293 MUTEX_DESTROY(node->lock);
00294 free(node->lock);
00295 COND_DESTROY(node->cond);
00296 free(node->cond);
00297 free(node);
00298 return MC_SUCCESS;
00299 }
00300
00301 df_request_list_node_p
00302 df_request_list_node_New(void)
00303 {
00304 df_request_list_node_p node;
00305 node = (df_request_list_node_p)
00306 malloc(sizeof(df_request_list_node_t));
00307 CHECK_NULL(node, return NULL;);
00308 node->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00309 MUTEX_INIT(node->lock);
00310 node->cond = (COND_T*)malloc(sizeof(COND_T));
00311 COND_INIT(node->cond);
00312 node->data_size = 0;
00313 node->command = NULL;
00314 node->data = NULL;
00315 return node;
00316 }
00317
00318
00319 int
00320 df_request_list_Destroy(list_t* df_request_list)
00321 {
00322 df_request_list_node_p node;
00323 ListWRLock(df_request_list);
00324 while
00325 (
00326 (
00327 node =
00328 (df_request_list_node_p)ListPop
00329 (
00330 df_request_list
00331 )
00332 ) != NULL
00333 )
00334 {
00335 df_request_list_node_Destroy(node);
00336 }
00337 ListWRUnlock(df_request_list);
00338 ListTerminate(df_request_list);
00339 return MC_SUCCESS;
00340 }
00341
00342
00343 df_request_search_p
00344 df_request_search_New(void)
00345 {
00346 df_request_search_p search;
00347 search = (df_request_search_p)malloc(sizeof(df_request_search_t));
00348 CHECK_NULL(search, return NULL;);
00349 search->lock = (MUTEX_T*)malloc(sizeof(MUTEX_T));
00350 CHECK_NULL(search->lock, return NULL;);
00351 search->cond = (COND_T*)malloc(sizeof(COND_T));
00352 CHECK_NULL(search->cond, return NULL;);
00353 MUTEX_INIT(search->lock);
00354 COND_INIT(search->cond);
00355 return search;
00356 }
00357
00358 int
00359 df_request_search_Destroy(df_request_search_p node)
00360 {
00361 MUTEX_DESTROY(node->lock);
00362 free(node->lock);
00363 COND_DESTROY(node->cond);
00364 free(node->cond);
00365
00366 free(node);
00367 return MC_SUCCESS;
00368 }
00369
00370
00371 int
00372 df_node_Destroy(df_node_p df_node)
00373 {
00374 int i;
00375 MUTEX_LOCK(df_node->lock);
00376 free(df_node->agent_name);
00377 for(i = 0; i < df_node->num_services; i++) {
00378 free(df_node->service_names[i]);
00379 }
00380 free(df_node->service_names);
00381 free(df_node);
00382 return MC_SUCCESS;
00383 }
00384
00385 #ifndef _WIN32
00386 void* df_Thread(void* arg)
00387 #else
00388 DWORD WINAPI df_Thread( LPVOID arg )
00389 #endif
00390 {
00391 int err_code;
00392 mc_platform_p global = (mc_platform_p)arg;
00393 while(1) {
00394 ListRDLock(global->df->request_list);
00395 MUTEX_LOCK(global->quit_lock);
00396 while
00397 (
00398 (global->df->request_list->size <= 0) &&
00399 !global->quit
00400 )
00401 {
00402 MUTEX_UNLOCK(global->quit_lock);
00403
00404 MUTEX_LOCK(global->df->waiting_lock);
00405 global->df->waiting = 1;
00406 COND_BROADCAST(global->df->waiting_cond);
00407 MUTEX_UNLOCK(global->df->waiting_lock);
00408
00409 ListRDWait(global->df->request_list);
00410 MUTEX_LOCK(global->quit_lock);
00411 }
00412
00413 MUTEX_LOCK(global->df->waiting_lock);
00414 global->df->waiting = 0;
00415 COND_BROADCAST(global->df->waiting_cond);
00416 MUTEX_UNLOCK(global->df->waiting_lock);
00417 if
00418 (
00419 global->df->request_list->size == 0 && global->quit
00420 ) {
00421 MUTEX_UNLOCK(global->quit_lock);
00422 ListRDUnlock(global->df->request_list);
00423 THREAD_EXIT();
00424 }
00425 MUTEX_UNLOCK(global->quit_lock);
00426 ListRDUnlock(global->df->request_list);
00427 if (
00428 (err_code = df_ProcessRequest(
00429 global
00430 )) != MC_SUCCESS ) {
00431 fprintf(stderr,
00432 "Error Code %d: %s:%d\n",
00433 err_code,
00434 __FILE__,
00435 __LINE__ );
00436 }
00437 }
00438 return 0;
00439 }
00440
00441
00442
00443 int request_handler_REGISTER(struct mc_platform_s* global, void* data)
00444 {
00445
00446 return df_Add(global->df, (struct df_node_s*)data);
00447 }
00448
00449 int request_handler_SEARCH(struct mc_platform_s* global, void* data)
00450 {
00451 df_request_search_p search;
00452 search = (df_request_search_p)data;
00453 df_SearchForService(
00454 global->df,
00455 search->search_string,
00456 &search->search_results->agent_names,
00457 &search->search_results->service_names,
00458 &search->search_results->agent_ids,
00459 &search->search_results->num_results
00460 );
00461 SIGNAL(search->cond,
00462 search->lock,
00463 NULL
00464 );
00465 return MC_SUCCESS;
00466 }
00467
00468 int request_handler_SUBSCRIBE(struct mc_platform_s* global, void* data)
00469 {
00470 return 0;
00471 }
00472
00473 int request_handler_DEREGISTER(struct mc_platform_s* global, void* data)
00474 {
00475 int i, j;
00476 df_deregister_p deregister;
00477 listNode_p node;
00478 df_node_p df_node;
00479 int num_deregistered=0;
00480 df_p df = global->df;
00481 deregister = (df_deregister_p)data;
00482
00483 MUTEX_LOCK(df->lock);
00484 if (df->service_list->listhead== NULL) {
00485 MUTEX_UNLOCK(df->lock);
00486 return 0;
00487 }
00488 node = df->service_list->listhead;
00489 while (node != NULL) {
00490 df_node = (df_node_p)node->node_data;
00491 if (df_node->agent_id == deregister->agent_id) {
00492 for (i = 0; i < df_node->num_services; i++) {
00493 if (!strcmp(
00494 df_node->service_names[i],
00495 deregister->service_name
00496 )
00497 )
00498 {
00499 free(df_node->service_names[i]);
00500 for (j = i; j < df_node->num_services-1; j++) {
00501 df_node->service_names[j] = df_node->service_names[j+1];
00502 }
00503 df_node->num_services--;
00504 num_deregistered++;
00505
00506 if (df_node->num_services == 0) {
00507
00508
00509 }
00510 }
00511 }
00512 }
00513 node = node->next;
00514 }
00515 MUTEX_UNLOCK(df->lock);
00516 return MC_SUCCESS;
00517 }