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