1#include <stdio.h> 2#include <signal.h> 3#include <unistd.h> 4#include <Application.h> 5 6static thread_id gBAppThreadID; 7static thread_id gMainThreadID; 8static int bapp_ref_count = 0; 9 10static int32 11bapp_quit_thread(void *arg) 12{ 13 printf("%s: calling Lock()\n", __FUNCTION__); 14 be_app->Lock(); 15 printf("%s: calling Quit()\n", __FUNCTION__); 16 be_app->Quit(); 17 return 0; 18} 19 20 21static void 22sighandler(int sig) 23{ 24 resume_thread(spawn_thread(bapp_quit_thread, "BApplication->Quit()", B_NORMAL_PRIORITY, NULL)); 25} 26 27 28static int32 29bapp_thread(void *arg) 30{ 31 signal(SIGINT, sighandler); /* on ^C exit the bapp_thread too */ 32 printf("%s: calling Lock()\n", __FUNCTION__); 33 be_app->Lock(); 34 printf("%s: calling Run()\n", __FUNCTION__); 35 be_app->Run(); 36 printf("%s: exitting...\n", __FUNCTION__); 37 return 0; 38} 39 40 41void 42beos_launch_bapplication(void) 43{ 44 bapp_ref_count++; 45 if (be_app) 46 return; /* done already! */ 47 new BApplication("application/x-vnd.mmu_man-threaded-BApp-test"); 48 gBAppThreadID = spawn_thread(bapp_thread, "BApplication(test)", B_NORMAL_PRIORITY, (void *)find_thread(NULL)); 49 if (gBAppThreadID < B_OK) 50 return; /* #### handle errors */ 51 if (resume_thread(gBAppThreadID) < B_OK) 52 return; 53 // This way we ensure we don't create BWindows before be_app is created 54 // (creating it in the thread doesn't ensure this) 55 printf("%s: calling Unlock()\n", __FUNCTION__); 56 be_app->Unlock(); 57} 58 59 60void beos_uninit_bapplication(void) 61{ 62 status_t err; 63 if (--bapp_ref_count) 64 return; 65 if (!be_app->Lock()) 66 debugger("cannot lock BApp!"); 67 printf("%s: calling Quit()\n", __FUNCTION__); 68 be_app->Quit(); 69 printf("%s: waiting for app thread\n", __FUNCTION__); 70 wait_for_thread(gBAppThreadID, &err); 71 delete be_app; 72 be_app = NULL; 73} 74 75 76int main() 77{ 78 printf("%s: calling beos_launch_bapplication()\n", __FUNCTION__); 79 beos_launch_bapplication(); 80 sleep(10); 81 printf("%s: calling beos_uninit_bapplication()\n", __FUNCTION__); 82 beos_uninit_bapplication(); 83} 84