[Beignet] [PATCH 2/5] Add a lock in the place of printf output

Zhigang Gong zhigang.gong at linux.intel.com
Thu Jun 19 02:33:37 PDT 2014


This patch LGTM, pushed, thanks.

On Wed, Jun 18, 2014 at 02:42:15PM +0800, junyan.he at inbox.com wrote:
> From: Junyan He <junyan.he at linux.intel.com>
> 
> If multi-thread run the kernel simultaneously, the output
> may interlace with each other. Add a lock to avoid this.
> 
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
>  backend/src/ir/printf.cpp |  3 +++
>  backend/src/ir/printf.hpp | 44 ++++++++++++++++++++++++++++++++++----------
>  2 files changed, 37 insertions(+), 10 deletions(-)
> 
> diff --git a/backend/src/ir/printf.cpp b/backend/src/ir/printf.cpp
> index 3729155..0a943ac 100644
> --- a/backend/src/ir/printf.cpp
> +++ b/backend/src/ir/printf.cpp
> @@ -29,6 +29,8 @@ namespace gbe
>  {
>    namespace ir
>    {
> +    pthread_mutex_t PrintfSet::lock = PTHREAD_MUTEX_INITIALIZER;
> +
>      uint32_t PrintfSet::append(PrintfFmt* fmt, Unit& unit)
>      {
>        fmts.push_back(*fmt);
> @@ -74,6 +76,7 @@ namespace gbe
>      void PrintfSet::outputPrintf(void* index_addr, void* buf_addr, size_t global_wk_sz0,
>                                   size_t global_wk_sz1, size_t global_wk_sz2)
>      {
> +      LockOutput lock;
>        size_t i, j, k;
>        std::string pf_str;
>        vector<int>* contents = NULL;
> diff --git a/backend/src/ir/printf.hpp b/backend/src/ir/printf.hpp
> index 5763a65..b49ad0d 100644
> --- a/backend/src/ir/printf.hpp
> +++ b/backend/src/ir/printf.hpp
> @@ -89,12 +89,14 @@ namespace gbe
>          void *ptr;
>        };
>  
> -      PrintfSlot(void) {
> +      PrintfSlot(void)
> +      {
>          type = PRINTF_SLOT_TYPE_NONE;
>          ptr = NULL;
>        }
>  
> -      PrintfSlot(const char * s) {
> +      PrintfSlot(const char * s)
> +      {
>          type = PRINTF_SLOT_TYPE_STRING;
>          int len = strlen(s);
>          str = (char*)malloc((len + 1) * sizeof(char));
> @@ -102,13 +104,15 @@ namespace gbe
>          str[len] = 0;
>        }
>  
> -      PrintfSlot(PrintfState * st) {
> +      PrintfSlot(PrintfState * st)
> +      {
>          type = PRINTF_SLOT_TYPE_STATE;
>          state = (PrintfState *)malloc(sizeof(PrintfState));
>          memcpy(state, st, sizeof(PrintfState));
>        }
>  
> -      PrintfSlot(const PrintfSlot & other) {
> +      PrintfSlot(const PrintfSlot & other)
> +      {
>          if (other.type == PRINTF_SLOT_TYPE_STRING) {
>            int len = strlen(other.str);
>            str = (char*)malloc((len + 1) * sizeof(char));
> @@ -125,7 +129,8 @@ namespace gbe
>          }
>        }
>  
> -      PrintfSlot(PrintfSlot && other) {
> +      PrintfSlot(PrintfSlot && other)
> +      {
>          void *p = other.ptr;
>          type = other.type;
>          other.ptr = ptr;
> @@ -133,7 +138,8 @@ namespace gbe
>  
>        }
>  
> -      ~PrintfSlot(void) {
> +      ~PrintfSlot(void)
> +      {
>          if (ptr)
>            free(ptr);
>        }
> @@ -144,7 +150,8 @@ namespace gbe
>      class PrintfSet //: public Serializable
>      {
>      public:
> -      PrintfSet(const PrintfSet& other) {
> +      PrintfSet(const PrintfSet& other)
> +      {
>          for (auto &f : other.fmts) {
>            fmts.push_back(f);
>          }
> @@ -158,18 +165,33 @@ namespace gbe
>  
>        PrintfSet(void) = default;
>  
> +      struct LockOutput {
> +        LockOutput(void)
> +        {
> +          pthread_mutex_lock(&lock);
> +        }
> +
> +        ~LockOutput(void)
> +        {
> +          pthread_mutex_unlock(&lock);
> +        }
> +      };
> +
>        typedef vector<PrintfSlot> PrintfFmt;
>        uint32_t append(PrintfFmt* fmt, Unit &unit);
>  
> -      uint32_t getPrintfNum(void) const {
> +      uint32_t getPrintfNum(void) const
> +      {
>          return fmts.size();
>        }
>  
> -      uint32_t getPrintfSizeOfSize(void) const {
> +      uint32_t getPrintfSizeOfSize(void) const
> +      {
>          return sizeOfSize;
>        }
>  
> -      uint32_t getPrintfBufferElementSize(uint32_t i) {
> +      uint32_t getPrintfBufferElementSize(uint32_t i)
> +      {
>          PrintfSlot* slot = slots[i];
>          switch (slot->state->conversion_specifier) {
>            case PRINTF_CONVERSION_I:
> @@ -189,6 +211,8 @@ namespace gbe
>        vector<PrintfFmt> fmts;
>        vector<PrintfSlot*> slots;
>        uint32_t sizeOfSize; // Total sizeof size.
> +      friend struct LockOutput;
> +      static pthread_mutex_t lock;
>        GBE_CLASS(PrintfSet);
>      };
>    } /* namespace ir */
> -- 
> 1.8.3.2
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list