Browse Source

Add basic file locking

Needs test
Leo 10 years ago
parent
commit
edcfb28e98
5 changed files with 71 additions and 1 deletions
  1. 2 0
      CHANGELOG.md
  2. 2 1
      TODO.md
  3. 3 0
      src/default.ml
  4. 2 0
      src/exec_cmd.ml
  5. 62 0
      src/lock.ml

+ 2 - 0
CHANGELOG.md

@@ -8,6 +8,8 @@
  + Code clean up (Types in records) and code factoring.
  + When all has been launched, the program explain how to reset.
  + Better messages on initialisation.
+ + Locking tmp file to prevent launching two times the same item (**not tested
+   enough**)
 
 ## v0.2.0
  + Add new command line option.

+ 2 - 1
TODO.md

@@ -11,10 +11,11 @@
 
 ## Major issue
  + Make multiple tmp file really working by using checksum for rc file.
+ + Test locking of tmp file
 
 ## Short term
  + Use a dedicated module, for user messages. Allow to print in color and to set
-   verbsity level (maybe also script output, in JSON format)
+   verbosity level (maybe also script output, in JSON format)
 
 ### Configuration value
  + Make displaying command before launching configurable

+ 3 - 0
src/default.ml

@@ -42,6 +42,9 @@ open Core.Std;;
 (* cmd_number is the number of the command the user wants
  * to execute *)
 let run ~rc:rc_content cmd_number =
+  (* Wait for another oclaunch instance which could launch the same program at
+   * the same time *)
+  Lock.wait ();
   match cmd_number with
     | None -> begin
         (* Execute each item (one by one) in config file *)

+ 2 - 0
src/exec_cmd.ml

@@ -81,6 +81,8 @@ let execute ?(display=true) cmd =
     Tmp_file.log ~func:((+) 1) ();
     if display then
         print_endline cmd;
+    (* We can remove lock file since number in tmp_file has been incremented *)
+    Lock.remove ();
     Sys.command cmd
     |> display_result cmd (* Make it settable in rc file *)
 ;;

+ 62 - 0
src/lock.ml

@@ -0,0 +1,62 @@
+(******************************************************************************)
+(* Copyright © Joly Clément, 2014-2015                                        *)
+(*                                                                            *)
+(*  leowzukw@vmail.me                                                         *)
+(*                                                                            *)
+(*  Ce logiciel est un programme informatique servant à exécuter              *)
+(*  automatiquement des programmes à l'ouverture du terminal.                 *)
+(*                                                                            *)
+(*  Ce logiciel est régi par la licence CeCILL soumise au droit français et   *)
+(*  respectant les principes de diffusion des logiciels libres. Vous pouvez   *)
+(*  utiliser, modifier et/ou redistribuer ce programme sous les conditions    *)
+(*  de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA    *)
+(*  sur le site "http://www.cecill.info".                                     *)
+(*                                                                            *)
+(*  En contrepartie de l'accessibilité au code source et des droits de copie, *)
+(*  de modification et de redistribution accordés par cette licence, il n'est *)
+(*  offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons, *)
+(*  seule une responsabilité restreinte pèse sur l'auteur du programme,  le   *)
+(*  titulaire des droits patrimoniaux et les concédants successifs.           *)
+(*                                                                            *)
+(*  A cet égard  l'attention de l'utilisateur est attirée sur les risques     *)
+(*  associés au chargement,  à l'utilisation,  à la modification et/ou au     *)
+(*  développement et à la reproduction du logiciel par l'utilisateur étant    *)
+(*  donné sa spécificité de logiciel libre, qui peut le rendre complexe à     *)
+(*  manipuler et qui le réserve donc à des développeurs et des professionnels *)
+(*  avertis possédant  des  connaissances  informatiques approfondies.  Les   *)
+(*  utilisateurs sont donc invités à charger  et  tester  l'adéquation  du    *)
+(*  logiciel à leurs besoins dans des conditions permettant d'assurer la      *)
+(*  sécurité de leurs systèmes et ou de leurs données et, plus généralement,  *)
+(*  à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.        *)
+(*                                                                            *)
+(*  Le fait que vous puissiez accéder à cet en-tête signifie que vous avez    *)
+(*  pris connaissance de la licence CeCILL, et que vous en avez accepté les   *)
+(*  termes.                                                                   *)
+(******************************************************************************)
+
+open Core.Std;;
+
+(* Module to mange locking, when another instance of OcLaunch is running *)
+
+(* Name of the lock file *)
+(* TODO Put it in Const *)
+let lock_name = "/tmp/.ocl.lock";;
+
+(* Create lock file *)
+let lock () =
+    (* XXX Verify if file exists ? *)
+    Out_channel.write_all lock_name ~data:"OcLaunch is running and did not finish."
+;;
+
+(* Pause the program until lock file is removed, until argument is in second *)
+let rec wait ?(until=10) ?(delay=1) () =
+    match Sys.file_exists lock_name with
+     `Yes -> Unix.sleep delay; wait ()
+    | `No -> lock ()
+    | `Unknown -> failwith "Problem with lock file"
+;;
+
+(* Remove the lock file *)
+let remove () =
+    Sys.remove lock_name
+;;