15
15
#define MIMETYPE_JSON " application/json; charset=utf-8"
16
16
17
17
// auto generated files (see README.md for details)
18
- #include " index.html.gz.hpp "
19
- #include " loading.html.hpp "
18
+ #include < signal.h >
19
+ #include < unistd.h >
20
20
21
21
#include < atomic>
22
22
#include < chrono>
23
+ #include < cinttypes>
23
24
#include < condition_variable>
24
25
#include < cstddef>
25
- #include < cinttypes>
26
26
#include < deque>
27
27
#include < memory>
28
28
#include < mutex>
29
- #include < signal.h>
30
29
#include < thread>
31
30
#include < unordered_map>
32
31
#include < unordered_set>
33
32
33
+ #include " index.html.gz.hpp"
34
+ #include " loading.html.hpp"
35
+
36
+ #ifdef _WIN32
37
+ #include < process.h>
38
+ #define getpid _getpid
39
+ #endif
40
+
34
41
using json = nlohmann::ordered_json;
35
42
36
43
constexpr int HTTP_POLLING_SECONDS = 1 ;
@@ -3691,6 +3698,68 @@ inline void signal_handler(int signal) {
3691
3698
shutdown_handler (signal);
3692
3699
}
3693
3700
3701
+ static bool check_pid_alive (const pid_t pid) {
3702
+ return pid > 0 && !kill (pid, 0 );
3703
+ }
3704
+
3705
+ class PidFile {
3706
+ public:
3707
+ FILE * file = nullptr ;
3708
+ std::string fname;
3709
+ bool rm = false ;
3710
+
3711
+ FILE * open (const std::string & filename, const char * mode, const bool r = false ) {
3712
+ file = ggml_fopen (filename.c_str (), mode);
3713
+ fname = filename;
3714
+ rm = r;
3715
+
3716
+ return file;
3717
+ }
3718
+
3719
+ void close () {
3720
+ fclose (file);
3721
+ file = nullptr ;
3722
+
3723
+ if (rm) {
3724
+ // Remove stale pidfil
3725
+ unlink (fname.c_str ());
3726
+ }
3727
+ }
3728
+
3729
+ ~PidFile () {
3730
+ if (file) {
3731
+ close ();
3732
+ }
3733
+ }
3734
+ };
3735
+
3736
+ static bool is_old_pid_alive (const std::string & filename) {
3737
+ pid_t oldpid = 0 ;
3738
+ PidFile f;
3739
+ if (f.open (filename, " r" )) {
3740
+ if (fscanf (f.file , " %d" , &oldpid) == 1 ) {
3741
+ if (check_pid_alive (oldpid)) {
3742
+ LOG_ERR (" Process already running with PID %d\n " , oldpid);
3743
+ return true ;
3744
+ }
3745
+ }
3746
+ }
3747
+
3748
+ return false ;
3749
+ }
3750
+
3751
+ static int create_pidfile (const std::string & pidfile, PidFile & f) {
3752
+ if (!f.open (pidfile.c_str (), " w" , true )) {
3753
+ LOG_ERR (" Unable to open pidfile %s: %s\n " , pidfile.c_str (), strerror (errno));
3754
+ return -1 ;
3755
+ }
3756
+
3757
+ fprintf (f.file , " %d\n " , getpid ());
3758
+ fflush (f.file );
3759
+
3760
+ return 0 ;
3761
+ }
3762
+
3694
3763
int main (int argc, char ** argv) {
3695
3764
// own arguments required by this example
3696
3765
common_params params;
@@ -3699,6 +3768,13 @@ int main(int argc, char ** argv) {
3699
3768
return 1 ;
3700
3769
}
3701
3770
3771
+ PidFile f;
3772
+ if (!params.pidfile .empty ()) {
3773
+ if (is_old_pid_alive (params.pidfile ) || create_pidfile (params.pidfile , f)) {
3774
+ return 1 ;
3775
+ }
3776
+ }
3777
+
3702
3778
common_init ();
3703
3779
3704
3780
// struct that contains llama context and inference
0 commit comments