FILEMONITOR_PROC( void, EndMonitor )( PMONITOR monitor ) { if( !monitor ) return; if( monitor->flags.bDispatched || monitor->flags.bScanning ) { monitor->flags.bEnd = 1; return; } if( monitor->flags.bClosing ) { if( l.flags.bLog ) Log( WIDE("Monitor already closing...") ); return; } EnterCriticalSec( &monitor->cs ); monitor->flags.bClosing = 1; monitor->flags.bRemoveFromEvents = 1; if( !monitor->flags.bRemovedFromEvents ) { SetEvent( l.hMonitorThreadControlEvent ); while( !monitor->flags.bRemovedFromEvents ) Relinquish(); } //Log1( WIDE("Closing the monitor on %s and killing thread...") // , monitor->directory ); if( monitor->hChange != INVALID_HANDLE_VALUE ) { lprintf( WIDE( "close ntoification (wakes thread?" ) ); FindCloseChangeNotification( monitor->hChange ); lprintf( WIDE( "and then we wait..." ) ); } monitor->hChange = INVALID_HANDLE_VALUE; { uint32_t tick = timeGetTime(); while( monitor->pThread && ( ( tick+50 ) > timeGetTime() ) ) Relinquish(); } if( monitor->pThread ) { EndThread( monitor->pThread ); } //else // Log( WIDE("Thread already left...") ); CloseFileMonitors( monitor ); RemoveTimer( monitor->timer ); UnlinkThing( monitor ); LeaveCriticalSec( &monitor->cs ); Release( monitor ); }
static void CPROC MoveElementRemove( uintptr_t psv, PSI_CONTROL control ) { PMACRO_BUTTON button = (PMACRO_BUTTON)psv; PSI_CONTROL list = GetNearControl( control, LIST_MACRO_ELEMENTS ); PLISTITEM pli = GetSelectedItem( list ); PMACRO_ELEMENT pme = (PMACRO_ELEMENT)GetItemData( pli ); if( pme ) { DeleteListItem( list, pli ); UnlinkThing( pme ); DestroyButton( pme->button ); Release( pme ); FillList( list, button ); } }
static void CPROC MoveElementDown( uintptr_t psv, PSI_CONTROL control ) { PMACRO_BUTTON button = (PMACRO_BUTTON)psv; PSI_CONTROL list = GetNearControl( control, LIST_MACRO_ELEMENTS ); PLISTITEM pli = GetSelectedItem( list ); PMACRO_ELEMENT pme = (PMACRO_ELEMENT)GetItemData( pli ); if( pme ) { PMACRO_ELEMENT _next = NextThing( pme ); if( (uintptr_t)&pme->next != (uintptr_t)pme ) { lprintf( WIDE( "Failure, structure definition does not have DeclareLink() as first member." ) ); DebugBreak(); } if( _next && pme ) { UnlinkThing( pme ); LinkThingAfter( _next, pme ); FillList( list, button ); } } }
CLIENTMSG_PROC( void, UnloadService )( CTEXTSTR name ) { PEVENTHANDLER pHandler; pHandler = g.pHandlers; while( pHandler ) { if( StrCaseCmp( pHandler->servicename, name ) == 0 ) break; pHandler = pHandler->next; } if( pHandler ) { MSGIDTYPE Responce; //lprintf( WIDE("Unload service: %s"), pHandler->servicename ); if( pHandler->flags.local_service ) { //lprintf( WIDE("Local service... resulting quick success...") ); Responce = (MSG_ServiceUnload)|SERVER_SUCCESS; } else { //lprintf( WIDE("Requesting message %d from %d "), MSG_ServiceUnload , pHandler->MsgBase ); Responce = ((MSG_ServiceUnload)|SERVER_SUCCESS); if( !TransactServerMessage( &pHandler->RouteID , MSG_ServiceUnload, NULL, 0 , &Responce/*NULL*/, NULL, 0 ) ) { lprintf( WIDE("Transaction to ServiceUnload failed...") ); } else if( Responce != ((MSG_ServiceUnload)|SERVER_SUCCESS) ) { lprintf( WIDE("Server reports it failed to unload the service %08") _MsgID_f WIDE(" %08") _MsgID_f WIDE("") , Responce, (MSGIDTYPE)((MSG_ServiceUnload)|SERVER_SUCCESS) ); // no matter what the result, this must still release this // resource.... //return; } while( pHandler->flags.dispatched ) { Relinquish(); } } UnlinkThing( pHandler ); //lprintf( WIDE("Release? wow release hangs forever?") ); //Release( pHandler ); if( 0 && !g.pHandlers ) { Log( WIDE("No more services loaded - killing threads, disconnecting") ); if( g.pLocalEventThread ) { EndThread( g.pLocalEventThread ); // wake up the thread... } if( g.pEventThread ) EndThread( g.pEventThread ); if( g.pThread ) EndThread( g.pThread ); CloseMessageQueues(); g.flags.events_ready = 0; g.flags.local_events_ready = 0; g.flags.failed = 0; g.flags.message_handler_ready = 0; g.flags.message_responce_handler_ready = 0; } //Log( WIDE("Done unloading services...") ); return; } Log( WIDE("Service was already Unloaded!?!?!?!?!?") ); }