r510 - trunk/src/target/OM-2007/applications/openmoko-appmanager/src
caowai_song at gta01.hmw-consulting.de
caowai_song at gta01.hmw-consulting.de
Mon Jan 8 02:40:49 CET 2007
Author: caowai_song
Date: 2007-01-08 02:40:40 +0100 (Mon, 08 Jan 2007)
New Revision: 510
Modified:
trunk/src/target/OM-2007/applications/openmoko-appmanager/src/appmanager-window.c
Log:
Add a file lock to ensure the openmoko-appmanager only run an instance.
But there is a bug.
At the c99, the function "kill" is unreachable. And the result
is unstable, it should be modify in the feature.
Modified: trunk/src/target/OM-2007/applications/openmoko-appmanager/src/appmanager-window.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-appmanager/src/appmanager-window.c 2007-01-05 07:59:29 UTC (rev 509)
+++ trunk/src/target/OM-2007/applications/openmoko-appmanager/src/appmanager-window.c 2007-01-08 01:40:40 UTC (rev 510)
@@ -18,6 +18,12 @@
* @author Chaowei Song (songcw at fic-sh.com.cn)
*/
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <signal.h>
+
#include <libmokoui/moko-application.h>
#include <libmokoui/moko-paned-window.h>
#include <libmokoui/moko-tool-box.h>
@@ -35,6 +41,81 @@
#include "package-list.h"
#include "select-menu.h"
+static GtkWidget* mainwindow = NULL;
+
+static void
+handle_sigusr1 (int value)
+{
+ if (mainwindow == NULL)
+ {
+ return;
+ }
+ gtk_window_present (GTK_WINDOW (mainwindow));
+}
+
+static pid_t
+testlock (char *fname)
+{
+ int fd;
+ struct flock fl;
+
+ fd = open (fname, O_WRONLY, S_IWUSR);
+ if (fd < 0)
+ {
+ if (errno == ENOENT)
+ {
+ return 0;
+ }
+ else
+ {
+ perror ("Test lock open file");
+ return -1;
+ }
+ }
+
+ fl.l_type = F_WRLCK;
+ fl.l_whence = SEEK_SET;
+ fl.l_start = 0;
+ fl.l_len = 0;
+
+ if (fcntl (fd, F_GETLK, &fl) < 0)
+ {
+ close (fd);
+ return -1;
+ }
+ close (fd);
+
+ if (fl.l_type == F_UNLCK)
+ return 0;
+
+ return fl.l_pid;
+}
+
+static void
+setlock (char *fname)
+{
+ int fd;
+ struct flock fl;
+
+ fd = open (fname, O_WRONLY|O_CREAT, S_IWUSR);
+ if (fd < 0)
+ {
+ perror ("Set lock open file");
+ return ;
+ }
+
+ fl.l_type = F_WRLCK;
+ fl.l_whence = SEEK_SET;
+ fl.l_start = 0;
+ fl.l_len = 0;
+
+ if (fcntl (fd, F_SETLK, &fl) < 0)
+ {
+ perror ("Lock file");
+ close (fd);
+ }
+}
+
/**
* @brief The start function.
*/
@@ -42,7 +123,6 @@
main (int argc, char* argv[])
{
ApplicationManagerData *appdata;
- //MokoApplication *app;
MokoPanedWindow *window;
GtkMenu *appmenu;
GtkMenu *filtermenu;
@@ -52,6 +132,7 @@
GtkWidget *detail;
gint ret;
+ pid_t lockapp;
g_debug ("appplication manager start up");
@@ -61,6 +142,13 @@
{
//Add init code.
}
+ lockapp = testlock ("/tmp/appmgr.lock");
+ if (lockapp > 0)
+ {
+ kill (lockapp, SIGUSR1);
+ return 0;
+ }
+ setlock ("/tmp/appmgr.lock");
appdata = application_manager_data_new ();
if (appdata == NULL)
@@ -79,6 +167,9 @@
G_CALLBACK (gtk_main_quit), NULL);
application_manager_data_set_main_window (appdata, window);
+ // Save the main window
+ mainwindow = GTK_WIDGET(window);
+
appmenu = application_menu_new (appdata);
moko_paned_window_set_application_menu (window, appmenu);
@@ -115,6 +206,8 @@
package_list_add_section_to_filter_menu (appdata);
+ signal (SIGUSR1, handle_sigusr1);
+
gtk_widget_show_all (GTK_WIDGET (window));
g_debug ("application manager enter main loop");
gtk_main ();
More information about the commitlog
mailing list