0

I am using gRPC to communicate from a client to a server. I am using the Asynchronous Greeter example. I want the server to create a PDF file when ever the client sends a message to the server. I have a function called makefile() that will create the pdf file. I am currently calling it in the Proceed() function. Is this a good place to call it? My code works for the most part but sometimes when I send the message to the server the server doesn't make the file. For example if I try 10 times the server might only make 8 files. It should have made 10. Also can I put the makefile() function in a thread? I added the makefile() code. I am using the Libharu pdf lib.

    void Proceed() {
      if (status_ == CREATE) {
        // As part of the initial CREATE state, we *request* that the system
        // start processing SayHello requests. In this request, "this" acts are
        // the tag uniquely identifying the request (so that different CallData
        // instances can serve different requests concurrently), in this case
        // the memory address of this CallData instance.
        service_->RequestSayHello(&ctx_, &request_, &responder_, cq_, cq_,

        status_ = PROCESS;
      } else if (status_ == PROCESS) {


        new CallData(service_, cq_);

        // The actual processing.
        std::string prefix("Hello ");
        makefile() // function to make pdf file
        reply_.set_message(prefix + request_.name());

        .
        responder_.Finish(reply_, Status::OK, this);
        status_ = FINISH;
      } else {
        GPR_ASSERT(status_ == FINISH);

        delete this;
      }
    }
  }






   makefile()
    {
     const char *page_title = "Font Demo";
HPDF_Doc  pdf;
char fname[256];
HPDF_Page page;
HPDF_Font def_font;
HPDF_REAL tw;
HPDF_REAL height;
HPDF_REAL width;
HPDF_UINT i;

strcpy (fname, argv[0]);
strcat (fname, ".pdf");

pdf = HPDF_New (error_handler, NULL);
if (!pdf) {
    printf ("error: cannot create PdfDoc object\n");
    return 1;
}

if (setjmp(env)) {
    HPDF_Free (pdf);
    return 1;
}

/* Add a new page object. */
page = HPDF_AddPage (pdf);

height = HPDF_Page_GetHeight (page);
width = HPDF_Page_GetWidth (page);

/* Print the lines of the page. */
HPDF_Page_SetLineWidth (page, 1);
HPDF_Page_Rectangle (page, 50, 50, width - 100, height - 110);
HPDF_Page_Stroke (page);

/* Print the title of the page (with positioning center). */
def_font = HPDF_GetFont (pdf, "Helvetica", NULL);
HPDF_Page_SetFontAndSize (page, def_font, 24);

tw = HPDF_Page_TextWidth (page, page_title);
HPDF_Page_BeginText (page);
HPDF_Page_TextOut (page, (width - tw) / 2, height - 50, page_title);
HPDF_Page_EndText (page);

/* output subtitle. */
HPDF_Page_BeginText (page);
HPDF_Page_SetFontAndSize (page, def_font, 16);
HPDF_Page_TextOut (page, 60, height - 80, "<Standerd Type1 fonts samples>");
HPDF_Page_EndText (page);

HPDF_Page_BeginText (page);
HPDF_Page_MoveTextPos (page, 60, height - 105);

i = 0;
while (font_list[i]) {
    const char* samp_text = "abcdefgABCDEFG12345!#$%&+-@?";
    HPDF_Font font = HPDF_GetFont (pdf, font_list[i], NULL);

    /* print a label of text */
    HPDF_Page_SetFontAndSize (page, def_font, 9);
    HPDF_Page_ShowText (page, font_list[i]);
    HPDF_Page_MoveTextPos (page, 0, -18);

    /* print a sample text. */
    HPDF_Page_SetFontAndSize (page, font, 20);
    HPDF_Page_ShowText (page, samp_text);
    HPDF_Page_MoveTextPos (page, 0, -20);

    i++;
}

HPDF_Page_EndText (page);

HPDF_SaveToFile (pdf, fname);

/* clean up */
HPDF_Free (pdf);
    }
Mehrdad Afshari
  • 414,610
  • 91
  • 852
  • 789
amanda45
  • 535
  • 10
  • 29
  • You're programming in C++, so please don't add the C tag. – Some programmer dude Aug 03 '17 at 12:51
  • You seem to have a memory leak by the way: `new CallData(service_, cq_)` allocates a new object of the heap, but since you seemingly don't save a pointer to that object it can't be deleted. – Some programmer dude Aug 03 '17 at 12:52
  • @Someprogrammerdude- I didnt write this code. I took it from the grpc example from the site – amanda45 Aug 03 '17 at 12:54
  • "//The instance will deallocate itself as part of its FINISH state." For new CalldData (so that bit looks ok is what I mean). – systemcpro Aug 03 '17 at 13:12
  • Just looking at the "HandleRpcs" - the messages come in asynchronously. Is your makefile synchronized? You haven't posted the code so can only guess but am guessing a new request is coming in while your still handling previous one in "makefile()" and stomping all over it. As I say, only an intuitive guess without the source code. – systemcpro Aug 03 '17 at 13:26
  • @systemcpro- I don't think it is synchronized. makefile() will run it in the current thread. Can I thread it? – amanda45 Aug 03 '17 at 13:37
  • According to the documentation "yes" - am trying to find the exact place in the documentation where it says that but it was worded in such a way as to suggest they think you probably should. Your process appears (again without source code) to be ideal for threading since each request is totally orthogonal and they share no state. Above the function "HandleRpcs" is the comment "// This can be run in multiple threads if needed." – systemcpro Aug 03 '17 at 13:42
  • @systemcpro- I Added my makefile() code – amanda45 Aug 03 '17 at 13:46
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/150968/discussion-between-systemcpro-and-amanda45). – systemcpro Aug 03 '17 at 13:47

0 Answers0