Commit 2db930f17fc683e2b78b38d19f813c6a95c88529
1 parent
3c059582
Exists in
master
and in
5 other branches
Issue #2 - Ajustando timer HLLAPI
Modificando processo de IPC para permitir a configuração do tempo de espera pela PIPE e mudar o default para 1 segundo evitando a grande demora quando o aplicativo principal não está disponível.
Showing
5 changed files
with
78 additions
and
30 deletions
Show diff stats
src/classlib/remote.cc
| ... | ... | @@ -408,6 +408,34 @@ |
| 408 | 408 | } |
| 409 | 409 | #endif // HAVE_DBUS |
| 410 | 410 | |
| 411 | +#if defined(WIN32) | |
| 412 | + | |
| 413 | + static string getRegistryKey(const char *name) throw (std::exception) | |
| 414 | + { | |
| 415 | + char buffer[4096]; | |
| 416 | + HKEY hKey = 0; | |
| 417 | + unsigned long datalen = sizeof(buffer); | |
| 418 | + | |
| 419 | + *buffer = 0; | |
| 420 | + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\pw3270",0,KEY_QUERY_VALUE,&hKey) != ERROR_SUCCESS) | |
| 421 | + { | |
| 422 | + throw exception("Can't open key %s","HKLM\\Software\\pw3270"); | |
| 423 | + } | |
| 424 | + else | |
| 425 | + { | |
| 426 | + unsigned long datatype; // #defined in winnt.h (predefined types 0-11) | |
| 427 | + | |
| 428 | + if(RegQueryValueExA(hKey,name,NULL,&datatype,(LPBYTE) buffer,&datalen) != ERROR_SUCCESS) | |
| 429 | + *buffer = 0; | |
| 430 | + RegCloseKey(hKey); | |
| 431 | + } | |
| 432 | + | |
| 433 | + return string(buffer); | |
| 434 | + | |
| 435 | + } | |
| 436 | + | |
| 437 | +#endif // defined | |
| 438 | + | |
| 411 | 439 | remote(const char *session) throw (std::exception) |
| 412 | 440 | { |
| 413 | 441 | #if defined(WIN32) |
| ... | ... | @@ -415,51 +443,36 @@ |
| 415 | 443 | char buffer[4096]; |
| 416 | 444 | char * str; |
| 417 | 445 | char * ptr; |
| 418 | - time_t timer; | |
| 446 | + time_t timer = time(0)+1; | |
| 419 | 447 | |
| 420 | 448 | hPipe = INVALID_HANDLE_VALUE; |
| 421 | 449 | |
| 422 | 450 | if(strcasecmp(session,"start") == 0 || strcasecmp(session,"new") == 0) |
| 423 | 451 | { |
| 424 | 452 | // Start a new session |
| 453 | + string appName = getRegistryKey("appName"); | |
| 425 | 454 | char buffer[80]; |
| 426 | - char appName[4096]; | |
| 427 | - HKEY hKey = 0; | |
| 428 | - unsigned long datalen = 4096; | |
| 429 | 455 | STARTUPINFO si; |
| 430 | 456 | PROCESS_INFORMATION pi; |
| 431 | 457 | |
| 432 | 458 | // Get application path |
| 433 | - *appName = 0; | |
| 434 | - if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\pw3270",0,KEY_QUERY_VALUE,&hKey) != ERROR_SUCCESS) | |
| 435 | - { | |
| 436 | - throw exception("Can't open key %s","HKLM\\Software\\pw3270"); | |
| 437 | - return; | |
| 438 | - } | |
| 439 | - else | |
| 440 | - { | |
| 441 | - unsigned long datatype; // #defined in winnt.h (predefined types 0-11) | |
| 442 | - if(RegQueryValueExA(hKey,"appName",NULL,&datatype,(LPBYTE) appName,&datalen) != ERROR_SUCCESS) | |
| 443 | - *appName = 0; | |
| 444 | - RegCloseKey(hKey); | |
| 445 | - } | |
| 446 | 459 | |
| 447 | - if(!*appName) | |
| 460 | + if(!appName.size()) | |
| 448 | 461 | { |
| 449 | 462 | throw exception("key %s\\appName is invalid","HKLM\\Software\\pw3270"); |
| 450 | 463 | return; |
| 451 | 464 | } |
| 452 | 465 | |
| 453 | - trace("%s appname=%s\n",__FUNCTION__,appName); | |
| 466 | + trace("%s appname=%s\n",__FUNCTION__,appName.c_str()); | |
| 454 | 467 | |
| 455 | - snprintf(buffer,79,"%s --session=\"H%06d\"",appName,getpid()); | |
| 468 | + snprintf(buffer,79,"%s --session=\"H%06d\"",appName.c_str(),getpid()); | |
| 456 | 469 | |
| 457 | 470 | ZeroMemory( &si, sizeof(si) ); |
| 458 | 471 | si.cb = sizeof(si); |
| 459 | 472 | ZeroMemory( &pi, sizeof(pi) ); |
| 460 | 473 | |
| 461 | 474 | // si.dwFlags = STARTF_PREVENTPINNING; |
| 462 | - trace("App: %s",appName); | |
| 475 | + trace("App: %s",appName.c_str()); | |
| 463 | 476 | trace("CmdLine: %s",buffer); |
| 464 | 477 | |
| 465 | 478 | if(CreateProcess(NULL,buffer,NULL,NULL,0,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi)) |
| ... | ... | @@ -469,13 +482,16 @@ |
| 469 | 482 | } |
| 470 | 483 | else |
| 471 | 484 | { |
| 472 | - throw exception("Can't start %s",appName); | |
| 485 | + throw exception("Can't start %s",appName.c_str()); | |
| 473 | 486 | return; |
| 474 | 487 | } |
| 475 | 488 | |
| 476 | 489 | snprintf(buffer,4095,"H%06d_a",getpid()); |
| 477 | 490 | str = strdup(buffer); |
| 478 | 491 | |
| 492 | + // Até 20 segundos para o processo iniciar. | |
| 493 | + timer = time(0)+20; | |
| 494 | + | |
| 479 | 495 | } |
| 480 | 496 | else |
| 481 | 497 | { |
| ... | ... | @@ -490,6 +506,15 @@ |
| 490 | 506 | else |
| 491 | 507 | *ptr = tolower(*ptr); |
| 492 | 508 | } |
| 509 | + | |
| 510 | + // Wait? | |
| 511 | + int delay = atoi(getRegistryKey("hllapiWait").c_str()); | |
| 512 | + | |
| 513 | + if(delay) { | |
| 514 | + timer = time(0) + delay; | |
| 515 | + } | |
| 516 | + | |
| 517 | + | |
| 493 | 518 | } |
| 494 | 519 | |
| 495 | 520 | snprintf(buffer,4095,"\\\\.\\pipe\\%s",str); |
| ... | ... | @@ -502,11 +527,11 @@ |
| 502 | 527 | |
| 503 | 528 | if(hPipe == INVALID_HANDLE_VALUE) |
| 504 | 529 | { |
| 505 | - timer = time(0)+20; | |
| 530 | + // Cant get session, wait. | |
| 506 | 531 | while(hPipe == INVALID_HANDLE_VALUE && time(0) < timer) |
| 507 | 532 | { |
| 508 | 533 | hPipe = CreateFile(buffer,GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); |
| 509 | - Sleep(10); | |
| 534 | + Sleep(1); | |
| 510 | 535 | } |
| 511 | 536 | } |
| 512 | 537 | ... | ... |
src/include/pw3270/hllapi.h
| ... | ... | @@ -33,6 +33,7 @@ |
| 33 | 33 | |
| 34 | 34 | #define HLLAPI_H_INCLUDED 1 |
| 35 | 35 | #include <lib3270.h> |
| 36 | + #include <stdint.h> | |
| 36 | 37 | |
| 37 | 38 | #ifdef __cplusplus |
| 38 | 39 | extern "C" { |
| ... | ... | @@ -101,12 +102,21 @@ extern "C" { |
| 101 | 102 | |
| 102 | 103 | #define HLLAPI_STATUS_WAITING HLLAPI_STATUS_TIMEOUT |
| 103 | 104 | |
| 104 | - #ifdef WIN32 | |
| 105 | + #if defined(WIN32) | |
| 106 | + | |
| 105 | 107 | #include <windows.h> |
| 106 | 108 | |
| 107 | 109 | // http://www.mingw.org/wiki/Visual_Basic_DLL |
| 108 | 110 | #define HLLAPI_API_CALL __declspec (dllexport) DWORD __stdcall |
| 109 | 111 | |
| 112 | + #else | |
| 113 | + | |
| 114 | + #define HLLAPI_API_CALL __attribute__((visibility("default"))) extern | |
| 115 | + #define WORD uint32_t | |
| 116 | + #define LPWORD uint32_t * | |
| 117 | + #define LPSTR char * | |
| 118 | + #define HANDLE int | |
| 119 | + | |
| 110 | 120 | #endif // WIN32 |
| 111 | 121 | |
| 112 | 122 | HLLAPI_API_CALL hllapi(const LPWORD func, LPSTR str, LPWORD length, LPWORD rc); | ... | ... |
src/plugins/hllapi/Makefile.in
| ... | ... | @@ -29,7 +29,7 @@ |
| 29 | 29 | #---[ Sources ]---------------------------------------------------------------- |
| 30 | 30 | |
| 31 | 31 | MODULE_NAME=hllapi |
| 32 | -DEPENDS=*.h ../../include/*.h ../../include/lib3270/*.h Makefile | |
| 32 | +DEPENDS=*.h ../../include/*.h ../../include/lib3270/*.h Makefile ../../classlib/*.cc | |
| 33 | 33 | PLUGIN_SRC=pluginmain.c |
| 34 | 34 | EXTAPI_SRC=calls.c hllapi.c |
| 35 | 35 | |
| ... | ... | @@ -64,5 +64,11 @@ $(BINDBG)/$(PLUGIN_NAME): $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJDBG)/$( |
| 64 | 64 | $(BINDBG)$(DLL_NAME).$(VERSION): $(foreach SRC, $(basename $(EXTAPI_SRC)), $(OBJDBG)/$(SRC)@OBJEXT@) $(CLASS_DEBUG_OBJECTS) |
| 65 | 65 | @echo " CCLD `basename $@`" |
| 66 | 66 | @$(MKDIR) `dirname $@` |
| 67 | - @$(CXX) $(SYSDLL_FLAGS) $(LDFLAGS) @LDSOFLAGS@ @DBGRPATH@ -o $@ $^ $(CLASS_LIBS) | |
| 67 | + @$(CXX) $(SYSDLL_FLAGS) $(LDFLAGS) @LDSOFLAGS@ @DBGRPATH@ -L../../../.bin/Debug -o $@ $^ $(CLASS_LIBS) | |
| 68 | 68 | |
| 69 | +test: $(BINDBG)/test@EXEEXT@ | |
| 70 | + | |
| 71 | +$(BINDBG)/test@EXEEXT@: $(BINDBG)$(DLL_NAME).$(VERSION) $(OBJDBG)/testprogram.o | |
| 72 | + @echo " CCLD `basename $@`" | |
| 73 | + @$(MKDIR) `dirname $@` | |
| 74 | + @$(LD) -o $@ $^ $(LIBS) $(BINDBG)$(DLL_NAME).$(VERSION) | ... | ... |
src/plugins/hllapi/hllapi.cbp
| ... | ... | @@ -62,6 +62,12 @@ |
| 62 | 62 | <Compiler> |
| 63 | 63 | <Add option="-Wall" /> |
| 64 | 64 | </Compiler> |
| 65 | + <Unit filename="../../classlib/exception.cc" /> | |
| 66 | + <Unit filename="../../classlib/local.cc" /> | |
| 67 | + <Unit filename="../../classlib/module.cc" /> | |
| 68 | + <Unit filename="../../classlib/remote.cc" /> | |
| 69 | + <Unit filename="../../classlib/session.cc" /> | |
| 70 | + <Unit filename="../../include/lib3270.h" /> | |
| 65 | 71 | <Unit filename="Makefile.in" /> |
| 66 | 72 | <Unit filename="calls.cc" /> |
| 67 | 73 | <Unit filename="client.h" /> |
| ... | ... | @@ -71,9 +77,6 @@ |
| 71 | 77 | <Unit filename="pluginmain.c"> |
| 72 | 78 | <Option compilerVar="CC" /> |
| 73 | 79 | </Unit> |
| 74 | - <Unit filename="remote.c"> | |
| 75 | - <Option compilerVar="CC" /> | |
| 76 | - </Unit> | |
| 77 | 80 | <Unit filename="remotectl.h" /> |
| 78 | 81 | <Unit filename="server.h" /> |
| 79 | 82 | <Unit filename="testprogram.c"> | ... | ... |
src/plugins/hllapi/pluginmain.c