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,72 @@ 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
+ if (pid > 0 && kill (pid, 0 ) == 0 ) {
3703
+ return true ;
3704
+ }
3705
+
3706
+ return false ;
3707
+ }
3708
+
3709
+ class File {
3710
+ public:
3711
+ FILE * file = nullptr ;
3712
+ std::string fname;
3713
+ bool rm = false ;
3714
+
3715
+ FILE * open (const std::string & filename, const char * mode, const bool r = false ) {
3716
+ file = ggml_fopen (filename.c_str (), mode);
3717
+ fname = filename;
3718
+ rm = r;
3719
+
3720
+ return file;
3721
+ }
3722
+
3723
+ void close () {
3724
+ fclose (file);
3725
+ file = nullptr ;
3726
+
3727
+ if (rm) {
3728
+ // Remove stale pidfil
3729
+ unlink (fname.c_str ());
3730
+ }
3731
+ }
3732
+
3733
+ ~File () {
3734
+ if (file) {
3735
+ close ();
3736
+ }
3737
+ }
3738
+ };
3739
+
3740
+ static bool is_old_pid_alive (const std::string & filename) {
3741
+ pid_t oldpid = 0 ;
3742
+ File f;
3743
+ if (f.open (filename, " r" )) {
3744
+ if (fscanf (f.file , " %d" , &oldpid) == 1 ) {
3745
+ if (check_pid_alive (oldpid)) {
3746
+ LOG_ERR (" Process already running with PID %d\n " , oldpid);
3747
+ return true ;
3748
+ }
3749
+ }
3750
+ }
3751
+
3752
+ return false ;
3753
+ }
3754
+
3755
+ static int create_pidfile (const std::string & pidfile, File & f) {
3756
+ if (!f.open (pidfile.c_str (), " w" , true )) {
3757
+ LOG_ERR (" Unable to open pidfile %s: %s\n " , pidfile.c_str (), strerror (errno));
3758
+ return -1 ;
3759
+ }
3760
+
3761
+ fprintf (f.file , " %d\n " , getpid ());
3762
+ fflush (f.file );
3763
+
3764
+ return 0 ;
3765
+ }
3766
+
3694
3767
int main (int argc, char ** argv) {
3695
3768
// own arguments required by this example
3696
3769
common_params params;
@@ -3699,6 +3772,13 @@ int main(int argc, char ** argv) {
3699
3772
return 1 ;
3700
3773
}
3701
3774
3775
+ File f;
3776
+ if (!params.pidfile .empty ()) {
3777
+ if (is_old_pid_alive (params.pidfile ) || create_pidfile (params.pidfile , f)) {
3778
+ return 1 ;
3779
+ }
3780
+ }
3781
+
3702
3782
common_init ();
3703
3783
3704
3784
// struct that contains llama context and inference
0 commit comments