-BC_SynchGarbage::BC_SynchGarbage(BC_Synchronous *synchronous)
- : Thread(1, 0, 0)
-{
- this->synchronous = synchronous;
- more_garbage = new Condition(0, "BC_SynchGarbage::more_garbage", 0);
- garbage_lock = new Mutex("BC_SyncGarbage::garbage_lock");
- done = -1;
-}
-
-BC_SynchGarbage::~BC_SynchGarbage()
-{
- if( running() ) {
- quit();
- join();
- }
- garbage.remove_all_objects();
- delete more_garbage;
- delete garbage_lock;
-}
-
-void BC_SynchGarbage::send_garbage(BC_SynchronousCommand *command)
-{
- garbage_lock->lock("BC_SynchGarbage::send_garbage");
- garbage.append(command);
- garbage_lock->unlock();
- more_garbage->unlock();
-}
-
-void BC_SynchGarbage::handle_garbage()
-{
- garbage_lock->lock("BC_SynchGarbage::handle_garbage 0");
- while( !done && garbage.total ) {
- BC_SynchronousCommand *command = garbage.get(0);
- garbage.remove_number(0);
- garbage_lock->unlock();
-
- switch(command->command) {
- case BC_SynchronousCommand::QUIT:
- done = 1;
- break;
-
- case BC_SynchronousCommand::DELETE_WINDOW:
- synchronous->delete_window_sync(command);
- break;
-
- case BC_SynchronousCommand::DELETE_PIXMAP:
- synchronous->delete_pixmap_sync(command);
- break;
-
- case BC_SynchronousCommand::DELETE_DISPLAY:
- synchronous->delete_display_sync(command);
- break;
- }
-
- delete command;
- garbage_lock->lock("BC_SynchGarbage::handle_garbage 1");
- }
- garbage_lock->unlock();
-}
-
-
-void BC_SynchGarbage::start()
-{
- done = 0;
- Thread::start();
-}
-
-void BC_SynchGarbage::stop()
-{
- if( running() ) {
- quit();
- join();
- }
-}
-
-void BC_SynchGarbage::quit()
-{
- BC_SynchronousCommand *command = new BC_SynchronousCommand();
- command->command = BC_SynchronousCommand::QUIT;
- send_garbage(command);
-}
-
-void BC_SynchGarbage::run()
-{
- while( !done ) {
- more_garbage->lock("BC_SynchGarbage::run");
- handle_garbage();
- }
-}
-
-